---恢復內容開始---
實驗吧的一道題php審計題。拉下來寫一寫。
http://ctf5.shiyanbar.com/web/PHP/index.php

打開之后說have fun
那就抓包來看看吧
嗯...沒啥收獲,放在repeater里面看看

是這樣的,根據response反饋的信息,我們可以看見 hint(提示)
那就打開它看看吧

代碼審計走一波。
<?php $info = ""; $req = []; $flag="xxxxxxxxxx"; ini_set("display_error", false); error_reporting(0); if(!isset($_POST['number'])){ //注意這里post請求 1.不能為空 header("hint:6c525af4059b4fe7d8c33a.txt"); //文件頭添加hint提示。 die("have a fun!!"); // 直接就die了 } foreach([$_POST] as $global_var) { //遍歷數組 foreach($global_var as $key => $value) { $value = trim($value); //trim() 函數移除字符串兩側的空白字符或其他預定義字符。 is_string($value) && $req[$key] = addslashes($value); } } //global $var是外部$var的同名引用或者指針。 //函數 function is_palindrome_number($number) { $number = strval($number); //本函數可將數組及類之外的變量類型轉換成字符串類型。 $i = 0; $j = strlen($number) - 1;//strlen() 函數返回字符串的長度 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"])); //strrev() 函數反轉字符串。 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;
如果要拿flag,需要滿足以下條件:
1.不為空,且不能是一個數值型數字,包括小數。(由is_numeric函數判斷)
2.不能是一個回文數。(is_palindrome_number判斷)
3.該數的反轉的整數值應該和它本身的整數值相等。即:
4.post個number.
