SQLインジェクション: Natas 14 Writeup
リンク: OverTheWire Natas14
TL;DR
- 簡単なSQLインジェクションの問題
問題の確認
OverTheWireのWeb系問題集であるNatasの第14問。phpで記述されていて、下のView Sourceというリンクからphpのソースコードを見ることができる。
IDとパスワードのテキストボックスが並ぶ典型的なログイン画面。入力後にボタンを押すとログイン可否が表示される。
Exploit
ソースコードからこの問題を解くにあたって大事なところを抜粋する:
$query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"";
このコードから、ユーザーの認証に使うクエリを文字列の結合で生成していることがわかる。よって、SQLインジェクションを使うことができる。
例えば、IDに以下の通り書けばよい(パスワードは適当でOK)。
" OR 1=1;#
このように書くと、生成されるクエリは以下のようになる。
SELECT * from users where username="" OR 1=1;# and password="pass";
1=1
は常に成立するため、このクエリはすべてのアカウントにひっかかる。1つでもクエリからアカウントが出た場合ログインできる仕様のため、これでめでたくログインしflagを獲得できる。