magic_quote_gpc=onをオンにすると、addslshes()とstripslashes()の機能が実現できるようになります。 PHP 4.0 以降では、このオプションはデフォルトで有効になっているため、PHP 4.0 以降では、PHP プログラム内のパラメータがフィルタリングされていない場合でも、PHP システムは GET を渡すすべてのパラメータ、POST および COOKIE メソッドを介して渡される変数をフィルタリングします。つまり、入力されたインジェクション攻撃コードはすべて自動的に変換されるため、攻撃者にとっては大きな困難となります。
ただし、攻撃者には SQL インジェクション攻撃を実行する機会がまだあります。 。 。 。 。 。前提条件は、パラメータが数値型である場合、そのパラメータは Intval() 関数によって処理されていないことです。これは、 intval() によって処理された後、すべてのデータが強制的に数値に変換されるためです。
前に述べたように、magic_quote_gpc=on をオンにした後は、addlshes() 関数を使用するのと同じになります。ただし、数値型では一重引用符が使用されないため、当然のことながら、addlshes() 関数による変換はバイパスされます。 MySQL に付属の char() 関数または HEX() を使用する場合、char() はパラメータを整数として解釈し、これらの整数の ASCII コード文字で構成される文字列を返すことができます。16 進表現を使用する場合は、数値の前に 0x を追加する必要があります。 。
デモの例:
管理者のユーザー名が admin であることがわかっていて、パスワードがわからないとします。そして、magic_quote_gpc が有効になりました。SQL ステートメント:
コードをコピー | |
この時点で、アドレスバーに username=admin%23 と入力すると、合成された SQL ステートメントは次のようになります:
コードをコピー | |
のユーザーから * を選択します |
AdminをASCIIに変換するとchar(97,100,109,105,110)になります
この時、アドレスバーに
と入力してください
コードをコピー | |
コードをコピー | |
数値インジェクション攻撃の場合は、数値パラメータをデータベースに入れる前に intval() を使用してパラメータを強制的に数値にする必要があり、これにより数値インジェクションの脆弱性の発生が排除されます。
例:
コードをコピー | |
$id=intval($_GET[‘id’]); id=’$id’;の記事から*を選択してください
|
コードは次のとおりです | コードをコピー |
id=5' または 1=1%23 |
SQL ステートメントは次のようになります:
コードは次のとおりです | コードをコピー |
id='5';の記事から * を選択してください id='5' または 1=1#; の記事から * を選択する代わりに |
概要:
where username=’$name’,
など、各変数に必ず一重引用符を追加してください。
magic_quote_gpc を有効にしても絶対に安全というわけではありません。数値インジェクション攻撃の場合、addslashes() 関数を使用してパラメータを強制的に数値に変換するだけでは十分ではありません