Web セキュリティ テスト: HTTP リクエストの詳細

I.はじめに

セキュリティ侵入部門の同僚によって編集されたセキュリティ テスト関連の資料とチュートリアルは、内部資料と組み合わせて、Web、APP を含む電子商取引、決済、金融、ネットワーク、データベースなどの分野におけるセキュリティ テストのあらゆる側面をカバーしています。 、ミドルウェア、内部および外部ネットワーク、Linux、Windows の複数のプラットフォーム。学習を終えたら、あなたは間違いなくセキュリティの上司になれるでしょう!
すべての記事については、コラム「フルスタック セキュリティ テスト チュートリアル (0 基礎)」をご覧ください。


この章の学習を通じて、次の知識を習得し、Web セキュリティ テストをマスターするための基本的な準備を整えます。

  1. HTTP1.0のリクエストメソッド
    HTTP1.0のGET、POST、HEADの3つのリクエストメソッドを理解する
    GETリクエストの標準フォーマットをマスターする
    POSTリクエストのメソッドをマスターする 送信フォームとファイルをアップロードする
    HEADリクエストとGETリクエストの違いを理解する
  2. HTTP1.1の新しいリクエストメソッド HTTP1.1の
    5つの新しいリクエストメソッド:OPTIONS、PUT、DELETE、TRACE、CONNECTメソッドの基本概念を理解する
    HTTP1.1の5つの新しいリクエストの基本メソッドと生成されるリクエストをマスターする。


2、HTTPリクエスト

http リクエストは、リクエスト行、メッセージ ヘッダー、リクエスト本文の 3 つの部分で構成されます。
リクエスト行はスペースで区切られたメソッド シンボルで始まり、その後にリクエストされた URI とプロトコル バージョンが次の形式で続きます。

  1. メソッド リクエスト URI HTTP バージョン (CR)(LF)
  2. Method はリクエスト メソッド (GET、POST、HEAD など) を表します。
  3. Request-URI は統一リソース識別子です
  4. HTTP-Version は、要求された HTTP プロトコルのバージョンを示します。
  5. (CR)(LF) は、キャリッジ リターンとライン フィードを意味します (最後の (CR)(LF) を除き、単一の (CR) または (LF) 文字は許可されません)。

例:GET /get.php?arg1=value1 HTTP/1.1

HTTP メッセージ要求ヘッダーを使用すると、クライアントは要求された追加情報とクライアント自身の情報をサーバーに渡すことができます。

  1. 一般的なヘッダー:
  2. 一般的に使用されるリクエスト ヘッダー Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、Host (リクエストの送信時にこのヘッダー フィールドは必須です)、User-Agent
  3. 各タイプのリクエストヘッダーの終了後に(CR)(LF)が続きます。
  4. メッセージヘッダーとリクエストボディは 1 行で区切られます

1) GETリクエスト

GET リクエスト形式:
<アクセスパス>[?=[&=…]]
例: http://site1.com/get.php?arg1=value1
サーバー側はパラメータ名に従って値を取得できます:
PHP の例:

<?php echo $_GET['arg1']; ?>

その結果、arg1 の対応する値が出力されます。

GET リクエストは URL 内のデータを渡すことも、データを含めることもできません。HTTP リクエストにはリクエスト ヘッダーのみがあり、リクエスト データはありません。

Content-Length はリクエスト ヘッダーに含まれない場合があります。例:
GET /get.php?arg1=value1 HTTP/1.1
ホスト: site1.com
接続: close
ユーザー エージェント: Paw/2.2.5 (Macintosh、OS X/ 10.12.2 ) GCDHTTPRequest
GET リクエストには、リクエストされたパス
http://www.gooann.com
のみを含めることができます。GET リクエストには送信するデータを含めることもでき、疑問符 (?) + パラメータ = 値を付けて送信します。アクセスパスの後。
http://site1.com/get.php?arg1=value1

2) POSTリクエスト

POST リクエストにはデータが含まれており、リクエスト データの形式は HTTP ヘッダーで定義できます。通常、次の 5 つの形式があります。

  1. フォーム形式: application/x-www-form-urlencoded
  2. ハイブリッド形式: multipart/form-data
  3. JSON形式: application/json
  4. XML形式: text/xml
  5. テキスト: テキスト/プレーン

以下はこれらの形式の紹介です

2.1 フォームの形式

get メソッドと同様に、送信されたすべてのデータをデータ領域に配置します。
POST メソッドも GET メソッドと同様に URL にパラメータを含めることができますが、通常はこの方法では使用されません。
フォーム メソッドは GET メソッドと似ていますが、データがヘッダー ファイルの下のリクエスト本文領域に配置される点が異なります。リクエストは次のとおりです:
POST /post-form.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: 192.168.0.105
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS) X/10.12 .2) GCDHTTPRequest
Content-Length: 11
arg1=value1


2.2 混合フォーマット

ファイルをアップロードするときによく使用されるメソッドがあります。異なる種類のデータを同時に送信することができます
。フォームでは、ファイルをアップロードするために種類をファイルに変更できます。

通常、種類の後にはデータ領域の区切り文字を示す境界線が続きます。
各データは次のことを示すことができます。データ型は個別に指定します。

混合モードは通常、ファイルの転送に使用されます。その後に、boundary=__xxxx__ を続けて各パラメータを分割します。
POST /upload_file.php HTTP/1.1
コンテンツ タイプ: multipart/form-data; 境界=-----WebKitFormBoundaryRTP6hG23yFYrExfg
ホスト: 192.168.0.105
接続: 閉じる
ユーザー エージェント: Paw/2.2.5 (Macintosh; OS X/ 10.12.2) GCDHTTPRequest
コンテンツの長さ: 101

------WebKitFormBoundaryRTP6hG23yFYrExfg
Content-Disposition: form-data; 名前=「引数1」

value1
------WebKitFormBoundaryRTP6hG23yFYrExfg
Content-Disposition: フォームデータ; 名前=「ファイル」; filename=“python.txt”
Content-Type: text/plain

多線程
xxxxx
------WebKitFormBoundaryRTP6hG23yFYrExfg
Content-Disposition: form-data; 名前=「ファイル2」; filename=“mails.zip”
Content-Type: application/zip

xxxxx
------WebKitFormBoundaryRTP6hG23yFYrExfg–


2.3 テキスト形式

一般的なデータの種類は
、json、xml、およびプレーンです。サーバー コードは、 PHP コード自体を解析する必要があります。file_get_contents(“php://input”);
例: json_decode(file_get_contents( "php://input"),true)['arg1'];データは型(type)に応じてアンラップできます。



ファイルに応じてテキストモードで受信することもでき、
file_get_contents("php://input"); を使用することでファイルの内容を読み込まないようにすることができます。
file_get_contents("php://input"); モードは multipart/form-data モードを受信できません。
以下のコードはPHPで記述されており、型がjsonの場合はjsonに従って解析されます。

<?php if( $_SERVER['CONTENT_TYPE'] == 'application/json') { echo json_decode(file_get_contents("php://input"),true)['arg1']; } ?>

このときのリクエストデータは{"arg1":"value1"}
、戻り値はvalue1となります。

3) HEADリクエスト

HEAD リクエストはヘッダー データのみを返し、データ部分はコンテンツを返しません。返されるコンテンツは基本的に GET および POST のリターン ヘッダーと同じです。

ここに画像の説明を挿入

4) オプションリクエスト

OPTIONS 要求は、デフォルトで許可された要求タイプを返します。
http://www.microsoft.com/zh-cn/ は次を返します:
Access-Control-Allow-Headers: Origin、X-Requested-With、Content-Type、Accept
Access -Control-Allow-Methods: GET、POST、PUT、DELETE、OPTIONS
Access-Control-Allow-Credentials: true
通常、クロスドメインが必要な場合は、OPTIONS (クロスドメインについては後で説明します) を設定する必要があります
。スクリプトを使用してブラウザにクロスドメインを許可する リクエスト時に、他のサーバーがクロスドメインを許可するかどうか、OPTIONS を検出します。許可されている場合にのみ、対応するリクエストが行われます。
ブラウザで site1.com にアクセスすると、一部のスクリプト操作がブラウザ以外のデフォルトのヘッダー情報とともに site2.com に送信されます。このとき、ブラウザは直接リクエストを送信しません。 POST リクエストの場合は、まず OPTIONS リクエストを送信して、POST の送信を許可するかどうかを決定します。相手が許可を返信すると、POSTリクエストを送信できるようになります。

5) PUT DELETE リクエスト

PUT: 指定したファイルを特定のディレクトリにアップロードし、URL にファイル名が設定されます。
DELETE: 特定のディレクトリ内のファイルを削除します。URL にはファイル名が設定されます。
NGINX では、PUT、DELETE を許可する次の設定を追加できます
location /upload/ { dav_methods PUT DELETE; root /usr/share/nginx/html; }


PUT - 送信包
PUT /upload/Untitled HTTP/1.1
Content-Type: application/octet-stream
Host: 192.168.1.64
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.6) GCDHTTPRequest
Content -長さ: 284

PUT – 返包
HTTP/1.1 201 作成
サーバー: nginx/1.12.1
日付: Fri, 01 Sep 2017 13:40:03 GMT
Content-Length: 0
場所: http://192.168.1.64/upload/Untitled
接続: close


DTELE – 送信包
DELETE /upload/Untitled HTTP/1.1
ホスト: 192.168.1.64
接続: 閉じる
ユーザーエージェント: Paw/2.2.5 (Macintosh; OS X/10.12.6) GCDHTTPRequest

DELETE – 返包
HTTP/1.1 204 No Content
サーバー: nginx/1.12.1
日付: Fri, 01 Sep 2017 13:51:07 GMT
接続: close


6) TRACE、CONNECT リクエスト

HTTP TRACE は、Web サーバーがクライアントのすべてのリクエスト情報をクライアントに返すためのメソッドであり、デバッグ要件でよく使用されます。
CONNECT は、特定のアプリケーションが HTTP プロトコルを使用する場合に使用されます。

  1. プロキシが使用できる
  2. http プロトコルを使用し、長いリンクを必要とする一部のプログラム (SSL は接続を使用します)

おすすめ

転載: blog.csdn.net/ml202187/article/details/132426276
おすすめ