【第二章】深入HTTP請求流程

Rookie8j發表於2020-07-08

Web2.0:網際網路架構從C/S 變為了B/S(瀏覽器/伺服器)。
當客戶與Web 伺服器互動時,就存在Web 請求,而這一請求就是基於HTTP 協議實現的。

2.1 HTTP 協議解析

HTTP(HyperText Transfer Protocol)即超文字傳輸協議
它允許將HTML超文字標記語言)文件從Web 伺服器傳送到Web瀏覽器。

2.1.1 發起HTTP 請求

URL(統一資源定位符)也被稱作網址。其標準格式如下:

協議://伺服器IP[:埠]/路徑/[?查詢]

如:

http://www.test.com/index.php

藉助Linux中的curl命令傳送一個簡單的HTTP 請求:
HTTP請求返回的HTML資料
HTTP 請求返回的HTML 資料
在這裡插入圖片描述
HTTP 響應頭
經過瀏覽器處理能讓使用者看到更直觀的介面

2.1.2 HTTP 協議詳解

目前HTTP協議最新版是1.1,是一種無狀態協議,無狀態即Web瀏覽器與伺服器之間不需要建立持久的連線。這意味著客戶端傳送了請求(Request),伺服器返回了響應(Response)之後連線就被關閉了。並且,HTTP 請求只能由客戶端發起

1.HTTP 請求與響應

(1)HTTP 請求

HTTP請求包括三部分
請求行(請求方法)
請求頭(訊息報頭)
請求正文
在這裡插入圖片描述

(2)HTTP 響應

與HTTP請求對應的是HTTP 響應,其也由三部分構成:
響應行
響應頭(訊息報頭)
響應正文(訊息主題)
在這裡插入圖片描述

2.HTTP 請求方法

(1)GET

用於請求頁面指定資訊。如果請求的動態指令碼,如index.jsp,那麼文字會返回Web容器解析後的HTML 原始碼,而不是index.jsp的原始檔。
一個GET請求:
在這裡插入圖片描述
使用GET 請求index.php並且id引數為1,而引數都是指令碼預先設計好的,多個引數之間用&連線。如id=1&name=admin,但是如果是你自己加的其它引數,如將name 改為了username ,伺服器並不回覆搭理你的username 引數,而只會接收id=1 這個引數值。

(2)HEAD

HEAD方法除了不會在響應裡返回訊息主體外,其它都與GET方法相同。通常用於測試連結的有效性、可訪問性和最近改變。掃描工具就常用此方法,因為不用返回訊息主體,所以速度一定是最快的。
一個HEAD請求:
在這裡插入圖片描述

(3)POST

POST方法與GET方法最大的區別在於,POST請求可以傳送大量資料,而GET傳送的資料有長度限制,並且資料不會顯示在瀏覽器端,相對安全。通常向伺服器提交資料都是用的此方法。
一個POST請求:
在這裡插入圖片描述
用POST方法向伺服器請求login.php,並且傳遞引數user=admin&pw=123456789

(4)PUT

PUT方法用於請求伺服器儲存請求中的實體於請求資源下,如果資源已存在,那麼替換其中的資料。如果不存在,則會建立這個資源。
一個PUT請求:

PUT /input.txt
HOST: www.xxser.com
Content-Length: 6

123456

這段PUT請求會在主機根目錄下查詢input.txt資源,並將內容替換為123456,如果沒有此資源,則會建立一個input.txt。通常,伺服器都會關閉此方法,因為這屬於危險方法之一。

(5)DELETE

DELETE方法用於請求伺服器刪除指定資源。伺服器通常也會關閉此方法,其也屬於危險方法之一。

(6)TRACE

TRACE方法被用於激發一個遠端的應用層的訊息迴路。簡單來說,客戶端會回顯伺服器收到的請求。常利用此方法去測試或者診斷。

(7)CONNECT

HTTP1.1 協議規範保留了此方法,為了用於能動態切換隧道的代理

(8)OPTIONS

用於請求獲得在通訊過程中可以使用的功能選項。通過此方法可以在採取具體資源請求之前,決定對該資源採取何種必要措施,或者瞭解伺服器效能。
一個OPTIONS請求:
在這裡插入圖片描述
以上為HTTP/1.1 常見的方法。

3.HTTP 狀態碼

當客戶端發出請求,伺服器接收後,會向客戶端傳送響應資訊,其中HTTP 響應中的第一行中,最重要的就是HTTP 狀態碼。
如:

HTTP/1.1 200 OK

此條響應資訊的狀態碼為200,表示請求成功。
HTTP狀態碼由三位數字組成,第一位數字定義了響應類別,且只有以下五種

  • 1xx資訊提示,表示請求已被成功接收,繼續處理。(100~101)
  • 2xx成功,伺服器成功地處理了請求。(200~206)
  • 3xx重定向,用於告訴客戶端,訪問的資源已被移動,並且告訴新的資源地址位置。這時,瀏覽器將對新資源重新發起請求。(300~305)
  • 4xx客戶端錯誤狀態碼,有時客戶端會傳送一些伺服器無法處理的東西,比如格式錯誤,最常見的就是請求了一條不存在的URL。(400~415)
  • 5xx伺服器內部錯誤,有時候客戶端傳送了一條有效請求,但是Web伺服器出錯了,可能是伺服器執行出錯,也可能是網站掛了。(500~505)

常見的狀態嗎如下:

200:客戶端請求成功,最常見。
302:重定向。
400:客戶端請求有語法錯誤,伺服器不能夠理解。
403:伺服器收到請求,但是拒絕提供服務。
404:請求的資源不存在,也常見。
500:伺服器內部錯誤,常見。
503:伺服器當前不能處理客戶端請求,一段時間後可能恢復正常。

4.HTTP 訊息

HTTP 訊息又稱HTTP 請求(報)頭(HTTP header),由請求頭、響應頭、普通頭和實體頭組成。

(1)請求頭

請求頭只會出現在HTTP 請求中,其允許客戶端向伺服器傳遞請求的附加資訊和客戶端自身的資訊。常用的HTTP 請求頭如下。

① Host

Host 請求報頭域主要用於被指定資源的Internet 主機號和埠號,例如:

HOST: www.test.com:80
② User-Agent

User-Agent 請求報頭域允許客戶端將它的作業系統、瀏覽器版本和其他屬性告訴伺服器。

③ Referer

Referer 包含一個URL,代表當前訪問URL的上一個URL,也就是說,使用者從什麼地方來到本頁面。如:

Referer: www.test.com/login.php

代表使用者從login.php來到當前頁。

④ Cookie

Cookie 是非常重要的請求頭,他是一段文字,常用來表示請求者的身份

⑤ Range

Range 可以請求實體的部分內容,多執行緒下載一定會用到此請求。例如:

表示頭500位元組:bytes=0~499
表示第二個500位元組:bytes=500~999
表示最後500位元組:bytes=-500
表示500位元組以後:bytes=500-
⑥ x-forward-for

即XXF 頭,代表請求端的IP,可以有多個,用逗號隔開。

⑦Accept

Accept 請求報頭域用於指定客戶端接收哪些MIME型別資訊,如:

Accept:text/html

表明客戶端希望接受HTML文字。

⑧ Accept-Charset

用於指定客戶端接受的字符集。如:

Accept-Charset:UTF-8,gb2312

如果請求訊息中沒有設定,預設接受任何字符集。

(2)響應頭

響應頭是伺服器根據請求傳送的HTTP 頭。常見的HTTP 響應頭如下:

① Server

伺服器所使用的Web 伺服器型別及版本,如

Server:Apache/1.3.6(Unix)

攻擊者通過檢視此頭可以探測Web伺服器型別以及版本。

② Set-Cookie

向客戶端設定Cookie,通過檢視此頭,可以清楚地看到伺服器向客戶端設定的Cookie資訊。

③ Last-Modified

伺服器通過這個頭告訴客戶端,資源最後修改的時間。

④ Location

伺服器通過這個頭告訴瀏覽器去訪問哪個頁面,即重定向位置。瀏覽器接收到這個請求後,通常會立刻訪問其所指向的頁面。這個頭通常配合302重定向狀態碼使用。

⑤ Refresh

伺服器通過Refresh 頭告訴瀏覽器定時重新整理時間

(3)普通頭

普通報頭中,少數報頭域用於所有的請求和響應,但並不用於傳輸實體,只用於傳輸訊息。如:Date,代表訊息產生日期和時間。Connection,允許傳送指定的連線選項。例如,指定連線是連續的,或者指定close 選項通知伺服器在響應完成後,關閉連線。Cache-Control,用於指定快取指令,快取是單向且獨立的。

(4)實體頭

請求和響應訊息都可以傳送一個實體頭。實體頭定義了關於實體正文和請求所標示的資源的元資訊。元資訊也就是試題內容的屬性,包括實體資訊型別、長度、壓縮方法、最後一次修改時間等。常見實體頭如下:

① Content-Type

用於向接收方指示實體的介質型別。

② Content-Ecoding

Content-Ecoding 頭被用作媒體型別的修飾符,它的值指示了已經被應用到實體正文的附加內容編碼,因而要獲得Content-Type 報頭域中所引用的媒體型別,必須採用相應的解碼機制。

③ Content-Length

用於指明實體正文長度,以位元組方式儲存的十進位制數字;來表示。

④ Last-Modified

用於指示資源最後的修改日期和時間。

2.1.3 模擬HTTP 請求

一次簡單的手動HTTP請求:

第一步:開啟CMD執行框,輸入Telnet www.baidu.com 80 後按Enter鍵,利用快捷鍵Ctrl+] 來開啟Telnet回顯(Telnet 預設不回顯)。
如果顯示:‘telnet’ 不是內部或外部命令,也不是可執行的程式 或批處理檔案。進入 控制皮膚\所有控制皮膚項\程式和功能 點選啟動或關閉Windows功能 勾選Telnet Client 點選確定即可。
第二步:按Enter鍵後,進入編輯狀態。
第三步:輸入

GET /index.html HTTP/1.1
HOST: www.badiu.com

連續快速按兩次回車(提交請求)。
就會接收伺服器到響應。在這裡插入圖片描述

2.1.4 HTTP協議與HTTPS協議的區別

HTTPS是以安全為目標的HTTP通道,其實就是HTTP的升級版本,比HTTP更安全

HTTPS的安全基礎是SSL,即在HTTP下加入SSL層。也就是HTTPS通過安全傳輸機制進行傳輸資料,這種機制可以保護網路傳送的所有資料的隱蔽性完整性,可以降低非侵入性攔截攻擊的可能性。

HTTPS 與HTTP 的請求和響應都是以相同的方式進行工作的。

兩者的主要區別:

  • HTTP 是超文字傳輸協議,是明文傳輸,HTTPS則是具有安全性的SSL加密傳輸協議。
  • HTTP 採用80埠而HTTPS 採用443埠
  • HTTPS 協議需要CA證照。而HTTP 不需要。
  • HTTP 連線相對簡單,是無狀態的,而HTTPS 協議是由SSL+HTTP協議構造的可進行加密傳輸、身份認證的網路協議,相對來說,它比HTTP協議更安全

2.2 擷取HTTP 請求

許多網站為了減少伺服器端壓力,在後臺方面減少驗證,而只在Web前端使用JavaScript進行驗證,這樣極大地增加了安全隱患。在滲透測試中,經常會進行HTTP請求的擷取來發現一些隱蔽的漏洞。例如:繞過JavaScript驗證、發現隱藏標籤內容等。

相關文章