XSSの紹介
クロスサイトスクリプティング(XSS)、それはコードインジェクションの攻撃で、XSSと呼ばれます。それはそうXSSという名前のXへの最初の文字の略語であり、CSSとを、区別するために。悪意のある攻撃者がコードのWebページに悪意のあるJavaScriptを挿入する、などのCookie、セッションID、などのユーザーデータの開示につながる悪質なコードを、トリガ、および他のタイプの攻撃の原因となりますのWebサーファーを参照するとき。
XSSが本質である:フィルタリングされていない悪意のあるコード、サイトで適切に混合コード、ブラウザは、悪意のあるスクリプトが実行され、その結果、信頼できるスクリプトが何であるかを区別することはできません。データブラウザで、その結果、攻撃を混同して、ソース、つまり、コードとデータからいえば、攻撃者がコードを入力すると解釈されます。
ケーススタディ
次のコードの場合
<input type="text" value="<%= getParameter("keyword") %>">
<button>搜索</button>
<div>
您搜索的关键词是:<%= getParameter("keyword") %>
</div>
リンクを構築する場合:
http://xxx/search?keyword="><script>alert('XSS');</script>
ブラウザがリンクを要求すると、サーバーは、パラメータのキーワードを解析し、取得"><script>alert('XSS');</script>
スプライシング利回りの後に:
<input type="text" value=""><script>alert('XSS');</script>">
<button>搜索</button>
<div>
您搜索的关键词是:"><script>alert('XSS');</script>
</div>
パラメータデータおよびコード・ページは、混乱を引き起こしているため、ユーザパラメータブラウズ<script>alert('XSS');</script>
コード実行に解決し、。
この問題を修正し、ユーザの入力パラメータをエスケープすることができます。
関数を使用escapeHTML()
<input type="text" value="<%= escapeHTML(getParameter("keyword")) %>">
<button>搜索</button>
<div>
您搜索的关键词是:<%= escapeHTML(getParameter("keyword")) %>
</div>
escapeHTML()
エスケープルールは次のとおりです。
文字 | エスケープ文字の後 |
---|---|
& |
& |
< |
< |
> |
> |
" |
" |
' |
' |
/ |
/ |
脱出した後、ブラウザは、ユーザーが提出したコードとページのデータを区別することは非常に良いことができます。
<input type="text" value=""><script>alert('XSS');</script>">
<button>搜索</button>
<div>
您搜索的关键词是:"><script>alert('XSS');</script>
</div>
- テキストの目的のためにユーザーの入力データが表示されます
- 攻撃者が慎重に混乱コードおよびデータが得られ、入力の断片を用いて構築、ユーザは、コード入力などのブラウザを引き起こします
- XSS攻撃はHTML転送することによって防止することができます
時にはちょうどHTMLが十分ではありませんエスケープありません。以下のような:HTML、JSONであれば、インライン
<script>
var initData = <%= data.toJSON() %>
</script>
次に、あなたが使用することはできませんescapeHTML()
、それはJSON形式を破壊しますので、。
しかし、この時間が確保されていません
- JSONに含まれる
U+2028
か、U+2029
これらの2つの文字がリテラルのJavaScriptとして使用することができないとき、それ以外の場合は、構文エラーがスローされます。 - JSONが文字列が含まれている場合
</script>
、現在のスクリプトタグが閉じられてしまう、文字列のコンテンツブラウザはに従ってHTMLを解析し、増加に<script>
ラベル等が注入を完了することができます。
だから我々は一人で脱出するようなシナリオを失うことがあります。
文字 | エスケープ文字の後 |
---|---|
U + 2028 | \ u2028 |
U + 2029 | \ U2029 |
< | \ u003c |
異なるシナリオが異なるルールのエスケープが必要です
、自分自身の脱出を書くためにライブラリを避けることができない領域を考慮して、成熟した、一般的なエスケープライブラリを使用してみてください
時には私は、次のコードとして、XSSをすべてエスケープを行って、まだ可能性ています:
<a href="<%= escapeHTML(getParameter("redirect_to")) %>">跳转...</a>
リンクの構築:
http://xxx/?redirect_to=javascript:alert('XSS')
この場合、サーバーの応答は次のようになります。
<a href="javascript:alert('XSS')">跳转...</a>
クリックしてa
XSSを達成するために、ラベル。
それは、我々は、ユーザが入力したデータに期待するものではありませんので。ここでは、望ましくない入力をフィルタリングホワイトリストポリシーを取ることができます。
ユーザ入力データは、要求の制限を行い、望ましくない入力フィルタ
悪いと考えるならばブラックリストを行うには、十分に検討し、バイパスすることができます。上記の例のように、唯一のフィルタ場合
JavaScript
、それはケースを使用してバイパスすることができます。
XSS攻撃の分類
XSS攻撃は、次の3つのカテゴリ、反射、およびDOM型ストレージタイプに分けることができます。
タイプ | ストレージエリア | 挿入ポイント |
---|---|---|
蓄積型XSS | バックエンドデータベース | HTML |
反射型XSS | URL | HTML |
DOM XSSタイプ | バックエンドデータベース/フロントエンド・ストレージ/ URL | JavaScriptのフロントエンド |
ストレージエリア:悪意のあるコードの保管場所
悪質なコードを作って、挿入ページ:挿入ポイント
反射型XSS
攻撃手順:
- 攻撃者は、攻撃者の悪質なコードが含まれている特殊なURLを構築します
- 攻撃者は、ユーザーに送信するURLを構築します。ユーザーがURLにアクセスし、悪意のあるコードをスプライスするサーバーは、HTMLでブラウザに返さ
- 応答を受け取った後に実行するには、ユーザーのブラウザを解析し、攻撃者の悪質なコードは、コードの実行として構成されています
- 攻撃者にユーザーデータを盗むために、または特定の操作を実行する悪意のあるコード
その上、そのようなサイトの検索など、URLからパラメータを渡すジャンプする機能で一般的な攻撃。
POSTリクエストはまた、XSS反射タイプをトリガすることができるが、トリガー厳しい条件は、あまり一般的です。
蓄積型XSS
攻撃手順:
- データベースの標的部位に提出し、攻撃者悪意のあるコード。
- ユーザーがターゲットサイトを開くと、サイトサーバーがデータベースから悪質なコードを削除します、ステッチは、HTMLでブラウザに返さ。
- ユーザのブラウザは、混合悪意のあるコードも実行される応答を受信した後に行われる解析します。
- 悪意のあるコード、ユーザデータを盗み、攻撃者のWebサイトに送信された、または任意のアクションの実行に標的部位インタフェースを呼び出し、ユーザの行動を偽装します。
ユーザーとサイトの機能における一般的な攻撃は、このようなフォーラムの投稿、製品レビュー、ユーザー私的な手紙などのデータを、保存します。
蓄積型XSS有する反射XSS差がある:蓄積型XSS悪意あるコードがデータベースに存在する、反射型XSS悪意のあるコードは、URL内に存在します。
DOM XSSタイプ
攻撃手順:
- 攻撃者は、悪質なコードが含まれている特殊なURLを構築します。
- ユーザーが悪質なコードでURLを開きます。
- ユーザーのブラウザは、応答を受信した後に行うJavaScriptを抽出されたURLのフロントエンドと、悪意のあるコードを実行し解析します。
- 悪意のあるコード、ユーザデータを盗み、攻撃者のWebサイトに送信された、または任意のアクションの実行に標的部位インタフェースを呼び出し、ユーザの行動を偽装します。
DOM XSSタイプの2つの違いの種類の前にXSS:DOM XSS型の攻撃、および他の2つは、サーバーのXSSのセキュリティの脆弱性に属しながら、ブラウザ、独自のセキュリティ上の脆弱性のJavaScriptのフロントエンド部で行われ、悪質なコードの実行を削除します。
XSSの注入点
HTMLノードのコンテンツ
入力されたコメントへのユーザーの場合
"评论“
<script>alert("XSS")</script>
あなたはどんな防衛策を持っていない場合は、最終的に解決します。
<div class = "commentContent">
"评论“
<script>alert("XSS")</script>
</div>
HTML属性/パラメータ
上記のように言えば
<a href="<%= escapeHTML(getParameter("redirect_to")) %>">跳转...</a>
アドレスは、ユーザによって入力された場合:
http://xxx/?redirect_to=javascript:alert('XSS')
これは、XSSを構成するであろう。
JavaScriptコード
JavaScriptでユーザーの入力変数ならば、それは慎重に注入を達成するために、事前に閉じられた文字列で、その結果、構築することができます。
<script> var $a = "";alert("XSS");"";</scaript>
リッチテキスト
自然はそれが可能XSS攻撃で、リッチテキストHTMLの一部です。そして、リッチテキスト攻撃防御は比較的トラブルです。
XSSは、バイパス
より良いXSSの防衛の良い仕事をするために、我々は、ルールの防衛前のベースの共通バイパス姿勢を見て、あなたの防衛のルールを見てバイパスされる可能性はありません。
ケースをバイパス
、フィルタのみ固定ラベルフィルタに悪いと考えられますが、ブラウザでは、大文字と小文字は区別されていない場合、攻撃者は、ケースを変更することにより、バイパスすることができます。
フィルタをバイパスするreturn文を使用した後
アイデアは、キーワードを削除しますが、キーワードフィルタリングは、単に指定された値を返すとき、除去工程を考慮して一度だけ、検出は、そのような<Scrの> RIPT>として、チューブにネストすることができ、フィルタステートメントをバイパスすることです悪意のあるコード。
スクリプトタグを使用することに加えて
スクリプトタグはXSSを達成することができないだけで、他のラベルも可能です。など
<img>,<a>
など、エンコーディングをバイパスキーワード
キーワードが防御ルールを濾過する場合、キーワードは、ルールをバイパスするためにエンコードされてもよいし、(評価を使用)が行われます。
(1)符号化され、警告が表示されますよう
\u0061\u006c\u0065\u0072\u0074(1)
組み合わせ
XSSの危険性
ユーザー情報を盗みます
最も一般的なのは、ユーザーのクッキーを盗むことです。クッキーの盗難後、攻撃者は直接ユーザーアカウントにログインするためのパスワードの代わりにトークンを使用することができます。
悪意のあるトラフィックハイジャックジャンプ達成
他のサイトを攻撃するために、被害者のマシンのコントロール
強制送信メール
、読書などの企業データを、制御改ざん、追加、企業の機密データを削除する機能
XSS攻撃の防御
2つの敷地内にXSS攻撃:
- 攻撃者が悪意のあるコードを提出します
- 悪意のあるコードを実行するブラウザ
濾過
そのようなものの<script>、<img>、<a>
他のラベル濾過しました。
エスケープ
脱出するときには、フロントとリアの両方とみなすことができます。
エスケープの場合にのみ、フロントエンドの攻撃者は、フロントエンド、ダイレクト構築要求をバイパスすることができれば、あなたは悪意のあるコードを提出することができます。
脱出するために、ユーザデータのデータベースストレージを書き込む前に、後端部に脱出する場合、次に使用から取り出します。
しかし、バックエンドは、問題を引き起こすことができるときのような出力の内容は、
ユーザーの入力内容とは、クライアントフロントエンドに提供する必要がある場合は適応はまた、両端を必要とした後、データをエスケープすることはできません。
5<7
エスケープされ5<7
、その後、クライアントに直接文字化け出力意志、異なる位置での遠位端は、また、異なる符号化を必要とします。
HTMLページに表示されます。
JavaScriptの変数に割り当てられました。
エスケープXSSは、特定の状況下で解決することができますが、不確実性を導入します。
ここでは前面と背面の端に私は必要なデータは何か、私は得られたデータがエスケープでした正確かどうかを知ることを確認し、調整する必要があります。
あなたは適切なエスケープを使用してライブラリをエスケープしたい同時に、全体の完全なHTMLテンプレートに挿入ポイントを逃れます。
XSSのセキュリティホール | シンプルな脱出保護効果があります |
---|---|
HTMLタグのテキスト | 持っています |
HTMLの属性値 | 持っています |
CSSのインラインスタイル | ノー |
内联のJavaScript | ノー |
インラインJSON | ノー |
ジャンプリンク | ノー |
コードデータ分離
純粋なレンダリングのためのフロントエンド:
- 静的なHTMLをロードするブラウザは、HTMLは、ビジネス関連でどのようなデータが含まれていません。
- JavaScriptで実行され、その後、HTMLブラウザと。
- アヤックス、DOM API呼び出しによって、JavaScriptのロード・ビジネス・データは、ページを更新します。
純粋なフロントエンドのレンダリングには、ブラウザはあなたが(テキストを設定したい内容を正確に把握することができます.innerText
)または属性(.setAttribute
)またはスタイル(.style
)など。
なお、フロントエンドコードストリンジェンシー
DOMタイプXSSを回避するために、使用中.innerHTML
、.outerHTML
、document.write()
時間がページにないHTMLとして信頼できないデータには特に注意するが、使用されなければならない.textContent
、.setAttribute()
ようにと。
Vueのは、/スタック技術に反応し、使用しない場合はv-html
/ dangerouslySetInnerHTML
機能を、フロントエンドステージが回避され、レンダリングinnerHTML
、outerHTML
隠されたXSS。
以下のようなDOMインラインイベントリスナー、location
、onclick
、onerror
、onload
、onmouseover
など、<a>
タグのhref
属性は、JavaScript eval()
、setTimeout()
、setInterval()
など、文字列としてのコードを実行することができます。文字列に信頼されていないデータの登録は、これらのAPIに渡された場合、それは回避セキュリティリスクになりやすいです。
CSP戦略
コンテンツセキュリティポリシー(コンテンツセキュリティポリシー)サイトを制限するための信頼できるメカニズムは、コンテンツのソースかどうかを特定含まれていてもよいとホワイトリストの一種です。
デフォルトの設定は、インラインコード(許可されていない<script>
ブロックの内容、インラインイベント、インラインスタイルを)、とのevalの実行を()、newFunction()、禁止のsetTimeout([文字列]、...) 、とのsetInterval([文字列] ...)。
- 攻撃複雑なロジックを防ぐために、ローディングドメインコードを禁止します。
- サイトが攻撃を受けた後に提出したドメイン外に禁止されている、ユーザーのデータは、外部のドメインに漏れることはありません。
- インラインスクリプトの実行を禁止する(より厳しい規則は、今GitHubの使用を発見しました)。
- (新機能、モバイル用のグーグルマップ)スクリプトの不正実行を禁止します。
- XSSを検出することができ、レポートの使用の合理化は、できるだけ早く問題を解決する助けとなります。
概要長制御入力
XSS攻撃は、多くの場合、あなたには、いくつかの入力は長さを制限することによって防衛をカットするように強制することができる期待することができますので、長い文字列に到達できるようにする必要があります。
HTTPのみクッキー
JavaScriptは、攻撃者が完了したが、XSSはこのクッキーを盗むことはできません注入した後、いくつかの敏感なクッキーを読むことを禁止されています。
XSS検出
究極のXSSポリグロットの記事を解き放つには、文字列があります:
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
これは、HTMLの属性、HTMLテキスト、HTMLのコメント、ジャンプリンク、様々な状況では、文字列、インラインCSSスタイルシートや他のXSSの脆弱性を検出することができるJavaScriptのインラインの存在を検出することができるeval()
、setTimeout()
、setInterval()
、Function()
、innerHTML
、document.write()
、その他のDOM XSSの脆弱性を入力して、いくつかのXSSフィルタをバイパスすることができます。
入力ボックスのサイトでこの文字列を提出するか、URLパラメータにそれを縫い合わせることで、それを検出することができます。
検出ツール: