你真的會php嗎
原題鏈接
http://ctf5.shiyanbar.com/web/PHP/index.php
分析
burp抓包看到響應頭中有一個hint伺通。
hint: 6c525af4059b4fe7d8c33a.txt
得到源碼
<?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); #如果value是字符串掂骏,將特殊字符加上反斜杠土浸,轉(zhuǎn)義
}
}
// 判斷是否是水仙花數(shù)(回文數(shù))
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;
}
}
}
echo $info;
代碼不算難懂姐军,邏輯上判斷一個POST的數(shù)要滿足下面四個條件:
- number要是字符串,而不是數(shù)字
- number變換為整型再變換成字符串要和原來number相等
- number不能是一個水仙花數(shù)
- number反轉(zhuǎn)要和原來相等
條件1和2矛盾吧恃,3和4矛盾嫡良。
下面有兩種辦法解決:
-
number=0e00%00
或者number=0e00%20
%00表示空字符,%20表示空格本谜,這樣滿足了字符串初家,相等。
由于0是反轉(zhuǎn)還是0,3,4也滿足溜在。 - 利用函數(shù)溢出的方法
number=2147483647%00
從這一個題目里面學到一個新點
那就是Intval最大的值取決于操作系統(tǒng)陌知。
32位系統(tǒng)最大帶符號的 integer 范圍是 -2147483648 到 2147483647。舉例掖肋,在這樣的系統(tǒng)上仆葡,intval('1000000000000')
會返回2147483647
。
所以在第三個條件的時候翻轉(zhuǎn)變成7463847412
再變成整形也是2147483647
志笼,繞過第三個條件沿盅,第四個條件也就一起繞過了。
flag
第二遍復現(xiàn)時纫溃,環(huán)境掛了腰涧。。皇耗。在自己電腦上弄得環(huán)境南窗,測試發(fā)現(xiàn)payload是正確的。
知識點
代碼審計郎楼,intval(),溢出