君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

【CTF】サーバをハックする〜Simple Auth IIとSQLiteと〜

f:id:karoten512:20180322104803j:plain

いきさつ

セキュリティの勉強も兼ねてCTFの問題を解いてみた。

サーバをハックするより前にソースコードが見えているので

ハックするような大したことはしていない。

問題

ksnctf.sweetduet.info

20ptなので超簡単ということだが。。。?

考えたこと

ログイン画面

f:id:karoten512:20180322104951p:plain

適当なID&パスワードを入れ、ログインしてみる。

f:id:karoten512:20180322105024p:plain

ソースコード

<?php

function h($s)
{
    return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}

if (!isset($_POST['id']) or !is_string($_POST['id']))
    $_POST['id'] = '';
if (!isset($_POST['password']) or !is_string($_POST['password']))
    $_POST['password'] = '';

$try = false;
$ok = false;

if ($_POST['id']!=='' or $_POST['password']!=='')
{
    $try = true;
    $db = new PDO('sqlite:database.db');
    $s = $db->prepare('SELECT * FROM user WHERE id=? AND password=?');
    $s->execute(array($_POST['id'], $_POST['password']));
    $ok = $s->fetch() !== false;
}

postされたidとpasswordでuserテーブルを検索、

該当レコードが存在する場合はログイン成功ということらしい。

SQLインジェクション使える?→使えないよね

プリペアドステートメントを使用しているので、

execute内に渡された値はエスケープされる。

この時点で

やれることがなくなってしまった。。。

ググる

timeislong.hatenablog.com

この記事をみると、

「ダウンロード」という言葉がある。

どういうこと?

SQLiteについて調べる

どうやらSQLiteのDB情報は、

****.dbというファイル形式で保存されるらしい。

そして、

<?php
//...

$db = new PDO('sqlite:database.db');

このsqliteの後で指定されているのはDBのファイルで、

相対パス指定されているということらしい。

DBファイルをダウンロード

sourceのurlのauth.phpの部分を、database.dbに変えるとDBファイルがダウンロードできる。

(普通じゃ考えられないけど)

SQLiteで読み込む

$ sqlite3 ~/Downloads/database.db 
sqlite>

適当なsqlを発行

phpソースコードから、userテーブルが有ることがわかっているので、

selectで全部持ってくる。

sqlite> select * from user;
root|FLAG_****

でてきた。

まとめ

この手の問題を特には様々な知識が求められる。

今回で言えば、

などなど。

なかなか勉強になった。