注射を避ける方法

Webシステムへの攻撃は、入力処理のバグに基づいています。 ハッカーは、さまざまなソフトウェアの脆弱性と開発者の不注意を使用して、処理中にシステムを危険にさらすようなデータを作成できます。シェル、 暗号化されていないパスワード 、ブラウザでのユーザーアクションのエミュレーション(アカウントからお金を転送する銀行システムなど)でさえもです。



あらゆる種類のインジェクションは、一般的な攻撃ベクトルの1つです:html、javascript、sql。 したがって、多くの信頼できる情報源は、さまざまな呪文を通じてユーザー入力を保護することを推奨しています。 この投稿では、1つの簡単なルールを紹介します。これに従って、インジェクションの問題を確実に解決できます。



画像







ルールは単純です: データ形式を混在させないでください!





書式


すべてのデータには形式があります。 最も単純な形式は、すべての文字が等しく、追加の意味を持たないプレーンテキストです。 テキストデータに基づくその他の形式(csv、html、javascriptなど)には、コンマ、タグ、スペシャルなどの制御文字があります。 文字。 上記の形式の混在により、ある形式が別の形式として扱われると危険な状況が発生します。

たとえば、ASP.NET for Labelコントロールでは、TextプロパティはHTMLとして扱われます。 したがって、このプロパティに異なる形式(プレーンテキストなど)の値を割り当てると、潜在的なHTML脆弱性が発生します。 そのため、スペシャルを選別するフォーマット間で特別なアダプターを使用する必要があります。 文字。 したがって、プレーンテキストからHTMLへのアダプターは、「<script>」を「&lt; script&gt;」に変換します。 また、プレーンテキストからURIへのアダプターは、「example.com?<script> alert( 'pwned'); </ script>」を「example.com%3F%3Cscript%3Ealert( 'pwned')%3B%3C%2Fscript」に変換します。 %3E。」

同様のアダプターは、ほぼすべての言語とプラットフォームに存在します-.NET:HtmlEncode、UrlEncode、PHP:htmlentities、urlencode 、サーバー側JavaScript: escape、encodeURIおよびencodeURIComponent 。 SQLクエリの場合、データベース自体で処理されるパラメーター化されたクエリを使用するだけで十分です。



生活を楽にするための3つの簡単なポイントを次に示します。





UPD:PHPインジェクションについて

この記事の議論の1つで、私のルールはphpインジェクションでは機能しないという議論がありました。 私はそれが機能することを示したいです。 だから、ありふれたコードを考えてみましょう:

 include($_GET['path']);
      
      



GETリクエストで「evil.php」を渡すと、スクリプトは指定されたエクスプロイトを安全に起動します。 次に、この状況を私のルールのスタイルで検討します。 説明から、include関数が現在のファイルシステムまたはURIの形式のファイルパスを予期していることが明らかです。 また、コンテンツ形式$ _GET ['path']はプレーンテキストです。 注射を避ける方法は? このテキストを正しいパス形式に導くpathEncodeを書くか、空の文字列を返すことができない場合(たとえば、許可されたパスのホワイトリストをチェックする)。 その場合
 include(pathEncode($_GET['path']));
      
      



実行可能ファイルでクラッシュするか、ファイルをアップロードします。 主なことは、どの形式が含まれることが期待され、どの形式がユーザーから来るかを明確に理解することです。



All Articles