标签:报错 == 例题 mic 正是 接受 image 代码 one
这里我讲解以下php的两个函数吧:
is_numberic():就是判断括号里面的变量是不是数值
漏洞绕过:is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。
int strcmp ( string $str1 , string $str2 )
参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
可知,传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会有怎么样的行为呢?实际上,当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0 ,
也就是虽然报了错,但却判定其相等
strcmp函数漏洞:strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值0,正是利用这点进行绕过。
比如:
如下这段代码
define(‘FLAG‘,‘pwnhub{this_is_flag}‘);
if(strcmp($_GET[‘flag‘],FLAG) == 0){
echo "success,flag:".FLAG;
}
脚本意思是get到的flag和FLAG的值相等,就可以得到FLAG,但我们都不知道flag值是什么,利用strcmp函数特点尝试使用数组绕过。令flag[]=xxx
flag[]=xxx 》》 strcmp比较出错 》》返回null 》》null==0 》》条件成立得到flag
下面来个例题吧:
实验环境:http://3fda030e-b2a0-497e-bb1c-a95653a083f7.node4.buuoj.cn/pay.php
我们打开这个页面会发现一段源代码
<!--
~~~post money and password~~~
if (isset($_POST[‘password‘])) {
$password = $_POST[‘password‘];
if (is_numeric($password)) {
echo "password can‘t be number</br>";
}elseif ($password == 404) {
echo "Password Right!</br>";
}
}
-->
大概意思就是:将得到的password数据赋值给$password变量,然后判断$password不是纯数字,并且得$password==404
但是在php中“==”是弱类型比较
具体可以参考这个:https://www.cnblogs.com/mrsm1th/p/6745532.html
大致举个例子吧 404xxx == 404 就是只要前面是相等的后面接什么都一样,他会自动转成相同类型
然后就是我们在burpsuite里面抓包,将user=0改为user=1,这个应该是判别你是不是CUIT用户吧,一个身份辨别。然后下面传入post参数:password=404abc&money[]=1
然后就得到我们的flag了!!
标签:报错 == 例题 mic 正是 接受 image 代码 one
原文地址:https://www.cnblogs.com/tzf1/p/14980271.html