以下情況中會出現 HTTP協議頭注射漏洞:
1. 數據通過一個不可信賴的數據源進入 Web 應用程序,最常見的是 HTTP 請求。
2. 數據包含在一個 HTTP 響應頭文件里,未經驗證就發送給了 Web 用戶。
其中最常見的一種 Header Manipulation 攻擊是 HTTP Response Splitting。 為了成功地實施 Http Response Splitting 盜取,應用程序必須允許將那些包含 CR(回車,由 %0d 或
指定)和 LF(換行,由 %0a 或
指定)的字符輸入到頭文件中。
攻擊者利用這些字符不僅可以控制應用程序要發送的響應剩余頭文件和正文,還可以創建完全受其控制的其他響應。
1.<?php
2. $location = $_GET['some_location'];
3. header("location: $location");
4.?>
6.假設在請求中提交了一個由標準的字母和數字字符組成的字符串,如 "index.html",那么包含此 cookie 的 HTTP 響應可能表現為以下形式:
7.HTTP/1.1 200 OK
8….
9.location: index.html
10….
11.然而,因為該位置的值由未經驗證的用戶輸入組成,所以僅當提交給 some_location 的值不包含任何 CR 和 LF 字符時,響應才會保留這種形式。
14.如果攻擊者提交的是一個惡意字符串,比如 :
15."index.html
HTTP/1.1 200 OK
…",
16.那么此 HTTP 響應就會被分割成以下形式的兩個響應:
17.HTTP/1.1 200 OK
18.location: index.html
19.HTTP/1.1 200 OK
20….
21.顯 然,第二個響應已完全由攻擊者控制,攻擊者可以用所需的頭文件和正文內容構建該響應。攻擊者可以構建任意 HTTP 響應,從而發起多種形式的攻擊
HTTP協議頭注射漏洞解決方案
如今的許多現代應用程序服務器可以防止 HTTP 頭文件感染惡意字符。
例如,當新行傳遞到 header() 函數時,最新版本的 PHP 將生成一個警告并停止創建頭文件。 如果您的 PHP 版本能夠阻止設置帶有換行符的頭文件,則其具備對 HTTP Response Splitting 的防御能力。
代碼層面常見的解決方案:
1.嚴格檢查變量是否已經初始化
2.在設置HTTP響應頭的代碼中,過濾回車換行(%0d%0a、%0D%0A)字符
3.禁止header()函數中的參數外界可控
下一篇:Flash應用安全規范