私は、SQLインジェクションの脆弱性を防ぐ機能をバイパスできるSQLインジェクションエクスプロイトをいくつか見つけようとしました。たとえば、mysql_real_escape_string
。私は exploit を見つけ、著者は脆弱性を説明し、脆弱なコードを投稿しました:
<?php
if(isset($_GET['pagename'])){
$name=$_GET['pagename'];
$query=sprintf("SELECT* FROM ".PREFIX."page WHERE
pagename = '%s' AND publish = 'Y'",$xx_con->real_escape_string($name));
}
しかし、彼は保護をバイパスする方法、つまり関数real_escape_string
。コードに実際のSQLiの脆弱性はありますか?攻撃者はそれをどのように悪用する可能性がありますか?
更新:適切な実装に関する以下のコメントを参照してください。
元の答え、これが であることを知る前に公式に文書化されました :
すでに引用された文字列
real_escape_string
内で関数%s
を置換'%s'
とともに使用すると、疑わしいようです。次の場合は脆弱性が存在する可能性があります
real_escape_string
が正しく設計されていない場合、- またはそのドキュメントに従って使用されていません。 (誤用、おそらく余分な引用符
'
または何か他のものがある)
PHPでSQLiを解決するより標準的な方法を使用することを強くお勧めします。 ?
置換を伴うものが最適です。ただし、別のサウンドエンコーディング方式が利用できる場合があります。このようなメソッドは通常、内部的に独自の引用符を追加します。その場合、コードに引用符'
を追加する必要はありません。
そのコードについて他に1つのことに気づきました。 PREFIX
はどこから来たのですか?これがユーザー提供の場合、明らかにSQLiの脆弱性があります。一方、それが単にハードコードされた値または十分にサニタイズされた値である場合は、その値で問題ありません。