SQLインジェクション: Natas 14 Writeup

リンク: OverTheWire Natas14

TL;DR

問題の確認

OverTheWireのWeb系問題集であるNatasの第14問。phpで記述されていて、下のView Sourceというリンクからphpソースコードを見ることができる。

f:id:Asakaze:20201029191428j:plain

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を獲得できる。