私が維持しているいくつかのシステムで、SQLインジェクションのエクスプロイトをたくさん見つけました。インジェクションを防ぐ方法は知っていますが、アプリケーションの安全性を維持することに十分に注意を払っていない場合の危険性をCEOとCTOに示したいと思います。
多くの場合、主に脆弱性が見つかった場合、脆弱性が悪用される可能性が高いために修正することが優先されないため、セキュリティに関しては、プロアクティブではなく対応する必要があります。
次のクエリは、これらの例の1つです。サーバーはPHP_MAGIC_QUOTES ONで実行されており(はい、それは本当に悪いことです)、プログラマーがクエリで使用されるすべての入力値の周りに明示的に ''を追加しているため、エクスプロイトがいくつかの場所で発生するのを防ぎます(そのため、ブレークアウトできません)。私が今脆弱であるとわかったクエリは、文字列ではなく整数として扱われ、その周りに ''が含まれていません。
次に例を示します。
$sql = "select * from vulnerable_table where id = " . $_GET['id'] . " limit 1";
$result= mysql_query($sql);
Id変数を制御している場合、システムに最大のダメージを与えるにはどうすればよいでしょうか。
私が自分で考え出したいくつかの例:
id = 1;drop table mysql.user
Only if semi colon is accepted
id = 1;SELECT '<?php exec($_get['cmd'])?>' INTO OUT_FILE('/var/www/backdoor.php')
Only if I could bypass the magic_quotes somehow
PHPでは、セミコロンを使用してクエリをスタックすることはできません。ただし、括弧(通常はサブクエリと呼ばれます)を使用してクエリを別のクエリにネストすることはできます。例:
SELECT * FROM vulnerable_table WHERE id = (SELECT number from other_table)
この手法を使用すると(SQL結果を出力するかどうかに関係なく)、熱心な攻撃者がデータベースからすべてのデータを抽出する可能性があります。
例(Webページに出力される)
SELECT * FROM vulnerable_table WHERE id = (SELECT group_concat(table_name) from information_schema.tables WHERE version = 10)
このクエリにより、データベース内のすべてのユーザー定義テーブルのリスト(文字列)が生成されます。さらにクエリを実行すると、列が明らかになり、攻撃者がテーブル構造を完全に理解できるようになります(例: "tbl_accounts、tbl_passwords、tbl_guestbook")。
Webページに何も出力しない場合でも、攻撃者はSQLサブクエリを使用して条件付き(case-whenと考える)ステートメントを挿入する可能性があります。これにより、SQLエラーが発生し、他のエラーは発生しません。 「まったく出力しない」と通常のWebページから派生した1ビットの情報を収集して、データベース全体でバイナリ検索を実行できます。
PHP-Backdoorをアップロードするように提案したようなSQLクエリで文字列を生成する(現在のMySQLユーザーがFILE権限を持っているかどうかによって異なります;))また、ascii()を使用することは難しくありません、およびord()関数では、整数入力で文字列を作成できます。また、0x414141のような値は、MySQLで自動的に「AAA」に変換されます。
非常に高度な攻撃とフィルター回避テクニックに関しては、SQLセキュリティに関するReinersのブログを読むことをお勧めします: http://websec.wordpress.com/
完全を期すために:この脆弱性を修正するには、型キャストを実行して$ _GET ['id']を整数に変換するだけです。
会社が何らかの方法でセキュリティ(米国のSOXやHIPPAなど)または貿易基準(PCIまたはさまざまなISO標準など)を必要とする規制の一部である場合は、次のことを伝えるだけです。
あなたが会社の弁護士に悪い知らせを伝えるように話すことができれば、これはよりうまくいきます。それがうまくいかない場合、あなたの会社を救うことができるものは何もありません。
何をするにせよ、自分で脆弱性を悪用することを忘れてください。書面による許可なしに訴訟を起こした場合、刑務所に入る可能性がありますが、目的のために特別に設定したテストアカウントでそれが機能することを示す小さな証拠は機能する可能性があります。
これは、可能な情報抽出(ファイルの読み取りやデータベースユーザー情報の抽出など)とサーバーリソースの消費です。まず、クエリでUNIONステートメントを使用します。 2つ目は、BENCHMARK()関数を使用して行われます。上記の関数を使用してデータ抽出も可能です。
ここでは例を示したくありません-それらはすべてインターネット上にあります。そして、システム管理者として、あなたはケースを再現できると思います。本当に必要な場合はコメントしてください。
ちなみに、ファイルに書き込むためにセミコロンをサポートする必要はありません(ただし、ファイルに書き込むためのアクセス権が必要です)。
この漫画はそれをすべて言っていると思います。 リトルボビーテーブル
id =
0 OR id <> 0
iDの使用を完全にバイパスし、ハッカーはテーブル全体をダンプできます。
最大ダメージは相対的です。継続的に小さなハード検出データを離散的に挿入することは、大量のデータを一度に破壊するよりもはるかに破壊的な可能性があります。
さらに潜在的にさらに悪い状況は、数か月/数年にわたってデータを読み取るだけの場合があります。そのデータベースにはいくつのクレジットカード番号が保存されていますか?パスワード?
SQLインジェクションの特効薬は誰にも見せられません。それは、保持しているデータ、攻撃者のスキル、彼らが内部知識を持っているかどうか、スキーマのアーキテクチャなどに依存します。
サイトがDrupalの場合、管理者アクセスを提供するためにユーザーテーブルのユーザー1のパスワードを変更し、後で管理者特権でサイトを探索できるようになるため、さらにターゲットを絞った損害を与える可能性があります。