題目鏈接:http://123.206.87.240:8006/test/hello.php
進入頁面,界面啥也沒有,讓后打開源碼看看,發現這一行的注釋
所以就訪問http://123.206.87.240:8006/test/1p.html,然后變成。。。。
很明顯的,頁面經過了跳轉,location重定向到www.bugku.com。於是通過bp抓包,得到響應
經過加密處理的js函數,去掉前面的重定向,我們在控制台跑一下
得到了base64加密的一串字符串,兩次解密,一次base64,一次url
得到js函數
";if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
require("f4l2a3g.txt");
}
else
{
print "never never never give up !!!";
}
這時候直接訪問:http://123.206.87.240:8006/test/f4l2a3g.txt 可以得到flag。我們還是深究一下
- 第 1 行:限制 URL 查詢字符串中必須有非空非零變量
id
- 第 9 行:限制變量
$a
中不能含有字符.
- 第 15 行:要滿足以下 5 條表達式才會爆 flag:
- 變量
$data
弱等於字符串bugku is a nice plateform!
- 變量
$id
弱等於整型數 0 - 變量
$b
的長度大於 5 - 字符串
1114
要與字符串111
連接變量$b
的第一個字符構成的正則表達式匹配 - 變量
$b
的第一個字符弱不等於整型數 4
- 變量
1.弱比較
$id=“0xd” 0開頭的字符串和整型比較會轉化為0
2.PHP偽協議
源碼中變量 $data
是由 file_get_contents()
函數讀取變量 $a
的值而得,所以 $a
的值必須為數據流。在服務器中自定義一個內容為 bugku is a nice plateform!
文件,再把此文件路徑賦值給 $a
,顯然不太現實。因此這里用偽協議 php:// 來訪問輸入輸出的數據流,其中 php://input
可以訪問原始請求數據中的只讀流。這里令 $a = "php://input"
,並在請求主體中使用POST提交字符串 bugku is a nice plateform!
3.eregi() 截斷漏洞
ereg()
函數或 eregi()
函數存在空字符截斷漏洞,即參數中的正則表達式或待匹配字符串遇到空字符則截斷丟棄后面的數據。
源碼中待匹配字符串(第二個參數)已確定為 "1114"
,正則表達式(第一個參數)由 "111"
連接 $b
的第一個字符組成,若令 substr($b,0,1) = "\x00"
,即滿足 "1114"
與 "111"
匹配。因此,這里假設 $b = "\x0012345"
,才能滿足以上三個條件。