自動化されたツールの一部を使用することは非常に良いことですが、これらのツールから洞察や経験を得ることはできません。
XSS攻撃のポイントは、ブラウザウィンドウでjavascriptを実行することです。これはサイトでは提供されません。だからまず、ユーザーが提供したデータがウェブサイトにどのような文脈で印刷されているかを調べる必要があります。 <script></script>
コードブロック内にある可能性があります。<style></style>
ブロック内にある可能性があります。要素の属性として使用される場合があります。<input type="text" value="USER DATA" />
、または<textarea>
などです。それに応じて、コンテキストをエスケープする(または使用する)ためにどの構文を使用するかがわかります。たとえば、<script>
タグ内にある場合は、関数の消去を終了し、セミコロンで行を終了するだけで十分な場合があるので、最終的な注入は); alert(555);
のようになります。指定されたデータがhtml属性として使用されている場合、注入は" onclick="alert(1)"
のように見えます。要素をクリックするとjsが実行されます(この領域は特にhtml5で再生するのに豊富です)。 重要なのは、xssのコンテキストは、フィルタリング/サニタイズ機能と同じくらい重要であり、自動ツールでは捕捉できない微妙なニュアンスがあることが多いことです。引用符とhtmlタグがなくても上記のように表示されるように、限られた数の状況では、フィルタをバイパスしてjsを実行することができます。
ブラウザのエンコーディングも考慮する必要があります。たとえば、ターゲットブラウザにutf7エンコーディングがある場合(フィルタをバイパスすることができます)、注入をエンコードします。フィルタの回避は全く別の話ですが、現在のPHP関数は正しく使用されていればかなり防弾です。
また、ここで最後のものとしてXSS vectors
のに十分な長さのリストがあるが、ここでは、サイト上で見つかったXSS文字列の実際の例であり、私はない、単一のスキャナがいただろうことを保証します(、フィルターおよびワードブラックリスト、様々なプロフィールページをカスタマイズするための基本的なHTMLフォーマットを挿入することが許さページがあった)ことが判明:
<a href="Boom"><font color=a"onmouseover=alert(document.cookie);"> XSS-Try ME</span></font>
なXSSやSQLインジェクションなど
コードインジェクションの脆弱性は、常に不適切な使用の結果でありますデータが漏れているかどうかを確認します。 PHPでは、マークアップする予定のないページに出力する*すべて*で 'htmlspecialchars()'を使用する必要があります。いくつかの型を保存するには、ラッパー 'function h($ s){return htmlspecialchars(s);}を使用できます。 } 'を使い、どこでも' h() 'を使います。 – Tomalak
'htmlspecialchars()'(または 'htmlentities()')を実装する前に** XSSの脆弱性**をテストするポイントは何ですか? – Mike
また、常にあなたがいる "コードレベル"を考えてみましょう:例:ユーザー生成データをHTMLコメントに書き込むときには、実際には 'htmlspecialchars()'する必要はありませんが、そのデータから ' - >'があればそれを削除するか、XSSの脆弱性が存在する可能性があります。 – Tomalak