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