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

HP+MYSQL Web サイト SQL インジェクションの攻撃と防御、mysqlinjection_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-12 08:58:46803ブラウズ

HP+MYSQL ウェブサイト SQL インジェクションの攻撃と防御、mysqlinjection

WebjxCom ヒント: プログラマはコードを書くときに TDD (テスト駆動開発) に注意します。関数を実装する前に、まずテスト ケースを書き、それからそれを実行するコードを書きます。実際、ハッカーが SQL インジェクションを実行するとき、それは TDD プロセスでもあります。彼らはまずプログラムにエラーを報告させようとし、次にプログラムが再び正常に実行されると、インジェクションが続きます

プログラマは、コードを記述するときに TDD (テスト駆動開発) に注意します。関数を実装する前に、まずテスト ケースを記述し、次にそれを実行するコードを記述します。実際、ハッカーが SQL インジェクションを実行するときも、TDD プロセスです。ハッカーはまずプログラムにエラーを報告させようとし、次にプログラムが再度正常に実行されると、インジェクションは成功します。 。

攻撃:

プログラムに次のようなスクリプトがあるとします。

$sql = "SELECT id, title, content FROM Article FROM WHERE id = {$_GET[''id'']}";

通常アクセス時の URL は次のとおりです:

/articles.php?id=123

ハッカーが SQL インジェクションの脆弱性があるかどうかを判断したい場合、最も一般的な方法は、整数 ID の後に一重引用符を追加することです。 :

/articles.php ?id=123''

$_GET[''id''] パラメーターをフィルターしていないため、必然的に次のようなエラーが報告されます:

supplied引数は .. の有効な MySQL 結果リソースではありません。

この情報は、スクリプトに脆弱性があることを示すのに十分です:

/articles.php?id=0 Union select 1,2 ,3

1,2,3 が選択される理由は、結合のためです。 両側のフィールドの数が一致する必要があります。 先頭には id、title、content の 3 つのフィールドがあり、さらに 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がonの場合:

この時点でload_file(''/etc/passwd'')を直接使用すると一重引用符がエスケープされるため無効となりますが、別の方法もあります:

/ 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=on および error_log=filename 定期的に Web ログも確認することをお勧めします。
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

www.bkjia.com本当http://www.bkjia.com/PHPjc/1101618.html技術記事 HP+MYSQL Web サイト SQL インジェクションの攻撃と防御、mysqlinjection WebjxCom ヒント: プログラマはコードを書くときに TDD (テスト駆動開発) に注意します: 関数を実装する前に、最初にテストが書かれます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。