Web

昨日に引き続きCSAW CTFのwriteupです。
今日はWebです。

Web-100

問題文
http://128.238.66.216/c4ca4238a0b923820dcc509a6f75849b/
Lara Anderton needs to break into PreCrime to free her husband, but they just installed a fancy new security system. Help her break into it!

この問題は色々やったんですが解けませんでした。
まず、"Lara Anderton"とか"PreCrime"という単語で調べるとwikipedia:マイノリティ・リポートに関係あることがわかります。
この映画を見たことはありませんが、主人公の名前がJohn Andertonで、捕まった主人公を助けるために妻のLaraが主人公の眼球を使って認証を通り、監獄へ入るシーン?があるようです。
また、上記のURLへアクセスすると下記のような表示とユーザ名、パスワードの入力を求める画面になりました。

 *Eyeballs.*
 と
 You're not authorized. How did you get in here?

しばらく適当にユーザ名入れたりしているうちに、クッキーがセットされているのに気づきました。
AuthとUserがあり、それぞれ"0"と"Lara Anderton"がセットされています。
これはもらった!とAuthを"1"に、Userを"John Anderton"にしましたがダメでした。
そしてこのあとは迷走して結局あきらめました。
いま他のチームのwriteup見て確認したら、Authを"1"に、Userを"Admin"にするのが正解だったようです。
下手に調べたのが裏目に出たパターンというか、基本的なAdminぐらい試せばよかったのにと悔やまれます。
参考にしました:http://eindbazen.net/2012/09/csaw-2012-web-100/

Web-200

問題文
http://128.238.66.216/c81e728d9d4c2f636f067f89cc14862c/

今はアクセス出来ないですが、上記URLにアクセスするとディレクトリ内のファイル一覧が表示されました。
内容は下記の通りです。

login.php
login.phps
mysql.php
register.php
reset.php

上記のうち、login.php, register.php, reset.phpはそれぞれログイン画面(ユーザ名、パスワード入力)、登録画面(ユーザ名、パスワード入力→登録成功するとメッセージあり)、リセット画面(リセット成功するとメッセージあり)だと名前と表示および動作から判断しました。
mysql.phpはアクセスしても何も表示されませんでした。
そしてlogin.phpsはこんなかんじです。

<?php
    $good = true;
    include('mysql.php');
    $key = 'key{...}';
    $auth = false;
    $admin = false;
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $mysql->real_query('SELECT * FROM `csaw`.`users` WHERE `user` LIKE "' . $mysql->real_escape_string($_POST['user']) . '";');
        if ($mysql->errno != 0) {
            echo('Error.');
        } else {
            $result = $mysql->store_result();
            while ($row = $result->fetch_assoc()) {
                if ( $_POST['pass'] == $row['pass'] ) {
                    $auth = true;
                }
                if ( $row['user'] == 'Administrator' ) {
                    $admin = true;
                }
            }
        }
        if ( $auth && $admin ) {
            echo( $key );
        }
    }
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>CSAW</title>
</head>
<body>
    <h1>LOGIN</h1>
    <form method="post" action="login.php">
        <input type="text" name="user" placeholder="user" />
        <input type="text" name="pass" placeholder="pass" />
        <button type="submit">LOGIN</button>
    </form>
</body>
</html>

これがlogin.phpと同内容なのだろうと考えつつSQL部分を見ていきます。
SELECT文でLIKEを使って検索しているので、ユーザ名として例えば"Administrator"を入れると"Administratora"や"Administratorb"等の(もちろんそれらのユーザレコードが存在すればですが)"Administrator"という文字列を含む複数のユーザのレコードが引っかかります。
そして下の方のwhile文でその結果をフェッチして、それぞれのレコードでパスワードがあってるか、レコードのユーザ名がAdministratorかをチェックしてフラグを立てています。
ですが、複数のレコードが返るので一つのレコードで両方の条件を満たす必要がなく、"Administrator"を含むユーザ名で新しくユーザを作成すればkeyが表示されそうです。

$mysql->real_query('SELECT * FROM `csaw`.`users` WHERE `user` LIKE "' . $mysql->real_escape_string($_POST['user']) . '";');

register.phpでユーザ名"Administratora"、パスワード"a"のユーザを作成してlogin.phpでログインをすると答えが表示されました。
答え:6e6a5f85aa6880aa3d4bd1f0477b149d

Web-300

一部のページのphpSQLインジェクション的なものがあることにチームメンバーが気づきましたが、
そのあと僕にはどうにも出来ませんでした・・・。

Web-400

Web-500

Web-600

手も足も出ませんでした・・・。
不甲斐ないwriteupですみません。
明日も続きます。