Day23
never give up
http://123.206.87.240:8006/test/hello.php

本題要點:url編碼,base64編碼,代碼審計,php函數
查看源碼~

訪問1p.html
http://123.206.87.240:8006/test/1p.html
發現時bugku主頁
查看一下源碼
view-source:http://123.206.87.240:8006/test/1p.html

url解碼得到:
<script>window.location.href='
http://www.bugku.com';</script>
<!--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ==-->
發現還有一層base64
解密

又是一層url~
繼續解密
發現是這樣的一段代碼
<!--";if(!$_GET['id'])
#限制 URL 查詢字符串中必須有非空非零變量 id
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
#限制變量 $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)
#要滿足以下 5 條表達式才會爆 flag(見代碼后面)
#變量 $data 弱等於字符串 bugku is a nice plateform!
{
require("f4l2a3g.txt");
}
else
{
print "never never never give up !!!";
}
?>-->
5條表達式~
- 變量 $id 弱等於整型數 0
- 變量 $b 的長度大於 5
- 字符串 1114 要與字符串 111 連接變量 $b 的第一個字符構成的正則表達式匹配
- 變量 $b 的第一個字符弱不等於整型數 4
- 變量 $data 弱等於字符串 bugku is a nice plateform!
查一下php的手冊,https://php.net/manual/zh/types.comparisons.php

PHP 偽協議
php:// - 訪問各種I / O流
查一下php的手冊~~~
參考:https://www.php.net/manual/en/wrappers.php.php
源碼中變量 $data 是由 file_get_contents() 函數讀取變量 $a 的值而得,所以 $a 的值必須為數據流。
在服務器中自定義一個內容為 bugku is a nice plateform! 文件,再把此文件路徑賦值給 $a,顯然不太靠譜。
因此這里用偽協議 php:// 來訪問輸入輸出的數據流,其中 php://input可以訪問原始請求數據中的只讀流。
這里令 $a = "php://input",並在請求主體中提交字符串 bugku is a nice plateform!。
再次需要查查php手冊了~~
參考:https://php.net/manual/en/function.eregi.php
eregi() 截斷漏洞
ereg() 函數或 eregi() 函數存在空字符截斷漏洞,即參數中的正則表達式或待匹配字符串遇到空字符則截斷丟棄后面的數據。
源碼中待匹配字符串(第二個參數)已確定為 "1114",正則表達式(第一個參數)由 "111" 連接 $b 的第一個字符組成,若令 substr($b,0,1) = "\x00",即滿足 "1114" 與 "111"匹配。因此,這里假設 $b = "\x0012345",才能滿足條件。
回到題目中
構造 payload
分析出以上三個變量應該等於什么值之后
接下來構造出對應的 payload 去 拿flag 了。
注意一點~
在構造變量 b 中的空字符時,過早將空字符 \x00 放入,在提交請求時導致請求頭截斷,繼而請求失敗,得不到響應。
因為

所以構造下面語句

或者有一種投機取巧的方法,直接訪問~

完成!
參考資料:
https://php.net/manual/zh/types.comparisons.php
https://www.php.net/manual/en/wrappers.php.php
https://php.net/manual/en/function.eregi.php