目次
最初のステップは、二重引用符の制限をエスケープし始めることです。
2 番目のステップは、それを理解することです。src が見つからない場合は、onerror 内の文字列が実行されます。
DHCP ワークフロー チャート
- 1 検出フェーズ: DHCP クライアントが DHCP サーバーを検索するフェーズ。クライアントは DISCOVER メッセージをブロードキャスト モードで送信します。
- 2 プロビジョニングフェーズ: DHCP サーバーが IP アドレスを提供するフェーズ。クライアントから DISCOVER メッセージを受信した後、DHCP サーバーは IP アドレス割り当ての優先順位に基づいて IP アドレスを選択し、他のパラメータとともに OFFER メッセージを通じてクライアントに送信します。
- 3 選択フェーズ: DHCP クライアントが IP アドレスを選択するフェーズ。複数の DHCP サーバーがクライアントに OFFER メッセージを送信する場合、クライアントは最初に受信した OFFER メッセージのみを受け入れ、その後、OFFER メッセージに DHCP サーバーのコンテンツが含まれる REQUEST メッセージをブロードキャスト モードで送信します。同時に、メッセージには、選択した DHCP サーバーの IP アドレス情報であるオプション 54 (サーバー識別オプション) が含まれています。
- 4 確認フェーズ: DHCP サーバーが IP アドレスを確認するフェーズ。DHCP サーバーが DHCP クライアントから REQUEST メッセージを受信すると、DHCP クライアントによって選択されたサーバーのみが次の動作を実行します: アドレスがクライアントに割り当てられていることが確認された場合は ACK メッセージが返され、そうでない場合は NAK が返されます。アドレスをこのクライアントに割り当てることができないことを示すメッセージが返されます。クライアントは、サーバーから返された ACK 確認メッセージを受信した後、アドレス検出のための ARP メッセージ (宛先アドレスは割り当てられたアドレス) をブロードキャストで送信し、指定された時間内に応答がない場合、クライアントはこれを使用します。住所。
リクエストレスポンスステータスコード
200成功
403 禁止 (不十分な権限)
401 匿名
500サーバーエラー
30x リダイレクトリダイレクト (ログイン)
UTF-8
ここで直接言うと、無駄にしないために実際には可変長の Unicode です。
UTF-8 エンコード規則:
1. シングルバイトの場合、実際には Unicode エンコードです。
2. N バイト (N>1) の場合、最初のバイトの最初の N ビットはすべて 1、(最初のバイトの) N+1 番目のビットとそれに続くビットはすべて 0
次のバイトの最初の 2 桁は常に 10 に設定されます。
知らせ:
ワードバイト バイトビットという単語は
、英語の bit に由来しており、「ビット」と音訳され、バイナリ ビットを表します。
単語長とは単語の長さを指します
1 ワード = 2 バイト (1 ワード = 2 バイト)
1 バイト = 8 ビット (1 バイト = 8 ビット)
ワードの語長は 16、
バイトの語長は 8
バイト長
つまり半角(0~127)
全角(128~2047)
3バイト(2048~65535)
「中」を例にして例を見てみましょう
注: 中国語の ASCII コード変換をサポートしているのは Python3 のみです
バイナリに変換する
まず「0b100 111000 101101」を取り出して埋めてみましょう。「middle」は 3 バイトなので、形式は次のようになります。
1110xxxx 10xxxxxx 10xxxxxx、最後の桁から始めて、不明な x を後ろから前に埋めます。足りない場合はゼロを埋めます。この場合、UTF-8 エンコードは 11100100 10111000 10101101 となります。
明らかです、それだけです
URLコードをバイパスする方法は次のとおりです
フロントエンド (php) ページのコード
<?php
header('X-XSS-Protection:0');
$xss = isset($_GET['xss'])? $_GET['xss'] : '';
$xss = str_replace(array("(",")","&","\\","<",">","'"),'',$xss);
echo "<img src=\"{$xss}\">";
?>
最初のステップは、二重引用符の制限をエスケープし始めることです。
2 番目のステップは、<img src=http://www.baidu.com οnerrrοr="alert(1)"> を考え出すことです。src が見つからない場合は、onerror 内の文字列が実行されます。
括弧はフィルタリングされているため、バッククォートを使用して置き換えることができます。
成功!
バッククォートがフィルタリングされている場合は、URL コード エンコードのバイパスのみを実行できます。
まずは試してみましょう
Enter キーを押すと、ブラウザが %28%29 を () に解析し、フロントエンド ページでフィルタリングされてしまうため、機能しないようです。
%2528 %2529 でもう一度試してみましょう (%25 は urlcode% でエンコードされています)
満足のいかない結果
JS仕様: 記号()、:などはエンコードできない場合があります
ただし、位置情報と JavaScript は使用できます。
理由: location 関数は等号の右側をすべて変数に変えることができ、変数は JS で自由にエンコードできます。
注目して見てください
1、2、および 3 は、プロトコルを URL コード化できないため、ポップアップ ウィンドウには使用できませんが、HTML エンティティによってエンコードできるため、4 はポップアップ ウィンドウに使用できます。
要約する
私の理解についてお話しますと、一般的に、HTML エンティティ エンコード (&) がフィルタリングされているため、URL コード エンコードではプロトコルをエンコードできず、Unicode ではシンボルをエンコードできず、ページの解析プロセスが html であるためです --> url --> js なので、括弧内を url でエンコードします。ブラウザのアドレスは URL コードを解析するので、URL コードをエンコードする必要があります。ただし、この時点では変数ではないため、2 番目の URL コードのデコードは次に、location 関数を使用して以下を変数として扱うことができますが、現時点では、alert(1) はまだ読み取り専用なので、JavaScript 疑似プロトコルを使用して文字列に変換する必要があります。
HTML の例 (ポップアップ ウィンドウなし)
エンコードタグがある場合、タグが開始された状態には戻りません。テキストだとしか思えず、2つポップアップすることはできません。
<script> タグは JS タグであり、関数とテキストのみを含めることができます (再生できません)。