首頁  >  文章  >  後端開發  >  PHP漏洞全解(八)-HTTP響應拆分

PHP漏洞全解(八)-HTTP響應拆分

黄舟
黄舟原創
2016-12-22 09:44:441500瀏覽

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↙

PHP漏洞全解(八)-HTTP響應拆分

PHP漏洞全解(八)-HTTP響應拆分

回傳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回應表頭中,這些使用者的資料是有攻擊者精心設計的。
PHP漏洞全解(八)-HTTP響應拆分可能遭受HTTP請求回應拆分的函數包括以下幾個:

header(); setcookie(); session_id(); setrawcookie();

HTTP回應拆分通常發生在:

Location表頭:Location表頭:Location表頭:Location表頭:Location表頭將使用者的資料寫入cookies內

實例:

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-Alive

Content-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

PHP最新版中,已經不允許在HTTP表頭內出現換行字元

隱藏HTTP回應表頭PHP漏洞全解(八)-HTTP響應拆分

apachehttpd.conf,選項ServerTokens = Prode

apache中httpd.conf,選項ServerTokens = Prodm php中php.ini,選項expose_php = Off

 以上就是PHP漏洞全解(八)-HTTP回應分割的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn