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']);









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



All Articles