はまやんはまやんはまやん

hamayanhamayan's blog

WebセキュリティにおけるBlind SQL Injection問題への傾向と対策

本まとめはセキュリティコンテスト(CTF)で使えるまとめを目指すのが主です。
悪用しないこと。勝手に普通のサーバで試行すると犯罪っぽいです。

Blind SQL Injection

Blind SQL Injectionとは

Blind SQL Injection | OWASP
SQL Injectionの一種で、画面上に結果が表示されていなくても、SQLの実行結果のyes/noによって情報を抜き取るもの。

たぶんlikeを使ったものが一番わかりやすい。

SELECT * FROM users WHERE pass = '[ユーザー入力部分]'

となっているときに' UNION SELECT * FROM users WHERE pass like 'a%と差し込むと、

SELECT * FROM users WHERE pass = '' UNION SELECT * FROM users WHERE pass like 'a%'

となる。こうすると、passwordがaから始めるならレコードが帰ってくることになる。
レコードがあればログイン成功、なければ失敗というシステムであれば、
パスワードがaから始まるならログイン成功
パスワードがaから始まらないならログイン失敗
というオラクルが作れたことになる。これを使って全探索すると、パスワードの全文を特定することができる。 このように実際に結果を取得できなくても、yes/noが判断できるならば情報を抜き出すことのできるテク。

  • いつ使える?
    • 基本的にはSQLiできるなら使える
  • 種類
    • Boolean-based Blind SQLi
      • 上の例で示したようなレスポンスではっきりyes/noが分かるようなもの
      • 色々な種類がある(ログインの成功失敗、HTTPレスポンスコードの違い、エラーの出る出ない、数の増減…)
    • Error-based Blind SQLi
      • PoCを見たことはないが、条件がtrueなら意図的にエラーが発生するようなSQL文を書くことで、エラーの発生有無でyes/noを判断する
    • Time-based Blind SQLi
    • Out-of-band
      • ここに書いてあるけど、よくわからない。たぶん応答じゃなくて、どっかにcurlするとかって話だと思う。
  • 参考

Blind SQLi 問題 CTF Writeups

テク

Practicalな話

実装時に気を付けること

基本的にはSQLiが使えないようにしておくのが大事。
結果が見えないからと言って油断しないこと。

(CTFじゃ使えないけど)テストツール

sqlmapでできる。
sqlmapでTime-Based Blind SQL Injectionをやってみる - こんとろーるしーこんとろーるぶい

未処理

- `SELECT ... user_id=:user_id AND $param=:param`
  - $param, :paramに任意のプロパティがinjectionできるときに、
  - `1=(SELECT 1 FROM flag WHERE hex(flag) LIKE '[調べたい先頭文字列]%') -- `
  - とすることで、`SELECT ... user_id=:user_id AND 1=(SELECT 1 FROM flag WHERE hex(flag) LIKE '[調べたい先頭文字列]%') -- `みたいになってオラクル発動
  - [CTFtime.org / m0leCon CTF 2020 Teaser / Skygenerator / Writeup](https://ctftime.org/writeup/20691)