hackme(Level2)ネタばれ注意

Level2は苦戦しました。ちょっと勉強したのでメモ。


まずは、ソース見てみました。
今回は、ヒントになりそうなものがない。


ログインする際にformからの入力値を直接ログインユーザ管理用のDBにアクセスする際のselect文にいれているかもと思った。
ちょっとその方向で試してみることにした。


こんな感じですね。($name, $passwordはformで入力されたユーザ名、パスワード)

SELECT * FROM users WHERE name = $name AND password = $password;

この文は、usersテーブルからname = $name, password = $passwordが一致する全データを取得しなさいという命令です。
WHERE以下は、条件なのでここの検索条件をTRUEにしてあげればよい。

上のSQLに対して、
$name = 任意の文字列
$password = ' OR 1 = 1 --
とかにすると

SELECT * FROM users WHERE name = '任意の文字列' AND password = ' OR 1 = 1 --';

になり、

SELECT * FROM users WHERE name = '検索条件' OR 1 = 1;

となって
WHERE以降の検索条件が常に成り立つ。
そうすると本来、想定していたロジックでは、登録されていないユーザを実行した際には、検索に一致しないのでログインNGというシーケンスを実行していたが、
検索に一致してしまうため、ログインOKのシーケンスが実行されてしまう。