Olympic CTF 2014 CURLing 400 write up

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
2
3
4
rpc\_json\_call=[
{"jsonrpc": "2.0", "method": "__construct", "params":{"log_dir":"aa", "debug":true, "state": "foo"}, "id": 1},
{"jsonrpc": "2.0", "method": "__wakeup", "params":{}, "id": 1}
]

哦,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}

<( ̄︶ ̄)>