溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

HTTP協(xié)議(7)HTTP請求頭

發(fā)布時間:2020-06-27 04:11:28 來源:網(wǎng)絡(luò) 閱讀:2057 作者:yttitan 欄目:安全技術(shù)

在HTTP請求報文中,請求頭是我們需要重點了解的部分,下面是請求頭中的主要內(nèi)容:
(1) Host,指定被請求資源的URL。
(2) User-Agent,客戶端操作系統(tǒng)和瀏覽器的版本信息。很多網(wǎng)站通過它來判斷操作系統(tǒng)和瀏覽器類型,來展示對應(yīng)的頁面。也有很多通過UA來判斷訪問是否合法,是用戶訪問還是程序訪問等。
Windows版本與內(nèi)核的對應(yīng)關(guān)系:

  • ? Windows NT 4.0 = NT 4.0
  • ? Windows 2000 = NT 5.0
  • ? Windows XP = NT 5.1
  • ? Windows Vista = NT 6.0
  • ? Windows 7 = NT 6.1
  • ? Windows 8 = NT 6.2
  • ? Windows 8.1 = NT 6.3
  • ? Windows 10 = NT 10.0
    (3) Accept,用于指定客戶端可以接收哪些MIME類型的信息,比如Accept:text/html,表示客戶端希望接收HTML文本。而如果是Accept:text/plain,則表示客戶端只能接收純文本,服務(wù)器不能向它發(fā)送圖片、視頻等。(MIME類型用來設(shè)定某種擴展名文件的打開方式,當(dāng)具有該擴展名的文件被訪問時,瀏覽器會自動使用指定的應(yīng)用程序來打開,如jpg圖片的MIME為image/jpeg。)
    (4) Accept-Language,指定客戶端可以接收的語言,如果請求消息中沒有設(shè)置這個域,默認(rèn)是任何語言都可以接收。
    (5) Referer,Referer包含一個URL,代表當(dāng)前訪問URL的上一個URL,也就是說,用戶是從什么地方來到本頁面。假如你通過百度搜索出一個商家的廣告頁面,你對這個廣告頁面感興趣,鼠標(biāo)一點發(fā)送一個請求報文到商家的網(wǎng)站,這個請求報文的Referer屬性值就是http://×××w.baidu.com 。如果Referer值就是所訪問頁面的URL,則表示我們是直接訪問的該頁面,而不是從別處跳轉(zhuǎn)過來。Referer也被廣泛用在防盜鏈中。
    (6) Cookie,客戶端發(fā)給服務(wù)器證明用戶狀態(tài)的信息,用來表示請求者的身份。
    (7) Cache-Control,對緩存進(jìn)行控制,如一個請求希望響應(yīng)返回的內(nèi)容在客戶端要被緩存一段時間,或不希望被緩存,就可以通過這個報文頭達(dá)到目的。比如Cache-Control: max-age=3600,就表示讓客戶端對響應(yīng)內(nèi)容緩存3600秒,也即在3600秒內(nèi),如果客戶再次訪問該資源,直接從客戶端的緩存中返回內(nèi)容給客戶,不要再從服務(wù)端獲取。而Cache-Control: no-cache,則表明對返回的響應(yīng)內(nèi)容不要在客戶端緩存。
    有些項目在請求頭中不一定會出現(xiàn),但是對于***又比較重要,下面也介紹一下:
    (8) x-forwarded-for,即XFF頭,它代表客戶端的IP,可以有多個,中間以逗號隔開。

例題:貌似有點難
實驗吧 http://ctf5.shiyanbar.com/phpaudit/
打開鏈接之后,提示“錯誤!你的IP不在允許列表之內(nèi)!”,并且給出了網(wǎng)站源碼。

<?php
function GetIP(){
if(!empty($_SERVER["HTTP_CLIENT_IP"]))
    $cip = $_SERVER["HTTP_CLIENT_IP"];
else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
    $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
else if(!empty($_SERVER["REMOTE_ADDR"]))
    $cip = $_SERVER["REMOTE_ADDR"];
else
    $cip = "0.0.0.0";
return $cip;
}

$GetIPs = GetIP();
if ($GetIPs=="1.1.1.1"){
echo "Great! Key is *********";
}
else{
echo "錯誤!你的IP不在訪問列表之內(nèi)!";
}
?>

我們首先來分析一下這段代碼。
$_SERVER是一個全局變量,與$_GET、$_POST一樣,可用于獲取客戶端的信息。在這段代碼中,使用了三種不同的獲取客戶端IP的方法,
$_SERVER[“REMOTE_ADDR”]獲取的是客戶端與服務(wù)器三次握手建立TCP連接時的IP,這個無法偽造。
$_SERVER['HTTP_CLIENT_IP']和$_SERVER["HTTP_X_FORWARDED_FOR]都是通過HTTP頭來獲取信息,因而都是可以偽造的。它們分別獲取的是HTTP請求頭“CLIENT-IP”和"X-FORWARDED-FOR"域的信息,不過“CLIENT-IP”不屬于標(biāo)準(zhǔn)的頭信息,而"X-FORWARDED-FOR"則是,因而修改該屬性更為可取。.
比如我們自己編寫下面一個腳本文件:
HTTP協(xié)議(7)HTTP請求頭
默認(rèn)情況下只能獲取到$_SERVER["REMOTE_ADDR"],這是因為HTTP請求頭中默認(rèn)并沒有那兩個值。
HTTP協(xié)議(7)HTTP請求頭
我們利用Burpsuite截獲報文,然后在其中增加兩個頭部信息,并發(fā)送出去,這時服務(wù)器可以通過三種方法來獲取到客戶端的IP。
HTTP協(xié)議(7)HTTP請求頭
搞清楚這些問題之后,這道題目的解法就很簡單了,只要將“CLIENT-IP”或是“X-FORWARDED-FOR"修改為1.1.1.1即可。
HTTP協(xié)議(7)HTTP請求頭
最后還是需要說明一下,既然$_SERVER[“REMOTE_ADDR”]獲取的是客戶端的真實IP,而且用戶無法偽造,那么服務(wù)器為什么不用這種方法來獲取客戶端IP呢?這是因為在局域網(wǎng)環(huán)境下,客戶端與服務(wù)器之間直接通信,通過三次握手建立連接,此時獲取的IP自然沒問題。但是互聯(lián)網(wǎng)的網(wǎng)絡(luò)環(huán)境就復(fù)雜得多了,在服務(wù)器的前面一般會有防火墻,在客戶端也可以設(shè)置代理服務(wù)器,也就是說與服務(wù)器三次握手的往往并非是客戶端,而是這些中間設(shè)備,這都會導(dǎo)致利用$_SERVER[“REMOTE_ADDR”]獲取的IP不準(zhǔn)確。而利用$_SERVER['HTTP_CLIENT_IP']和$_SERVER["HTTP_X_FORWARDED_FOR]獲取的IP直接來自客戶端發(fā)來的消息頭,不受中間設(shè)備的干擾,因而更為準(zhǔn)確,只是這也為***留下了利用的空間。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI