PHP 黑魔法
弱比较
若字符串以数字开头,则取开头数字作为转换结果,若无则输出0
<?php
echo "---------------- 弱比较黑魔法 -------------------------";
echo "<br>";echo "<br>";
if (1 == "1abc") {
if (0 == "abc") {
if ("0e132456789" == "0e7124511451155") {
#常见于md5弱比较绕过
echo "两个'=='的弱比较成功";
}
}
}
md5(),sha1()
md5()是不能处理数组的,md5(数组)会返回null,两个null相等绕过
sha1()也是同理
<?php
echo "---------------- md5(),sha1()黑魔法 -------------------------";
echo "<br>";echo "<br>";
if (md5($md5_bug1[]=1) === md5($md5_bug2[]=1)){
if (sha1($md5_bug1[]=1) === sha1($md5_bug2[]=1)){
echo "md5传入数组绕过成功";
}
}
转换
php会自动进行转换,比如16进制,科学计数法等,有时也用这点绕过
<?php
echo "---------------- 转换黑魔法 -------------------------";
echo "<br>";echo "<br>";
echo "0x1e240 自动转换10进制:",0x1e240;
echo "<br>";
echo "123456 十进制数:",123456;
echo "<br>";
echo "1e240 科学计数法自动转换:",1e240;
---------------- 转换黑魔法 -------------------------<br><br>0x1e240 自动转换10进制:123456<br>123456 十进制数:123456<br>1e240 科学计数法自动转换:1.0E+240
strcmp()
int strcmp ( string $str1 , string $str2 )
参数 str1第一个字符串。str2第二个字符串。
如果 str1 小于 str2 返回 < 0;
如果 str1 大于 str2 返回 > 0;
如果两者相等,返回 0。
strcmp()函数只有在相等的情况下返回0。
php在5.3版本之前若传入的是一个非字符串类型数据,比如数组和对象,则会报错,但在报错的同时会返回0,那么我们传入一个数组,它会返回NULL,而判断使用了== ,但是NULL==0是bool(true),这样就成功绕过。
<?php
echo "---------------- strcmp()黑魔法 -------------------------";
echo "<br>";echo "<br>";
$strcmp_bug[]=1;
if (@strcmp($strcmp_bug, "you_don't_know_this_string") == 0){
echo