經過 HTTP 頭進行 SQL 注入(轉)

英文原文:DatabaseTube,翻譯:開源中國php

在漏洞評估和滲透測試中,肯定目標應用程序的輸入向量是第一步。這篇文章解釋了別人是如何經過HTTP頭部對你的數據庫進行SQL注入攻擊的,以及討論下選擇哪一種漏洞掃描器測試SQL注入。html

做者:Yasser Aboukir, InfoSec Institutemysql

在漏洞評估和滲透測試中,肯定目標應用程序的輸入向量是第一步。有時,當作web應用程序測試時,SQL注入漏洞的測試用例一般侷限於特殊的輸入向量GET和POST變量。那麼對於其餘的HTTP頭部參數呢?難道他們不是潛在的SQL注入攻擊輸入向量嗎?咱們如何測試這些HTTP參數呢,以及使用什麼樣的漏洞掃描器查找出這些應用的漏洞呢?web

web應用掃描器裏輸入參數的覆蓋範圍sql

經過對60個商業和開源的黑盒web應用程序漏洞掃描器的比較,發表了這樣一篇文章:「掃描軍團:掃描精度評估&功能比較」。這個主要用於測試商業和開源軟件的urls漏洞的標準,已經被安全研究人員Shay Chen在2011年發佈了。數據庫

對於測試web應用程序的掃描器支持輸入參數覆蓋的狀況,咱們已經總結在下面的圖表中了。這些主要的輸入是:api

    • HTTP 查詢字符參數(GET):輸入參數經過URL發送
    • HTTP 正文參數(POST):輸入參數經過HTTP正文發送
    • HTTP Cookie參數:輸入參數經過HTTP cookie發送
    • HTTP Headers:HTTP提交應用程序使用的頭

經過 HTTP 頭進行 SQL 注入

這個圖表中明顯的顯示出,有75%的web應用程序掃描器不能發現HTTP Headers參數的相關漏洞。此外,這些掃描器中的70%,也錯誤的檢查了HTTP Cookies漏洞。這些比例徹底說明了這些掃描器在掃描輸入向量方面的能力,而不僅是簡單的解釋。對GET和POST的評分是比較合理的,一些自動化測試工具可能致使,在處理HTTP headers做爲一個SQL注入輸入向量時,出現不使人滿意的結果。瀏覽器

經過 HTTP 頭進行 SQL 注入

實際上,HTTP Headers和Cookie沒有獲得重視。所以,這兩個向量應該在測試用例中被考慮到。還有,當咱們使用的漏洞掃描器不支持這些特徵時,咱們應該考慮手工測試這些參數。安全

潛在的HTTP頭SQL注入服務器

HTTP頭字段

HTTP頭字段是超文本傳輸協議(HTTP)中請求和響應的部分信息,它們定義了HTTP傳輸的操做參數。

例如: 請求的 HTTP

GET / HTTP/1.1
Connection: Keep-Alive
Keep-Alive: 300
Accept:*/*
Host: host
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 ( .NET CLR 3.5.30729; .NET4.0E)
Cookie: guest_id=v1%3A1328019064; pid=v1%3A1328839311134

當咱們把會話標識保存在數據庫時,首先應該把HTTP Cookies做爲首要潛在的HTTP變量進行測試。在後面咱們將會看到一個使用Cookie進行SQL注入的實例。也有其餘和應用相關的HTTP頭信息。

X-Forwarded-For

X-Forwarded-For是HTTP頭的一個字段。它被認爲是客戶端經過HTTP代理或者負載均衡器鏈接到web服務端獲取源ip地址的一個標準。

咱們來看一個基於表單提交漏洞的例子。

$req = mysql_query(「SELECT user,password FROM admins WHERE user=’」.sanitize($_POST['user']).」‘ AND password=’」.md5($_POST['password']).」‘ AND ip_adr=’」.ip_adr().」‘」);

sanitize() 方法控制着登陸變量的正確性。

function sanitize($param){ if (is_numeric($param)) { return $param; } else { return mysql_real_escape_string($param); } }

讓咱們檢查下變量ip,它經過ip_addr()方法來獲得輸出的值。

function ip_adr() { if
(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip_adr = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip_adr = $_SERVER["REMOTE_ADDR"]; } if (preg_match(「#^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}#」,$ip_addr)) { return $ip_adr; } else { return $_SERVER["REMOTE_ADDR"]; } }

顯然,ip地址經過HTTP頭X_FORWARDED_FOR 獲得返回值。以後,經過preg_match方法來驗證是否至少存在一個合法的ip地址。事實上,在使用SQL查詢前HTTP_X_FORWARDED_FOR 環境變量沒有充分的過濾,這也就致使了在SQL查詢時,能夠經過這個字段注入任意SQL代碼。

這個頭字段能夠像下面這樣簡單地修改:

GET /index.php HTTP/1.1
Host: [host]
X_FORWARDED_FOR :127.0.0.1′ or 1=1#

這樣的修改將會致使繞過安全認證。

User-agent

用戶代理(user agent)是記錄軟件程序的客戶端信息的HTTP頭字段,他能夠用來統計目標和違規協議。在HTTP頭中應該包含它,這個字段的第一個空格前面是軟件的產品名稱,後面有一個可選的斜槓和版本號。

並非全部的應用程序都會被獲取到user-agent信息,可是有些應用程序利用它存儲一些信息(如:購物車)。在這種狀況下,咱們就有必要研究下user-agent頭存在的問題了。

HTTP查詢實例:

GET /index.php HTTP/1.1
Host: [host]
User-Agent: aaa’ or 1/*

Referer

Referer是另一個當應用程序沒有過濾存儲到數據庫時,容易發生SQL注入的HTTP頭。它是一個容許客戶端指定的可選頭部字段,經過它咱們能夠獲取到提交請求URI的服務器狀況。它容許服務器產生一系列的回退連接文檔,像感興趣的內容,日誌等。它也容許跟蹤那些壞連接以便維護。

例如:

GET /index.php HTTP/1.1
Host: [host]
User-Agent: aaa’ or 1/*
Referer: http://www.yaboukir.com

攻擊者目的?

衆所周知,注入漏洞位列OWASP十大web應用安全風險之首。攻擊者愈來愈多的尋找你的數據庫讀寫權限,不管這個注入點是向量輸入類型,GET,POST,Cookie或者其餘的HTTP頭;對於攻擊者重要的是,找到至少一個可以讓他們深刻利用的注入點.

手動測試Cookie漏洞

在這部分,咱們將介紹下檢查HTTP Cookie變量的幾種方法。

使用瀏覽器插件

Cookie Manager+ 容許查看,編輯和建立新的cookies,它也提供顯示cookies的一些額外信息,支持同時修改多個cookies,並且咱們能夠備份/恢復這些cookies。

安裝以後,在工具菜單中選擇Cookies Manager+,選擇一個和目標應用有關的Cookie 變量。

經過 HTTP 頭進行 SQL 注入

咱們來編輯下language_id這個變量,爲了判斷是否存在SQL注入漏洞,咱們在字段後面添加個「’」。
language_id內容以下:

經過 HTTP 頭進行 SQL 注入

而後刷新頁面,或者點擊這個應用程序內部的其餘連接,提交編輯後的HTTP cookie請求,返回結果出現一個SQL錯誤:

經過 HTTP 頭進行 SQL 注入

這個數據庫錯誤提醒咱們存在一個易產生SQL注入的漏洞。

Cookies Manager+ 優點是他很是易用,咱們能夠直接對cookie操做而且保存以前修改的cookie。

下面咱們將嘗試使用另外一個Firefox插件,來檢測目標的列數。

Tamper Data:

Tamper Data 是火狐下的一個很是強大的插件,它能夠顯示和修改HTTP/HTTPS頭,以及POST參數。

安裝以後,在工具欄菜單選擇Tamper Data,點擊按鈕Start Tamper開始修改HTTP請求。

當目標應用程序發送任何請求時,Tamper Data都會彈出一個對話框詢問咱們是否想要干預當前HTTP請求。

經過 HTTP 頭進行 SQL 注入

點擊Tamper後,將彈出一個Tamper詳細窗口:

經過 HTTP 頭進行 SQL 注入

咱們按上圖顯示的那樣:添加order by 4到HTTP cookie變量。從應用程序返回的響應是正常的。

經過 HTTP 頭進行 SQL 注入

咱們繼續增長: order by 5. 此次注入的響應以下:

經過 HTTP 頭進行 SQL 注入

因此,咱們可以推斷出列數爲4。

如今,爲了在更多查詢裏注入,咱們嘗試找出受影響的列。所以,咱們須要把下面的查詢添加到HTTP cookie變量language_id裏:

-1+UNION+ALL+SELECT+1,2,3,4

這個手段可能須要利用到一些高級的SQL注入技術。

使用自動化滲透測試掃描工具

以Sqlmap爲例

Sqlmap 是一個流行的開源的自動化滲透測試工具。這個程序能夠測試和利用SQL注入缺陷,而且能夠接管數據庫服務。

Sqlmap 支持HTTP cookie功能,因此它能夠經過兩種方式使用:

  • 當web應用程序須要時,基於cookies的安全驗證。
  • 頭值中SQL注入的檢測和利用。

Sqlmap默認測試全部的GET參數和POST參數。當-level參數值設置爲2或者更大時,它將測試HTTP Cookie 頭值。當這個值設置爲3或者更大時,測試也包含HTTP User_Agent和HTTP Referer頭值。你也能夠將你想用sqlmap測試的參數,用逗號分隔開進行測試,這樣就會繞過對-level的依賴。

Tested HTTP parameter Level in sqlmap
GET 1 (Default)
POST 1 (Default)
HTTP Cookie 2 ?
HTTP User-Agent 3 ?
HTTP Referer 3 ?

例如,測試GET參數id和HTTP User-agent,只需提供-p id,user-agent參數。

下面這個例子演示了DVWA (Damn Vulnerable Web Application)的HTTP cookie中名爲security的測試。

./sqlmap.py -u ‘http://127.0.0.1/vulnerabilities/sqli/?id=1&Submit=Submit#’
–cookie=’PHPSESSID=0e4jfbrgd8190ig3uba7rvsip1; security=low’
–string=’First name’ –dbs –level 3 -p PHPSESSID

-string標誌比較注入時有效頁面和無效頁面。另外一方面,-dbs標示用來枚舉數據庫管理系統。最後,-p標示用來表示強制測試PHPSESSID變量。

經過 HTTP 頭進行 SQL 注入

測試SQL注入的工具:經過精度選擇仍是向量覆蓋率選擇?

爲了回答這個問題,咱們使用了sectoolmarket.com網站提供的標準測試結果,咱們先假設候選的掃描程序的測試精度和向量覆蓋率有相同的重要性。咱們將GET。POST,HTTP Cookie和HTTP Headers做爲應該被支持的輸入向量。當全部的參數都被支持時,這個掃描器的覆蓋範圍的比率爲100%(4/4)。

咱們建議使用下面的算術方程式,也就是說對於漏洞掃描器的得分求一個平均值。

而後從獲得的檢測準確率的百分比中,咱們列出前14名的掃描器:

Rank Vulnerability Scanner Vendor Detection Rate Input Vector Coverage Average Score
1 Arachni Tasos Laskos 100.00% 100% 100.00%
2 Sqlmap sqlmap developers 97.06% 100% 98,53%
3 IBM AppScan IBM Security Sys Division 93.38% 100% 96,69%
4 Acunetix WVS Acunetix 89.71% 100% 94,85%
5 NTOSpider NT OBJECTives 85.29% 100% 92,64%
6 Nessus Tenable Network Security 82.35% 100% 91,17%
7 WebInspect HP Apps Security Center 75.74% 100% 87,87%
8 Burp Suite Pro PortSwigger 72.06% 100% 86,03%
9 Cenzic Pro Cenzic 63.24% 100% 81,62%
10 SkipFish Michal Zalewski – Google 50.74% 100% 75,37%
11 Wapiti OWASP 100.00% 50% 75.00%
12 Netsparker Mavituna Security 98.00% 50% 74.00%
13 Paros Pro MileSCAN Technologies 93.38% 50% 71,69%
14 ZAP OWASP 77,21% 50% 63,60%

咱們能夠經過對掃描器的掃描漏洞的精度和向量覆蓋率取到的平均值,作出下面一個圖表。

經過 HTTP 頭進行 SQL 注入

接下來作啥?

對於開發者

開發者應當把cookies和其餘保存的HTTP頭像表單輸入同樣對待,能經過常規的驗證。

對於測試者

HTTP頭的操做請求信息(尤爲是REFERE和USER-AGENT)對於確認應用程序是否存在SQL注入漏洞或者其餘缺陷(XSS)是很是重要的,最好的方法是在使用應用程序時定義和描述好每一種操做狀況。這些數據可能被存儲,提取和處理,像cookie,HTTP-headers(像HTTP_USER_AGENT),form-variables(顯示和隱藏),Ajax- ,JQusery-,XML-requests.

Yasser Aboukir 是INFOSEC機構的一個安全研究員. InfoSec Institute 是個提供CEH 認證和CCNA training訓練的機構.

參考文獻

[1] Penetration Testing with Improved Input Vector Identification, William G.J. Halfond, Shauvik Roy Choudhary, and Alessandro Orso College of Computing Georgia Institute of Technology

[2] Security Tools Benchmarking – A blog dedicated to aiding pen-testers in choosing tools that make a difference. By Shay-Chen http://sectooladdict.blogspot.com/2011/08/commercial-web-application-scanner.html

[3] https://en.wikipedia.org/wiki/X-Forwarded-For

[4] http://www.techbrunch.fr/securite/blind-sql-injection-header-http/

[5] http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html#user-agent

[6] http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html#z14

[7] https://addons.mozilla.org/en-US/firefox/addon/cookies-manager-plus/

[8] https://addons.mozilla.org/en-US/firefox/addon/tamper-data/

[9] http://sqlmap.sourceforge.net/doc/README.html

[10] http://msdn.microsoft.com/en-us/library/ms161953.aspx

 

http://blog.jobbole.com/35764/

相關文章
相關標籤/搜索