PHP代码审计-PHP弱比较绕过

网络安全·代码审计 · 2023-09-28 · 1089 人浏览

一、定义

PHP中的弱比较运算符,可以实现一些比较奇怪的比较方法,常见于各种CTF题目的绕过中,使用两个等号 == 比较,只比较值,不比较类型。

二、字符串与数字

php中其中两种比较符号:
\=\=:先将字符串类型转化成相同,再比较
\=\=\=:先判断两种字符串的类型是否相等,再比较
字符串和数字比较使用\=\=时,字符串会先转换为数字类型再比较
var_dump('a' == 0);//true,此时a字符串类型转化成数字,因为a字符串开头中没有找到数字,所以转换为0
var_dump('123a' == 123);//true,这里'123a'会被转换为123
var_dump('a123' == 123);//false,因为php中有这样一个规定:字符串的开始部分决定了它的值,如果该字符串以合法的数字开始,则使用该数字至和它连续的最后一个数字结束,否则其比较时整体值为0。
举例:
var_dump('123a1' == 123);//true
var_dump('1233a' == 123);//false
<、>、<=、>=都存在和\=\=相同的弱类型,原理相同!!!

三、布尔true与任意值

var_dump(True == 0);    //bool(false)
var_dump(True == 'False');    //bool(true)
var_dump(True == 2);    //bool(true)

四、hash值和字符串“0”

$str1 = "a";
echo md5($str1);    //0cc175b9c0f1b6a831c399e269772661
var_dump(md5($str1) == '0');    //bool(false)
---------------------------------------------------------
$str2 = "s224534898e";
echo md5($str2);    //0e420233178946742799316739797882
var_dump(md5($str2) == '0');    //bool(true)
---------------------------------------------------------
$str3 = 'a1b2edaced';
echo md5($str3);    //0e45ea817f33691a3dd1f46af81166c4bool
var_dump(md5($str3) == '0');    //bool(false)
---------------------------------------------------------
var_dump('0e111111111111' == '0');    //bool(true) 

本质上是科学计数法与0的比较,0e开头的、后面为数字的字符串会被当做科学计数法进行解析,0的不论多少次幂都为0。

五、strcmp函数

strcmp(s1,s2)
说明:

当s1<s2时,返回为负数 注意不一定是-1,测试结果是比较字符串长度
当s1\=\=s2时,返回值= 0
当s1>s2时,返回正数 注意不一定是1,测试结果是比较字符串长度
如果两个字符串不同等,但是字符串长度相同,就比较从哪一位开始不同的,然后比较那一位的大小。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如:
"A"<"B" "a">"A" "computer">"compare"
特别注意:strcmp(const char *s1,const char * s2)这里面只能比较字符串,不能比较数组形式的参数,如果出现了数组,则会retrun null,有些题目就是利用这一点来进行和0的完成比较。

PHP 代码审计 1089 Views
本站已在互联网运行了 Theme Jasmine by Kent Liao