PHPで最も一般的なSQLインジェクションパターンは、役に立たない文字のエスケープです。

私の活動の性質上、Webアプリケーションのソースコードのセキュリティ監査を実行する必要があります。
多くのWebアプリケーションと大量のコード...

この記事では、過去3年間に大量のPHPコードを表示してきた間に何度も推測し、検証した1つの単純な(非常に単純な)真実と統計を共有したいと思います。

SQLインジェクションがWebアプリケーションのすべてのサーバー側の脆弱性の中で最も一般的であることは秘密ではありません。 ORMなどによって、そのようなものがほぼ完全に除外されているプラ​​ットフォームとフレームワークがあります。 しかし、統計は頑固に、単純な連結されたSQLクエリを使用して、インターネット上のWebアプリケーションの絶対的な優位性を教えてくれます。 また、ORMをまったく適用できない場合もあります。 たとえば、式パラメーターだけでなく、演算子レベルでのクエリロジック自体もユーザーデータに依存する必要がある場合です。

それでは始めましょう。

役に立たない文字のエスケープ

PHP Webインジェクションの脆弱性の83%で発見

次のような文字エスケープ機能を使用する
mysql_escape_string
mysql_real_escape_string
まつげを追加する
引用符なし。 ほとんどの場合、数値パラメーター(すべての種類の* _id)で現れます。


$sql = "SELECT user FROM userslist WHERE userid=".mysql_real_escape_string($_GET['uid']);

安全なコードのように見えますが、外観のみです。 私の練習でPHPで最も頻繁に使用されるSQLインジェクションパターンはここに忍び込みました。 この脆弱性に対して攻撃を実行するために、攻撃者は単に攻撃ベクトルで文字 '' \ x00 \ r \ n \ x1aを使用する必要はありません。
例:
/index.php?uid=-777 UNION SELECT password FROM userlist

コード検索

言語のセマンティクスによって複雑になります。 単純な検索には、egrepを使用できます。
egrep -Rin "(select|update|insert|delete|replace).*(from|set|into).*(mysql_escape_string|mysql_real_escape_string|addslashes)" . | grep -v "[\"']['\"]"

検索式のロジックは、フィルタリング関数の左側に引用符のシーケンスがないすべての行を検索することです( ''、 ""、 "'、'")。 もちろん、この方法は100%にはほど遠いですが、正規表現からセマンティック分析を要求することは不可能です。
情報出力の利便性のために、コンソールで関数を色で強調表示できます。
egrep -Rin "(select|update|insert|delete|replace).*(from|set|into).*(mysql_escape_string|mysql_real_escape_string|addslashes)" . | grep -v "[\"']['\"]" | egrep --color "(mysql_escape_string|mysql_real_escape_string|addslashes)"

このテンプレートの脆弱性から保護するには、型キャストを使用することをお勧めします。
あらゆる種類のフィルタリングやシールドよりも常に高速で信頼性の高い動作をします。
上記の例では、パッチは次のようになります。
$sql = "SELECT user FROM userslist WHERE userid=".intval($_GET['uid']);


これで短いエッセイは終わりです。 私はすべてのウェブ開発者に、そのようなデザインのソースを曲げるように勧めます。 さらに良いのは、人々のために与えられた検索スクリプトを拡張することです。

Source: https://habr.com/ru/post/J142599/


All Articles