一、PHP弱类型 is_numeric()
输入:127.0.0.1/BWVS/bug/php/code.php
# 1、源代码分析
如果num不是数字,那么就输出num,同时如果num==1,就输出flag。即num要是字符串又要是数字
# 2、函数分析:
is_numeric()函数:函数用于检测变量是否为数字或数字字符串。如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回空值,即 FALSE。
立刻想到PHP的弱类型比较,构造payload:?num=1shu
# 3、payload解析:
1shu不是数字或数字字符串则返回false,!false为ture 输出num。php弱类型会自动将第一位为数字的字符串为该数字的值,否则为值0。所以1shu会被解析为1==1。成功返回flag
# 二、strcmp函数缺陷
# 1、理论知识
1、strcmp(str1,str2)函数用来字符串的比较,当str1 < str2时 返回小于0 ,str1 > str2时返回>0的数,str1 == str2时返回 等于0
2、但是他不能判断数组,直接返回flase
所以可以直接构造payload: ?password[]=1 查看源代码 /bug/php/md5.php
# 2、代码分析
<?php
include_once('../../bwvs_config/sys_config.php');
require_once('../../header.php');
$password=$_GET['password'];
if(strcmp('21232f297a57a5a743894a0e4a801fc3',$password)){ //当password==21232f297a57a5a743894a0e4a801fc3 时相等 为false
echo 'password is false ! ! ! ! !';
}else{
echo 'flag is here!!<br>';
echo 'flag{挑战成功}';
}
?>
<?php
require_once('../info.php');
?>
发现当password为这串字符串时,即?password=21232f297a57a5a743894a0e4a801fc3时,也能得到flag