Olympic CTF CURLing 400 的 write up,前言可以參考 Olympic CTF 2014 CURLing 200 write up
這題也是個人覺得出的非常不錯的題目之一,要解開必須很熟悉 PHP 的特性以及攻擊手法才能解開這道題目,網址打開是一個白畫面,有個 PHP 的錯誤訊息
Notice: Undefined index: rpc_json_call in /var/www/index.php on line 27
有再寫 PHP 的同學應該馬上可以知道這個 Notice 這是少了一個 GPC 參數的警告,所以我們可以自己補上 POST
rpc_json_call=blablalba
哦,會發現錯誤訊息變了,Google 搜尋一下 JSON RPC 的標準,照著標準送出
rpc_json_call={“jsonrpc”: “2.0”, “method”: “subtract”, “params”: [42, 23], “id”: 1}
會發現錯誤訊息又變了。 哦?不正確的 method 名稱? 這時候可以猜測 method 名稱,不過笨蛋才會亂猜 :p 有範圍的猜測會比盲目的亂猜好太多,如果對 PHP 夠了解,會知道 PHP class 上都會有一些 Magic Method 存在,經過測試會發現 __construct
以及 __wakeup
是可以使用的!
送出:
rpc_json_call={“jsonrpc”: “2.0”, “method”: “__construct”, “params”:[1,2], “id”: 1}
錯誤訊息又變了! 不過從這次的錯誤訊息中可以得到資訊,知道了 __construct
的參數有三個,log_dir
, debug
, 以及 state
,一樣偽造這三個參數的值後送出
rpc_json_call={“jsonrpc”: “2.0”, “method”: “__construct”, “params”:{“log_dir”:”aa”, “debug”:true, “state”: “foo”}, “id”: 1}
發現是白畫面T____T
到這邊卡住了一下,也許 __construct
只是去設定了 log_dir
, debug
以及 state
這三個參數並沒有其他動作,所以是不是能在一個 reuqest 內執行兩次 JSON RPC CALL 呢(?
沒有翻得很勤勞不過猜測在一個 array 內送兩個 json hash 竟然可以XDDD
1 | rpc\_json\_call=[ |
哦,loged ? 啊是 log 三小XDDDD 把 log_dir
參數改一下改成 /var/www
看看
竟然說 permission denied XD 那嘗試 /tmp/
呢?
看來是真的可以寫檔,那它寫了什麼呢? 可以用 out-of-bound 的方法利用 PHP 支援的 wrapper 把內容給寫出來(PHP 支援的話甚至可以用 except://ls
執行指令)。 利用 php://output
可以把內容寫到網頁上:
原來寫了一個 serialize 過後的 PHP Object 進去,難怪會用到 __wakeup
的 magic method,所以我們可以嘗試把 webshell 寫到 /var/www/ 內
不過因為 server 的設定,似乎每隔一秒會定時把 /var/www
的檔案清掉,所以如果手速不夠快會一直以為自己沒有寫成功 (哭哭T___T)
所以寫個 script 搞定!
執行 ls -alh
執行 cat /FLAG
CTF{b15ffee30a117f418d1cede6faa57778}
<( ̄︶ ̄)>