在HTTP請求報文中,請求頭是咱們須要重點了解的部分,下面是請求頭中的主要內容:
(1) Host,指定被請求資源的URL。
(2) User-Agent,客戶端操做系統和瀏覽器的版本信息。不少網站經過它來判斷操做系統和瀏覽器類型,來展現對應的頁面。也有不少經過UA來判斷訪問是否合法,是用戶訪問仍是程序訪問等。
Windows版本與內核的對應關係:php
例題:貌似有點難
實驗吧 http://ctf5.shiyanbar.com/phpaudit/
打開連接以後,提示「錯誤!你的IP不在容許列表以內!」,而且給出了網站源碼。html
<?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不在訪問列表以內!"; } ?>
咱們首先來分析一下這段代碼。
$_SERVER是一個全局變量,與$_GET、$_POST同樣,可用於獲取客戶端的信息。在這段代碼中,使用了三種不一樣的獲取客戶端IP的方法,
$_SERVER[「REMOTE_ADDR」]獲取的是客戶端與服務器三次握手創建TCP鏈接時的IP,這個沒法僞造。
$_SERVER['HTTP_CLIENT_IP']和$_SERVER["HTTP_X_FORWARDED_FOR]都是經過HTTP頭來獲取信息,於是都是能夠僞造的。它們分別獲取的是HTTP請求頭「CLIENT-IP」和"X-FORWARDED-FOR"域的信息,不過「CLIENT-IP」不屬於標準的頭信息,而"X-FORWARDED-FOR"則是,於是修改該屬性更爲可取。.
好比咱們本身編寫下面一個腳本文件:
默認狀況下只能獲取到$_SERVER["REMOTE_ADDR"],這是由於HTTP請求頭中默認並無那兩個值。
咱們利用Burpsuite截獲報文,而後在其中增長兩個頭部信息,併發送出去,這時服務器能夠經過三種方法來獲取到客戶端的IP。
搞清楚這些問題以後,這道題目的解法就很簡單了,只要將「CLIENT-IP」或是「X-FORWARDED-FOR"修改成1.1.1.1便可。
最後仍是須要說明一下,既然$_SERVER[「REMOTE_ADDR」]獲取的是客戶端的真實IP,並且用戶沒法僞造,那麼服務器爲何不用這種方法來獲取客戶端IP呢?這是由於在局域網環境下,客戶端與服務器之間直接通訊,經過三次握手創建鏈接,此時獲取的IP天然沒問題。可是互聯網的網絡環境就複雜得多了,在服務器的前面通常會有防火牆,在客戶端也能夠設置代理服務器,也就是說與服務器三次握手的每每並不是是客戶端,而是這些中間設備,這都會致使利用$_SERVER[「REMOTE_ADDR」]獲取的IP不許確。而利用$_SERVER['HTTP_CLIENT_IP']和$_SERVER["HTTP_X_FORWARDED_FOR]獲取的IP直接來自客戶端發來的消息頭,不受中間設備的干擾,於是更爲準確,只是這也爲***留下了利用的空間。瀏覽器