跳转至

一、要求变量原值不同但 md5 或 sha1 相同的情况下

1.0e 开头的全部相等(== 判断)

240610708 和 QNKCDZO md5 值类型相似,但并不相同,在”==” 相等操作符的运算下,结果返回了 true.

Md5 和 sha1 一样

2. 利用数组绕过(=== 判断)

Md5 和 sha1 对一个数组进行加密将返回 NULL;而 NULL===NULL 返回 true,所以可绕过判断。

二、Strcmp 利用数组绕过

查看 php 的手册

int strcmp ( string $str1 , string $str2 )
返回值 
如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

当输入的两个值为不是字符串时就会产生不预期的返回值:

<?php

$password = $_GET['password'];

if (strcmp('miao', $password)) {
    echo 'false!';
} else {
    echo 'success!';
}
?>

这样一段代码中,输入 password[]=1 则返回 success,成功绕过验证

三、当有两个 is_numeric 判断并用 and 连接时,and 后面的 is_numeric 可以绕过

<?php
$a = $_GET['a'];
$b = $_GET['b'];
$c = is_numeric($a) and is_numeric($b);
var_dump(is_numeric($a));
var_dump(is_numeric($b));
var_dump($c);  //$b可以不是数字,同样返回true
$test = false and true;
var_dump($test); //返回true

四、NULL,0,”0″,array() 使用 == 和 false 比较时,都是会返回 true 的

五、Eregi 匹配

  • 数组绕过

ereg 是处理字符串,传入数组之后,ereg 是返回 NULL

  • %00 截断绕过

六、接收参数 $a 得存在,并且 $a==0 可用. 绕过(非数字都可绕过)

<?php
$a = $_GET['a'];
if ($a == 0) {
    echo "1";
}
if ($a) {
    echo "miao";
}

七、接收参数中不能出现某一字符,但下面又必须使用可以 php:// 伪协议绕过

目前遇到的是 file_get_contents 其他情况具体而定

八、is_numeric 绕过

空格、\t、\n、\r、\v、\f、+、- 能够出现在参数开头,“点” 能够在参数任何位置,E、e 只能出现在参数中间。

九、php5.3.29, 这里可以直接用 %0b 绕过 s(空白字符)的匹配

十、既是 0 又是 1 的情况

$a==1&$test[$a]=t 时

  • php 精度(16 以上)var_dump(9999999999999999999==1);//true
  • 科学计数法 .1e1 echo $b['.1e1']// 输出 t

'点' 是字符串所以在数组里面变成 0,但在 is_numeric 中有 '点' 则正常输出为数字

十一、当 switch 没有 break 时可以继续往下执行

<?php
if (isset ($_GET ['miao'])) {
    $which = $_GET ['miao'];
    switch ($which) {
        case 0 :
        case 1 :
        case 2 :
            require_once $which . '.php';
            break;
        default :
            echo "1";
            break;
    }
}

让我们包含当前目录中的 miao 文件,这里会发现在 case 0 和 case 1 的时候,没有 break,按照常规思维,应该是 0 比较不成功,进入比较 1,然后比较 2,再然后进入 default,但是事实却不是这样,事实上,在 case 0 的时候,进入了 case 0 的方法体,但是却没有 break,这个时候,默认判断已经比较成功了,而如果匹配成功之后,会继续执行后面的语句,这个时候,是不会再继续进行任何判断的。也就是说,我们 which 传入 solution 的时候,case 0 比较进入了方法体,但是没有 break,默认已经匹配成功,往下执行不再判断,进入 2 的时候,执行了 require_once miao.php,查阅资料之后发现, 这个黑魔法是继承于 C 语言