ホームページ > バックエンド開発 > PHPチュートリアル > HP+MYSQL Web サイト SQL インジェクションの攻撃と防御

HP+MYSQL Web サイト SQL インジェクションの攻撃と防御

WBOY
リリース: 2016-07-29 09:02:37
オリジナル
752 人が閲覧しました
WebjxCom ヒント: プログラマは、コードを記述するときに TDD (テスト駆動開発) に注意します。関数を実装する前に、まずテスト ケースを記述し、次にそれを実行するコードを記述します。実際、ハッカーが SQL インジェクションを実行するとき、それは TDD プロセスでもあります。彼らはまずプログラムにエラーを報告させようとし、次にプログラムが再び正常に実行されると、インジェクションが続きます

プログラマは、コードを記述するときに TDD (テスト駆動開発) に注意します。関数を実装する前に、まずテスト ケースを記述し、次にそれを実行するコードを記述します。実際、ハッカーが SQL インジェクションを実行するときも、TDD プロセスです。ハッカーはまずプログラムにエラーを報告させようとし、次にプログラムが再度正常に実行されると、インジェクションは成功します。 。
攻撃:
プログラムに次のようなスクリプトがあるとします。
$sql = "SELECT id, title, content FROM Articles WHERE id = {$_GET[''id'']}";
通常のアクセス時URL は次のとおりです:
/articles.php?id=123
ハッカーが SQL インジェクションの脆弱性があるかどうかを確認したい場合、最も一般的な方法は、整数 ID の後に一重引用符を追加することです:
/articles。 php?id=123''
$_GET[''id''] パラメーターをフィルターしていないため、次のような情報のようなエラーが必然的に報告されます:
指定された引数は有効な MySQL 結果ではありませんリソース...
この情報は、スクリプトの存在を示すのに十分です抜け穴があります。いくつかのトリックを使用できます:
/articles.php?id=0 Union select 1,2,3
1 の理由2,3 が選択されるのは、union では両側のフィールドの数が一致している必要があり、前にタイトルとコンテンツの 3 つのフィールドがあり、その後に 1、2、3 が続くため、構文エラーは発生しません。また、存在しないレコードとして id=0 が設定されている場合、クエリ結果は 1、2、3 となり、Web ページ上では元の ID が表示される場所に 1 が表示され、2 が表示されます。タイトル表示部分には が表示され、内容表示部分には 3 が表示されます。
継続して使用する方法は、magic_quotes_gpcの設定に依存します:
magic_quotes_gpcがオフの場合:
/articles.php?id=0 Union select 1,2,load_file(''/etc/passwd' ')
これがその仕組みです。その結果、/etc/passwd ファイルの内容が、最初に表示されていた場所に表示されます。
magic_quotes_gpc がオンの場合:
このとき、load_file(''/etc/passwd'') を直接使用すると、一重引用符がエスケープされるため無効になりますが、方法はあります:
/articles.php ?id =0 Union select 1,2,load_file(char(47,101,116,99,47,112,97,115,115,119,100))
数値は /etc/passwd 文字列の ASCII です。文字列の各文字はループ ord(. ..)
ただし、文字列の 16 進形式も使用できると思います。文字列の各文字は循環的に出力されます dechex(ord(...))
/articles.php?id=0 Union select 1,2, load_file(0x2f6574632f706173737764)
ここで紹介する数値パラメータの攻撃方法は氷山の一角に過ぎません。文字列パラメータなどの攻撃方法については、以下のドキュメントリンクを参照してください。
防御:
GreenSQL など、SQL インジェクション ファイアウォールに似たソフトウェアがインターネット上で利用可能です。Web サイトが SQL インジェクション攻撃を受け始めた場合、そのようなショートカット ツールを使用すると命を救える場合があります。プロキシの役割は、そのアーキテクチャに多くの課題を抱えているため、Web サイトの同時パフォーマンスに影響を与える可能性が高いため、プロキシを選択するかどうかを選択するときは、客観的な条件に基づいて慎重に決定することが最善です。多くの場合、専門的なソフトウェアは必要なく、軽量なソリューションが多数あります。ここでは、awk を使用して潜在的な脆弱性を検出する方法を示します。
次の内容を含む detect_sql_injection.awk スクリプトを作成します (内容をコピーする場合は、行番号を含めないでください):
01 #!/bin/gawk -f
02
03 /$_(GET|POST| COOKIE|REQUEST)s *[/ {
04 IGNORECASE = 1
05 if (match($0, /$.*(sql|query)/)) {
06 IGNORECASE = 0
07 Output()
08 next
09 }
10 }
11
12 function Output()
13 {
14 $1 = $1
15 print "CRUD: " $0 "nFILE: " FILENAME "nLINE: " FNR "n"
16 }
このスクリプトは問題に一致します次のようなコードを使用すると、猫や虎のように if match ステートメントを記述するだけで、マッチング モードを拡張するのが簡単になります。
1: $sql = "SELECT * FROM users WHERE username = ''{$_POST[''username'']}''";
2: $res = mysql_query("SELECT * FROM users WHERE username = ''{ $_POST[''username'']}''");
使用する前に chmod +x detect_sql_injection.awk を忘れないでください。呼び出し方法は 2 つあります:
1: ./detect_sql_injection.awk /path/to/ php/ script/file
2: find /path/to/php/script/directory -name "*.php" xargs ./detect_sql_injection.awk
は、次のように問題のあるコード情報を表示します。
CRUD: $sql = "SELECT * FROM users WHERE username = ''{$_POST[''username'']}''";
FILE: /path/to/file.php
LINE: 123
このスクリプトの応用例は次のとおりです。実環境 CRON を介してプログラムのソース ファイルを定期的にスキャンしたり、SVN が送信されたときにフック メソッドを介して自動的に照合したりする方法。
専門的なツールを使用する場合でも、スクリプトを検出する場合でも、問題の根本は常にプログラマーが必要なセキュリティ意識を持っているかどうかに依存します。
1: デジタル タイプのパラメーターを使用します。 intval や floatval などのメソッドを使用してフィルタリングを強制します。
2: mysql_real_escape_string などのメソッドを使用して、単純なaddslashesの代わりにフィルタ文字列パラメータを強制します。
3: mysql_query などのスプライシング SQL クエリ メソッドを放棄し、可能な限り PDO のバインディング準備メソッドを使用するのが最善です。
4: 書き換えテクノロジーを使用して実際のスクリプトとパラメーターの情報を隠し、通常の書き換えルールを通じて疑わしいパラメーターをフィルターします。
5: エラー プロンプトをオフにし、機密情報を攻撃者に提供しないようにします: display_errors=off。
6: エラー情報をログの形式で記録します: log_errors= />7: MySQL への接続に FILE 権限を持つアカウント (root など) を使用しないでください。これにより、load_file などの危険な関数が保護されます。
8:...
Web サイトのセキュリティは実際には複雑ではありません。入力をフィルターし、出力をエスケープするという 1 つの文に要約できます。このうち、これまで議論してきた SQL インジェクションの問題は入力のフィルタリングの問題に属し、出力のエスケープの問題としてはクロスサイト スクリプティングが代表的ですが、この記事の範囲には入らないので説明します。それについてはこれ以上は言いません。
ドキュメント:
addslashes() と mysql_real_escape_string()
MySQL を使用した SQL インジェクション
MySQL を使用した高度な SQL インジェクション
MySQL インジェクションでエクスポートされたフィールド コンテンツに関する研究 - インジェクションによる WebShell のエクスポート

転載元: http://www.aspnetjia.com /Cont-328.html

上記は、HP+MYSQL Web サイトでの SQL インジェクションの攻撃と防御を、関連コンテンツも含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート