strcmp字符串比较绕过

strcmp() 函数

strcmp() 函数比较两个字符串,且区分大小写 。

语法:strcmp(string1,string2)

返回值:

1
2
3
0 - 如果两个字符串相等
<0 - 如果 string1 小于 string2
>0 - 如果 string1 大于 string2

实例:

1
2
3
4
5
<?php
echo strcmp("Hello","Hello"); // 返回0
echo "<br>";
echo strcmp("Hello","hELLo"); // 返回-1
?>

strcmp() 函数漏洞

注:这一个漏洞适用与5.3之前版本的php

题目代码:

1
2
3
4
5
6
7
8
9
<?php
$flag = "flag{xxxxx}";
if (isset($_GET['a'])) {
if (strcmp($_GET['a'], $flag) == 0)
die('Flag: '.$flag);
else
print 'No';
}
?>

使用GET方法获取参数a,使用strcmp()函数比较$flag与用户输入的值。

传入的期望类型是字符串类型的数据 ,但是这个函数当接受到不符合字符串类型的参数就会发生错误,并返回0

所以我们只需要提交一个非字符串类型的参数即可使得判断条件成立,比如使用数组类型

解题方法:

GET请求:?a[]=2

因为strcmp()无法比较数组,则报错并返回0,0==0成立,则输出flag。