实验吧-你真的会PHP吗
实验吧这道题让我成功知道自己真的不会php。。。。。。
开始就卡住了,点开链接出现的是
题目然后就抓包嘛,结果在response里找到了hint
hint: 6c525af4059b4fe7d8c33a.txt结果半天不知道怎么访问这个文件,,,最后发现只用url里访问就行了
```
<?php
$info = "";
$req = [];
$flag="xxxxxxxxxx";
ini_set("display_error", false);
error_reporting(0);
if(!isset($_POST['number'])){
header("hint:6c525af4059b4fe7d8c33a.txt");
die("have a fun!!");
}
foreach([$_POST] as $global_var) {
foreach($global_var as $key => $value) {
$value = trim($value);
is_string($value) && $req[$key] = addslashes($value);
}
}
function is_palindrome_number($number) {
$number = strval($number);
$i = 0;
$j = strlen($number) - 1;
while($i < $j) {
if($number[$i] !== $number[$j]) {
return false;
}
$i++;
$j--;
}
return true;
}
if(is_numeric($_REQUEST['number'])){
$info="sorry, you cann't input a number!";
}elseif($req['number']!=strval(intval($req['number']))){
$info = "number must be equal to it's integer!! ";
}else{
$value1 = intval($req["number"]);
$value2 = intval(strrev($req["number"]));
if($value1!=$value2){
$info="no, this is not a palindrome number!";
}else{
if(is_palindrome_number($req["number"])){
$info = "nice! {$value1} is a palindrome number!";
}else{
$info=$flag;
}
}
}
```
源码可以自己去看,总结下来几个条件比较清晰:
条件一: 提交的number不能是数字
条件二: 输入的数和他整数的返回值相等
条件三: 需要value1和value2相等,value2是反序的value1,所以就是要求是回文数
条件四:用is_palindrome_number()这个函数检测 number,需要number不是回文数
(此处涉及到intval()化整函数与strrev()反序函数,很有意思)
代码审计题总是给出这种看似自相矛盾的条件,实际上还是得从函数的漏洞入手。
第一,二个条件,可以用到%00放在payload中,number就不是数字
第三四个条件则有不同思路,比如说运用到0:
intval()返回的0.00还是0
0的反序也是0
用上科学记数法与小数点可以混过回文的判断
因此payload: number=0.00%00 或者是 0e00%00.
post方法提交得flag即可
最后仍有一点疑问:之前在网上找到的wp大都用了另一种方法:构造出number=2147483647%00,因为抓包时发现服务器是32位的, 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。因此intval()返回的整数最大为2147483647,恰好其逆序比自己大,因此逆序取整还是2147483647,妙啊。
但,这个方法现在不行了。。。
难道是换服务器了?那就不得而知了。。。