web-dev-qa-db-ja.com

mysql_real_escape_stringをバイパスしてSQLiの脆弱性を悪用する方法

私は、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の脆弱性はありますか?攻撃者はそれをどのように悪用する可能性がありますか?

5
user126623

更新:適切な実装に関する以下のコメントを参照してください。


元の答え、これが であることを知る前に公式に文書化されました

すでに引用された文字列real_escape_string内で関数%sを置換'%s'とともに使用すると、疑わしいようです。

次の場合は脆弱性が存在する可能性があります

  • real_escape_stringが正しく設計されていない場合、
  • またはそのドキュメントに従って使用されていません。 (誤用、おそらく余分な引用符'または何か他のものがある)

PHPでSQLiを解決するより標準的な方法を使用することを強くお勧めします。 ?置換を伴うものが最適です。ただし、別のサウンドエンコーディング方式が利用できる場合があります。このようなメソッドは通常、内部的に独自の引用符を追加します。その場合、コードに引用符'を追加する必要はありません。

そのコードについて他に1つのことに気づきました。 PREFIXはどこから来たのですか?これがユーザー提供の場合、明らかにSQLiの脆弱性があります。一方、それが単にハードコードされた値または十分にサニタイズされた値である場合は、その値で問題ありません。

2
Bryan Field