CTFのためのSQLインジェクション

SQLインジェクションとは

「SQL注入(SQL injection)」は、パラメータを埋め込んでSQL文を組み立てる場合、そのパラメータに特殊記号(記号)を含ませたSQLコマンドを与えることによって、データベースの不正操作が可能となってしまう問題である。
引用:IPA ISEC セキュア・プログラミング講座:Webアプリケーション編 第6章 入力・注入対策:SQL注入攻撃: #1 実装における対策

ソフトウェアが外部からの入力内容を上位コンポーネントを通じて使用し、その内容からSQLコマンドを構築している場合において、意図しているSQLコマンドを改ざんできてしまう特殊な要素を、適切に無効化せずに下位コンポーネントに送信する際に発生する脆弱性です。
引用:CWE-89

ksnctfのQ6をSQLインジェクションで解く

ksnctf - 6 Login

  • ログイン画面が出てくるが、開発者ツールでHTMLやネットワークを見る限り手がかりがない
  • ログイン画面にSQLインジェクションを仕掛ける

攻撃フロー1

  1. (おそらく)認証で実行されるSQLクエリは以下のとおり
    1
    SELECT uid FROM account_table WHERE uid='ユーザID' AND pw='パスワード'
  2. ここに、「’ OR 1=1–」 となるクエリを送信すると実行されるクエリは以下のようになる
    1
    SELECT uid FROM account_table WHERE uid='' OR 1=1--' AND pw='任意の文字列'
  3. 「’ OR 1=1–」によって、検索条件に関わらず結果が真になり、「–」の部分以下はコメントとされ、読み込まれない
  4. 結果、どんなユーザであってもログインに成功する

攻撃フロー2

  1. 攻撃フロー1の結果、Adminのパスワードがフラグになっていることがわかったので、これを調べるためにブラインドSQLインジェクションという方法を使う
    具体的には、SQLインジェクションを利用して、パスワードを総当たり的に一文字ずつ埋めていく方法

参考リスト

Web

Document