HTTP請求的格式
1)請求資訊:例如“Get /index.php HTTP/1.1”,請求index.php檔案
2)表頭:例如“Host: localhost”,表示伺服器位址
3)空白行
4)資訊正文
「請求資訊」和「表頭」都必須使用換行字元(CRLF)來結尾,空白行只能包含換行符,不可以有其他空格符。
下面範例發送HTTP請求給伺服器www.yhsafe.com
GET /index.php HTTP/1.1↙ //請求訊息
Host:www.yhsafe.com↙ //表格頭
Host:www.yhsafe.com↙ //表格頭
↙
↙
↙符號表示回車鍵,在空白行之後還要在按一個空格才會發送HTTP請求,HTTP請求的表頭中只有Host表頭是必要的餓,其餘的HTTP表頭則是根據HTTP請求的內容而定。
HTTP請求的方法
1)GET:請求回應
2)HEAD:與GET相同的回應,只要求回應表頭
3)POST:傳送資料給處理,資料包含在伺服器資訊正文中
4)PUT:上傳檔案
5)DELETE:刪除檔案
6)TRACE:追蹤收到的請求
7)OPTIONS:返回伺服器所支援的HTTP請求的方法
8)CONNECT:8)CONNECT:將HTTP請求的連線轉換成透明的TCP/IP通道
HTTP回應的格式
伺服器在處理完客戶端所提出的HTTP請求後,會傳送下列回應。
1)第一行是狀態碼
2)第二行開始是其他資訊
狀態碼包含一個標識狀態的數字和一個描述狀態的單字。例如:
HTTP/1.1 200 OK
200是標識狀態的是數字,OK則是描述狀態的單詞,這個狀態碼標識請求成功。
HTTP請求和回應的範例
打開cmd輸入telnet,輸入open www.00aq.com 80
打開連接後輸入
GET /index.php HTTP/1.1↙
GET /index.php HTTP/1.1↙↙
↙
回傳HTTP回應的表頭
回函數原型
void header(string string [, bool replace [, int http_response_code]])
string是HTTP表頭的字串
如果replace為TRUE,表示要用目前的表頭替換之前相似的表頭頭;如果replace為FALSE,表示要使用多個相似的表頭,預設值為TRUE
http_response_code用來強制HTTP回應碼使用http_response_code的值
實例:
// pInternet s fsockopen(www.00aq.com, 80);
// 寫入HTTP請求表頭
fputs($fp, "GET / HTTP/1.1rn");
fputs($fp,rn ");
// HTTP回應的字串
$http_response = "";
while (!feof($fp))
{
// 256位元的fp, );
}
// 關閉Internet socket連線
fclose($fp);
// 顯示HTTP回應資訊
echo nl2br(htmlentities(
HTTP響應拆分攻擊
HTTP響應拆分是由於攻擊者經過精心設計利用電子郵件或鏈接,讓目標用戶利用一個請求產生兩個響應,前一個響應是伺服器的響應,而後一個則是攻擊者設計的響應。此攻擊之所以會發生,是因為WEB程式將使用者的資料置於HTTP回應表頭中,這些使用者的資料是有攻擊者精心設計的。
可能遭受HTTP請求回應拆分的函數包括以下幾個:
header("Location: " . $_GET['page' ]);
?>請求
GET /location.php?page=http://www.00aq.com HTTP/1.1↙
Host: lohost↙🜎1 302 Found
Date: Wed, 13 Jan 2010 03:44:24 GMT
Server: Apache/2.2.8 (Win32) PHP/5.2.6
X-Powered-By: PHP/5.2.6Location: //www.00aq.com
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
Connection: Keep-AliveContent-Type: text/html,連結訪問下面的連結訪問會直接出現一個登陸視窗
http://localhost/location.php?page=%0d%0aContent-Type:%20text/html%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text /html%0d%0aContent-Length:%20158%0d%0a%0d%0a帳號%20密碼%20
轉換成可讀字串為:
Content-Type: text/html
HTTP/1.1 2000 OK
Content-Type: text/html
Content-Length: 158
帳號
密碼
一個HTTP
header("Location: " . strtr($_GET['page'], array("r"=>"", "n"=>"")));
?>
2最新版本的PHP
隱藏HTTP回應表頭
apachehttpd.conf,選項ServerTokens = Prodeapache中httpd.conf,選項ServerTokens = Prodm php中php.ini,選項expose_php = Off 以上就是PHP漏洞全解(八)-HTTP回應分割的內容,更多相關內容請關注PHP中文網(www.php.cn)!