SQLインジェクションからイノセントのMySQLを守る
筆者:
Ashfaqアンサリ

によるレビュー:
評価:
5
上の 10月 19, 2012
最終更新日:1月 18, 2013

要約:

PHPでMySQLの注入を防止する方法についての詳しいご案内. SQLインジェクションを防ぐために、コーディング規則と機能を確保.

はじめに

 

これはあなたの無実を保護する方法についての簡単なガイドです。 MySQLの からデータベース SQLインジェクション 攻撃.
 

SQLインジェクションとは何ですか?

 

名前が示すように, SQLインジェクション ユーザーがアプリケーションにSQL文を注入する際に発生.
 
これはどのように起こるのでしょうか?
 
我々は、ユーザ名とパスワードを取るシンプルなログインフォームを持っていると言う, とデータベースに対して検証. ユーザー名とパスワードが検証された場合, ユーザがシステムにログインしている.
 

このためのコードは次のようなものを見ることができた:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?PHP
// POST要求からユーザーとパスワードを取得
$USER_NAME = $_POST[ 'ユーザ名' ];
$パスワード  = $_POST[ 'パスワード' ];

$クエリー = "FIRST_NAMEセレクト, LAST_NAME, users_table名= 'FROM ACCOUNT_NUMBER$USER_NAME'ANDパスワード='$パスワード' ";

$結果 = するmysql_query( $クエリー );

// mysqlが何を見つけたかどうかを確認, それが成功した場合、レコードを取得する
もし ( はmysql_num_rows( $結果 ) > 0 ) {
    $データ = するmysql_fetch_assoc( $結果 );
    エコー 'ようこそ' . $ユーザー . '!';
    エコー 'あなたの口座番号です: ' . $データ[ 'ACCOUNT_NUMBER' ] . '';
} //errorrメッセージをプリントアウト
ほかに {
    エコー 'ユーザ名またはパスワードが有効ではありません! もう一度やり直してください!';
}
?>

 

上記のスクリプトが正常に動作し、それが自分の銀行口座番号を参照するために本物のユーザーが自分のユーザー名とパスワードを入力することができます.
 

私が入ることを前提としてみましょう “デモ” 私のユーザ名として, と “demopass” 私のパスワードとして, その後のMySQLに渡されるSQLクエリは、次のようになります:
 

1
SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER FROM users_table WHERE ユーザ名 = 'デモ' アンド パスワード = 'Demopass' ;

 

我々の入力データはデータベースに正常に検証された場合, その後、我々はシステムにログインされ、我々は、我々はシステムへのアクセスを得ることはありません他の口座番号が表示され、我々は、エラーメッセージが表示されます “ユーザー名またはパスワードが有効ではありません! もう一度やり直してください!
 

悪意のあるユーザーがSQL文を終了するために意図されている他の文字を入力する問題.
 

ユーザがユーザ名としてログインしようとすると仮定してみましょう dem'o やパスワードなど demopass.
 

今, SQL文がどのようなものか見てみましょう.
 

1
SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER FROM users_table WHERE ユーザ名 = ''ANDパスワード='demopass' ;

 

MySQLはステートメントを実行しているとき, それだけで扱います “” ユーザ名として、いつ、それは別のに遭遇した ‘', それは扱い ‘‘ SQLコマンドとして、それは認識しないように、それは、メッセージを投げるとエラーになります ‘‘ 有効なSQLコマンドとして.
 
ERROR 1064 (42000): あなたのSQL構文でエラーが発生している; 'Oの近くで使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認’ とパスワード=”demopass”; ” ラインで 1
 

素晴らしい. 上記のエラーメッセージは、SQL構文で若干の誤差があることを述べて. もし マジッククオート 有効になっていました, その後、我々は、その上記のエラーメッセージを持っていない可能性があります.
 

今, それでは悪意のあるユーザーとしてユーザー名を入力した場合に何が起こるか見てみましょう (‘ OR '1' = '1) やパスワードなど “demopass“.

SQLクエリは次のようになります。:

1
SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER FROM users_table WHERE ユーザ名 = '' または '1 '='1 ' アンド パスワード = 'Demopass' ;

 

上記のSQLクエリでは、何を意味している? それに等しいユーザ名ですべての行を検索するためにMySQLを伝えます “” (空白) または (1= 1) と等しいパスワード “demopass“.
 

SQL文を使用して、実際に間違っているかを理解するのはより論理的に上記のSQLクエリを表現しましょう:
 

ユーザ名= “” または “1= 1” とパスワード= “demopass”
 

今, 我々はすでに= 1 1は常にtrueであることを行っていることを知っている. 故に, パスワードが正しいと、ユーザー名が間違っている場合、ユーザーはシステムにログインすることができます.
 

それでは別の攻撃文字列を使用してより多くのより悪いシナリオを分析してみましょう.
 

攻撃文字列: ‘ OR 1 = 1–
 

ご注意ください (#) するために使用されます SQL文を終了. のは、SQLクエリで攻撃文字列を入れてみようと、最終的なSQL文がどのように見えるかを参照してください。.
 

今, 私たちは、攻撃者があってもパスワードを知らないと仮定します.
 

1
SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER FROM users_table WHERE ユーザ名 = '' または 1=1--'とパスワード=' idonotknow ' ;

 

SQL文はMySQLがどのように解釈されるかを参照してください.
 

ユーザ名= “” OR 1 = 1– とパスワード= “idonotknow”
 

ご注意ください 上記のステートメントで. 我々はそれを知っているように ある文のSQLでターミネータと 1= 1 常にtrueです, SQLクエリの声明ターミネータ残りの部分は実行されませんした後に.
 

故に, テーブル内のすべてのレコードが返されてしまい、ユーザーがシステムに記録されます. 攻撃者は、データベース内の最初のレコードの口座番号を見ることができます.
 

無実のMySQLを助けましょう
 

マジッククオート

 

マジッククオート PHPスクリプト言語の論争の機能です, 特殊文字は、上で渡される前にバックスラッシュを分取終了されることを特徴と.
 

マジッククオート の新規インストールではデフォルトで有効になっていました PHP3PHP4, とその操作は舞台裏で、すぐに明らかではないので、, 開発者は、彼らの存在と、彼らが導入できるという潜在的な問題に気づいていないかもしれない.
 

私たちは、オンにする必要があります マジッククオートphp.iniの WebサイトのWebルートにあるファイル.
 

どのマジッククオート役立ち?

 

我々は、これらの引用符をエスケープする必要があります ( シングルとダブルの両方の引用符, 同様にバックスラッシュ).
これは、彼らの前にスラッシュを置くことによって行われます.
 

So usename = dem'o になる DEM 'O , そのままとMySQLは、その引用符でエクササイズができます “保護された” スラッシュ.
 

それでは何が起こるか見てみましょう マジッククオート オンになっている. それでは攻撃者がマジッククオートに罹患している方法を見てみましょう.
 

1
SELECT FIRST_NAME, LAST_NAME, ACCOUNT_NUMBER FROM users_table WHERE ユーザ名 = '\' OR = 1 1 - ' アンド パスワード = 'Idonotknow' ;

 

ユーザー名は次のように解釈されます: \’ OR 1 = 1–

それは完璧だ SQLクエリを免れ, 何も注入されない得ることができます. magic_quotes_gpcの 私たちのために危険な単一引用符をエスケープします. 故に, 攻撃者がシステムにログインすることができません.

マジッククオートの問題

 

マジッククオート 唯一のいくつかの文字の前にバックスラッシュを挿入, の何物でもない. これは、共同入射によって上記のみとだけのようないくつかの特定の場合にSQLインジェクションから私たちを保護します. 我々は持っている場合 ON display_errorsを, あなたのデータベースの詳細は、彼の目の前に右の出力と我々だけで、攻撃者は非常に嬉しかった. あなたはしていない場合でも, まだそこにブラインドSQLインジェクションの可能性であると事前にSQLインジェクションの方法を使用して、それはバイパスすることが可能です magic_quotes_gpcの 機能.
 
そう, 我々は安っぽいないデータをエスケープする方法が必要, 文字セットの問題として発生しやすいではない, と魔法の繁殖切りつけクオートする傾向はない.
 
11月 2005 PHPのコア開発者は、これらの問題の都合で決めた マジッククオート 機能は、PHPから削除されるであろう 6.
一度 マジッククオート 機能が引き出され, その後、最大トリミングいくつかの主要な問題があるように起こっている.
 

SQLインジェクション軽減
 

防止するために、いくつかの方法があります MySQLの 内注射 PHP. 最も一般的な方法は以下のような機能を使用している addslashesの()mysql_real_escape_string().
 

addslashesの()

 

addslashesの() データベースクエリで消毒する必要がある文字の前にバックスラッシュで文字列を返します. これらの文字は、単一引用符である (‘ = ’) 二重引用符 (” = ”) とnullbyte (%00 = \0).
 

addslashesの() クエリ文字列は、引用符で囲まれている場合のみ動作します. 次のような文字列は、まだSQLインジェクションに対して脆弱になります:
 

1
2
3
$USER_NAME = addslashesの( $_POST[ 'ユーザ名' ] );
$パスワード  = addslashesの( $_POST[ 'パスワード' ] );
$クエリー = "FIRST_NAMEセレクト, LAST_NAME, users_table名= 'FROM ACCOUNT_NUMBER$USER_NAME'ANDパスワード='$パスワード' ";

mysql_real_escape_string()

 

mysql_real_escape_string() よりもう少し強力です addslashesの() それは、MySQLのライブラリ関数呼び出しとして mysql_real_escape_string, 次の文字にバックスラッシュを付加した: \X00, \N, \R, \, ', ” と X1A.
 

と同様に addslashesの(), mysql_real_escape_string() クエリ文字列は、引用符で囲まれている場合のみ動作します. 次のような文字列は、まだSQLインジェクションに対して脆弱になります:
 

1
2
3
$USER_NAME = mysql_real_escape_string( $_POST[ 'ユーザ名' ] );
$パスワード  = mysql_real_escape_string( $_POST[ 'パスワード' ] );
$クエリー = "FIRST_NAMEセレクト, LAST_NAME, users_table名= 'FROM ACCOUNT_NUMBER$USER_NAME'ANDパスワード='$パスワード' ";

 

sprintfを()

 

sprintfを() 動的引数は、それが処理されると仮定ているように扱われていることを確認するために変換仕様で使用することができ. 例えば, ユーザーID番​​号のための呼び出しは、文字列になっていた場合, %S 引数は文字列として扱われていることを確認するために使用されるであろう. この例は次のとおりです。:
 

1
2
3
$USER_NAME = $_POST[ 'ユーザ名' ];
$パスワード  = $_POST[ 'パスワード' ];
$クエリー = sprintfを("FIRST_NAMEセレクト, LAST_NAME, users_table名= 'FROM ACCOUNT_NUMBER%S'ANDパスワード='%S' ", $USER_NAME, $パスワード);

 

にhtmlentities($だった, ENT_QUOTES)

 

にhtmlentities() オプションの二番目のパラメータquote_styleと一緒に, できの使用 ENT_QUOTES, ダブルとシングルの両方の引用符に変換される. これは、同じ意味のように動作します addslashesの()mysql_real_escape_string() 引用符に関しての, しかしながら, 代わりにバックスラッシュを付加の, それは引用符のHTMLエンティティを使用します.
 

使用することに加えて ENT_QUOTES 中で にhtmlentities(), 三番目のパラメータは、変換内で文字セットの使用を強制的に設定することができます. これは、使用してからの予期せぬ結果を停止するのに役立ちます マルチバイト 文字内の文字は、次のような設定 BIG5GPK.
 

以下は、防止するために役立つだろうコードの例です SQLインジェクション PHPで.
 

1
2
3
4
5
$USER_NAME = $_POST[ 'ユーザ名' ];
$USER_NAME = にhtmlentities( $USER_NAME, ENT_QUOTES, 'UTF-8' );
$パスワード  = $_POST[ 'パスワード' ];
$パスワード  = にhtmlentities( $パスワード, ENT_QUOTES, 'UTF-8' );
$クエリー = "FIRST_NAMEセレクト, LAST_NAME, users_table名= 'FROM ACCOUNT_NUMBER$USER_NAME'ANDパスワード='$パスワード' ";

 

SQLコードを最適化

 

データベースサーバは、複雑な獣であり、彼らはあなたが必要とするよりもはるかに多くの機能を持っている. 限りセキュリティが懸念している, より多くの、より良いことはありません. 例えば, ザ xp_cmdshellを における拡張ストアド·プロシージャ MS SQL シェルへのアクセスを提供し、これはまさにハッカーの夢です. この手順およびその他の機能を無効にする必要があり、このためです, 簡単に悪用できる. あなたがすることなく行うことができます任意の機能を単に削除するか、少なくとも無効.
 

デフォルトのSQLエラーメッセージを無効にする

 

これらはデータベースとSQLクエリに関する追加情報を提供するため、エラー·メッセージは、攻撃者にとって有用である. そして、すべてのSQL攻撃は通常、SQLが発行したエラーのタイプに基づいています, それはエラーのタイプは、Webサイトやアプリケーションをハッキングするためハッカーのアプローチを決定することを意味. セキュリティが損なわれることはありませんよりよい解決策は、表示するようになります 一般的なエラーメッセージ 単純にエラーが発生したことを示す.
 

安全にデータベース資格証明を格納

 

の場合の被害を最小限にするために、 SQLインジェクション攻撃, 常に別の暗号化されたファイルでデータベースの資格情報を保存. 今ハッカーに破ることに成功たとえ, 彼はあなたのデータベースに多くのことができないように、彼または彼女は多くの恩恵を受けることはありません.
 

最小特権の原則を使用して、

 

最小特権の原則は非常に有益であり、それはに適用されます SQLインジェクション 同様に. 常に考えたりかについて二度チェック 特権 あなたはに提供している ユーザー または オブジェクト. あなたには、いくつかのユーザーにモデレータのアクセスを提供するためにWANと仮定, これだけ彼に彼/彼女が必要とするこれらのテーブルへのアクセスを提供する, むしろ彼にデータベース全体のアクセスを証明するよりも. あなたは、システムへのアクセスを提供する必要がある場合, へのより良い データベース内部で分割されたテーブルスペースを作成し、特定の表スペースへのアクセスを提供. この手法は、意志 大幅に攻撃の危険性を減らす.
 

シェルを無効にする

 

多くのデータベースでは、シェルアクセスを提供しています 本質的には何の攻撃やハッカーのニーズであるデータベースへ. あなたは、このオープン抜け穴を閉じる必要がこのため. すべてのサービスプロバイダーは、別の方法を持っている シェルの実行を無効にする 彼らのデータベース上. だからあなたの特定のデータベースまたは表スペースまたは特定のテーブルのシェルアクセスを無効にする方法については、データベースのマニュアルを参照してください.
 

脆弱性をチェックするためにSQLインジェクションのツールを使用して、

 

最後になりましたが, ハッカーのように考える. ハッカーは、を介して自分のデータベースをハックするにはどうすればよい SQLインジェクション, 彼は抜け穴を見つけるために使用できる何かツールやテクニック. あなたはいつものようにSQLインジェクションハッキングツールの予行演習を持っている必要があり SQLI, Haviz, SQL injectme 等. あなたはその後網膜脆弱性スキャナを買う余裕ができるより多くの場合は、あまりにも良い. それは、すべての最新の暴露の脆弱性で構成されていたように.

どうもありがとうございました. 私はあなたがすべての楽しんでいる必要があります願っ. 我々はもっともっとうまくできるように、コメントを記入してください.

 
 

28,919 閲覧, 18 今日の閲覧回数

以下の2つのタブが、以下の内容を変更する.

Ashfaqアンサリ

セキュリティー研究者
Ashfaqアンサリはの創設者であり、 HackSysチーム コー​​ドネーム "ヒョウ属". 彼は、情報セキュリティの様々な側面での経験を持つセキュリティ研究者である. 彼が執筆しています "HackSysエクストリーム脆弱ドライバ" と "死のシェルコード". 彼はまた、書かれており、低レベルのソフトウェア開発のさまざまなホワイトペーパーを公開しています. 彼のコアの関心が内にあり "低レベルの搾取", "リバースエンジニアリング", "プログラム解析" と "ハイブリッドファジング". 彼は人工知能と機械学習のミーハーです. 彼はのための章リードです ヌルプネ.

返信を残す

あなたのメールアドレスは公開されません. 必須フィールドがマークされている *