fc2ブログ

makopi23のブログ

makopi23が日々の生活で感じたことを気ままに綴るブログです。

SQLアンチパターン読書会 「SQLインジェクション」に参加しました

2014/7/3(木) SQLアンチパターン読書会 「SQLインジェクション」に参加してきました。

DoorKeeper
http://sqlap.doorkeeper.jp/events/12751

以下の書籍をターゲットとした読書会なのです。

SQLアンチパターンSQLアンチパターン
(2013/01/26)
Bill Karwin

商品詳細を見る


場所はいつもの湯島、株式会社アルティネットさんです。
いつも会場提供ありがとうございます。

参加者は9人かな。全員おなじみの方ばっかです。
この日は20章「SQLインジェクション」がターゲットでした。


■ 発表
今回は @setoazusa さんが発表担当でした。
オフレコな内容満載ということで、非公開とのこと!ワロタw



■ディスカッション
今回もディスカッションしたいネタをみんなで付箋に書き出しました。
20140703_sqlap1.jpg

以下、復習用のメモ~
---

■ SQLインジェクションもろもろ
  • GitHubの普及により、SQLインジェクションの脆弱性があるコードを気軽に検索できる時代になっている。
  • (ここで @setoazusa さんがGitHubから探してきたコードを晒す!やべぇ・・・)
  • ORMが普及しているが、ORMの使用は強制できない。よって、executeQueryを直接呼び出すコードを完全には防げない。
  • エラーメッセージをエラー画面で表示させるようにしていると、SQLの情報から攻撃者にヒントを与えることになる。


■ ブラインドSQLインジェクション
  • Information SchemaとJOINして、スキーマ構造(システムに存在するテーブル名など)を先に抜いてからアタックする手法。
  • DBMSによってInformation Schemaを抜く構文は決まるので、候補はDBMSの数パターンに絞れる。
  • 参考: @IT 深刻な「ブラインドSQLインジェクション」の脅威


■ セカンドオーダーSQLインジェクション
  • 20.3節の"「ルール31」:後部座席に気をつけよう"の例が該当する。
  • 入力した時点ですぐに効力を発揮せずに、次にアプリケーションで利用されたときに効力を発揮するようにする攻撃のこと。
  • 画面から入力された値がいったんDBに格納され、その値を元にSQLを動的に組み立てるような場合に発動する。


■ 脆弱性診断ツール
  • 脆弱性が無いにもかかわらず有りと判定する、偽陽性(False Negative)なツールが多い。
    • DBやプログラムをブラックボックスとして扱わざるを得ないため。
  • 診断ツールを掛ける際、探査シナリオで状態爆発することがある点に注意。
  • 診断ツールに探査させるときは、ログレベルをDebugからInfoにするなどしないと、ログが膨大に出力されて爆発する。
  • FindBugsなどの静的解析ツールやWAF/IPSも偽陽性なものが多い。


■ 動的IPアドレスを使った攻撃
  • 動的IPアドレス使った攻撃は、攻撃のたびにIPアドレスが変わるので、攻撃元の見分けがつかない。
  • 動的IPアドレスのおかげで一般人が巻き添えを食らう。


■ 値のエスケープ
  • 引用符文字を2つ重ねるのと、バックスラッシュを使用するのは、同じ効果。
  • MySQLはバッククォートもエスケープで使用する。
  • P.223の例で、カラム「account_id」が数値型だった場合、引用符文字列で囲んで'123 OR TURE'のようにしてしまうと、比較の成否はDBMS依存になってしまう。
  • ちゃんとキャストしましょう。


■ SQLインジェクションの早期検知
  • まず権限を絞り、WebアプリからアクセスするユーザにはInformation Schemaにアクセスできないよう制限をかける。
  • deleteなど、想定外の構文が使用された場合は検知できるようにしておく。
  • まず規約で絞りましょう。
  • 静的解析ツールでも生SQLを発行しているプログラムはチェックできる。
  • 高価な代金を支払ってチェックツールを導入したり、コンサルテーションをお願いしたりすることもある。
  • NDA契約を結んで、セキュリティの有識者にソースコードをレビューしてもらうのも有効。徳丸さんとか。
  • セキュリティの検証は、テスト環境でやるか本番環境でやるかで、価格が全然違ってきたりする。
  • ソーシャルゲームとかの開発はスピード重視で、3ヶ月で打ち切りとかもあるので、ぜんぜん検証しないこともある。
  • Brakeman PluginというJenkinsのプラグインがあり、Webアプリの脆弱性をチェックしてくれる。


■ 20.5.4 ユーザの入力をコードから隔離する
  • 20.5.4 の解決策は、外部からの動的注入を連想配列で置き換えるという手法。
  • プログラマが指定した文字列しかSQLに入れさせないよう連想配列で通訳させる。


■20.5.3 動的値を引用符で囲む
  • 引用符を入れたSQLをワザと書いて、オプティマイザが実行計画を最適化しやすいようにすることがある。
  • この場合は特殊ケースで、PreparedStatementをあえて使わない。
  • 昔は、オンラインの開始時間をバッチが突き抜けないよう、わざとPreparedStatementを避ける事があった。
  • ただしこの対策は非推奨。本当にこの対策が必要かどうか、まず計測してから判断すべし。


■ SQLインジェクションの解決策
  • 解決策 = 「20.5.2 動的値のパラメータ化(PreparedStatement)」 + 「20.5.4 コードからの隔離」
  • これに尽きる。
  • 「20.5.1 入力のフィルタリング」は危険。21世紀なのにありえない!(欄外注釈にも危険性を書いた)


■ P.221の4コマ漫画
  • 海外では有名なサイト。
  • OpenSSLのバグ「Heartbleed」の説明は、このサイトの4コマ漫画が一番分かりやすかった。
  • xkcd.com/1354/


■ 徳丸本
★感想:
みなさんのお話、オフレコな内容が多くてワロタw
ブログに書けないような結構スレスレ、というかアウトな経験をされているようで~
痛い目を見てから気をつけるようになる、黒歴史駆動開発の深淵を見た気がする・・・

前回19章のリーダブルパスワードでも話がありましたが、「自分のシステムをパスワードリスト攻撃のスタート地点にされないようにする」という点はSQLインジェクションも共通ですね。

この日で20章が終わり、残り5章。終わりが見えてきました~
皆勤目指して頑張ります。

みなさま、ありがとーございました。



■おまけ:過去の「SQLアンチパターン読書会」ブログ

1章:SQLアンチパターン読書会 「ジェイウォーク」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-65.html

2章:SQLアンチパターン読書会 「ナイーブツリー」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-70.html

3章:SQLアンチパターン読書会 「IDリクワイアド」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-73.html

3章:SQLアンチパターン読書会 「続・IDリクワイアド」 に参加しました
 http://makopi23.blog.fc2.com/blog-entry-77.html

4章;SQLアンチパターン読書会 「キーレスエントリー」 に参加しました
 http://makopi23.blog.fc2.com/blog-entry-84.html

5章:SQLアンチパターン読書会 「EAV(エンティティ・アトリビュート・バリュー)」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-90.html

6章:SQLアンチパターン読書会 「ポリモーフィック関連」 に参加しました
 http://makopi23.blog.fc2.com/blog-entry-94.html

7章:SQLアンチパターン読書会 「マルチカラムアトリビュート」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-97.html

8章:SQLアンチパターン読書会 「メタデータトリブル」 に参加しました
 http://makopi23.blog.fc2.com/blog-entry-105.html

9章:SQLアンチパターン読書会 「ラウンディングエラー」 に参加しました
 http://makopi23.blog.fc2.com/blog-entry-109.html

10章:SQLアンチパターン読書会 「サーティーワンフレーバー」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-115.html

11章:SQLアンチパターン読書会 「ファントムファイル」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-118.html

12章:SQLアンチパターン読書会 「インデックスショットガン」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-121.html

13章:SQLアンチパターン読書会 「フィア・オブ・ジ・アンノウン」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-128.html

14章:SQLアンチパターン読書会 「アンビギュアスグループ」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-130.html

15章:SQLアンチパターン読書会 「ランダムセレクション」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-133.html

16章:SQLアンチパターン読書会 「プアマンズ・サーチエンジン」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-134.html

17章:SQLアンチパターン読書会 「スパゲッティクエリ」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-136.html

18章:SQLアンチパターン読書会 「インプリシットカラム」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-138.html

19章:SQLアンチパターン読書会 「リーダブルパスワード」に参加しました
 http://makopi23.blog.fc2.com/blog-entry-140.html

-->