




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
項目背景及意義SQL注入攻擊是一種非常有效且破壞性很大的滲透手段。它是針對于數(shù)據(jù)庫的一種攻擊手段,通過利用數(shù)據(jù)庫的外部接口把惡意代碼插入到SQL語言中使數(shù)據(jù)庫服務器解析并執(zhí)行,以達到入侵目標數(shù)據(jù)庫及至整個操作系統(tǒng)的目的。了解和熟悉SQL注入原理,掌握防御SQL注入攻擊的原理和技巧就變得至關重要。SQL注入攻擊的普遍性、難捉摸性、簡易性等特點讓其成為了網(wǎng)絡中黑客主流攻擊方式之一。因為SQL注入是從正常的Web平臺入口進行請求訪問,和請求正常的Web頁面沒有什么區(qū)別,所以目前市面上除了專門的Web防御防火墻外,大部分防火墻都不會對這類SQL注入攻擊進行監(jiān)控和發(fā)出警報,若網(wǎng)站管理員沒有經(jīng)常查看IIS日志的經(jīng)驗和習慣,有可能被入侵很長一段時間后都沒有任何發(fā)覺。由于現(xiàn)在廣泛流行的惡意攻擊工具,SQL注入在近年來呈現(xiàn)一種增長的趨勢。據(jù)OWASP(開放式web應用程序安全項目)每隔三年更新一次的“十大安全隱患列表”,在近幾次公布的總結(jié)Web應用程序最可能、最常見、最危險的十大安全隱患中,SQL注入攻擊一直排列靠前。OWASPTOP102010中列出的最嚴重的Web應用程序的漏洞中,注入(Injection)風險位居第一。Web應用的發(fā)展越來越成熟,應用的各項技術發(fā)展得也越來越復雜。它們涵蓋了從外部動態(tài)展示INTERNET和內(nèi)部工作網(wǎng)絡到以WEB協(xié)議方式傳遞數(shù)據(jù)的企業(yè)工作應用(如文檔管理系統(tǒng)等)。這些系統(tǒng)的實用性及其數(shù)據(jù)存儲、處理內(nèi)容的機密性和敏感性對于企業(yè)的主要業(yè)務而言都非常重要。當前市面的注入攻擊檢測工具只能對單個網(wǎng)頁或者單個URL進行檢測和注入,無法對整個網(wǎng)站的漏洞進行檢測。而漏洞掃描工具可以對整個網(wǎng)站漏洞進行掃描卻無法進行進一步的注入攻擊檢測。很大程度上不能滿足開發(fā)人員和管理人員對網(wǎng)站SQL注入漏洞全面了解的要求。本研究的最終目的是分析SQL注入攻擊的類型、關鍵技術和原理,并研究SQL注入在實際應用中的操作方法,在此基礎之上,設計并開發(fā)了一套自動注入工具。因為惡意攻擊者不僅可以通過SQL注入攻擊對Web應用數(shù)據(jù)進行盜取、篡改信息,還可以進一步對于服務器進行惡意操作,并且植入木馬或者后門程序,甚至控制整個服務器,這就嚴重影響了應用的正常運行以及對于應用的信息安全帶來嚴重后果。所以,對于功能齊備的SQL注入攻擊掃描與檢測工具的研究與開發(fā)具,具有非常重要的現(xiàn)實意義。應用程序開發(fā)者或網(wǎng)站管理人員使用此工具對自已的網(wǎng)站進行安全檢測,以達到減小$。任主入的可能性。同時,在滲透測試工作中,對于安全測試也具有很大的幫助。研究內(nèi)容自動注入攻擊工具的研發(fā)本研究首先理解Web應用的工作原理,首先簡要概述Web應用系統(tǒng)通用的架構(gòu)模式,理解了構(gòu)建模式后能更清晰的了解SQL注入的產(chǎn)生過程,然后從Web應用的代碼層來分析介紹是什么引起了通用的SQL注入,然后研究介紹SQL注入漏洞的利用過程。從框架到利用逐步分析SQL注入的過程和利用,然后根據(jù)分析的內(nèi)容構(gòu)建SQL注入的自動化檢測及注入攻擊利用框架。SQL注入原理SQL注入的原理,是將SQL代碼插入或者非正常時添加到應用的參數(shù)當中,并且進行了一定的拼接傳入到了后臺的數(shù)據(jù)庫服務器,最終使服務器執(zhí)行了該拼接的惡意SQL命令。所有的是通過SQL語句執(zhí)行的應用過程均存在被攻擊的威脅,因為SQL的多樣多變性語言結(jié)構(gòu)特征使得攻擊者可以拼接構(gòu)建豐富的代碼編碼手段等來拼接語句來欺騙服務器。SQL注入攻擊的主要方式就是直接將命令插入到應用服務的表單參數(shù)中傳入到后臺數(shù)據(jù)庫查詢字符串中,這些參數(shù)就會被帶入到后臺數(shù)據(jù)庫服務器進行執(zhí)行解析,攻擊者便可以構(gòu)造惡意命令來達到攻擊目的。SQL注入檢測技術檢測發(fā)現(xiàn)SQL注入漏洞有一條簡單的規(guī)則:SQL注入是通過發(fā)送特殊數(shù)據(jù)來觸發(fā)異常操作。該規(guī)則包括如下含義:?檢測Web應用上所有的輸入數(shù)據(jù);?集合SQL語法,歸類所有可能觸發(fā)異常的數(shù)據(jù)類型;?檢測數(shù)據(jù)庫服務器應用響應中的異常。首先需要清楚Web瀏覽器向Web服務器發(fā)送請求的過程。不同的服務應用會有不同的體現(xiàn)方式,它們均處在基于Web的環(huán)境中,所以基本原理是相同的。識別和檢測應用接受的所有數(shù)據(jù),攻擊一般都會修改這些數(shù)據(jù),所以需要識別并分析服務器對它們的響應。有時響應中會直接包含來自數(shù)據(jù)庫的SQL錯誤,有時需要不斷的方式來檢測和確定響應中細微的差別。章節(jié)安排本論文章節(jié)安排如下:第一章緒論:綜述此研究設計的背景意義以及研究內(nèi)容。第二章SQL注入技術研究:主要對SQL注入攻擊方式過程和攻擊特點進行歸類、識別,首先理解Web應用的工作原理,概述Web應用通用的構(gòu)建方式,為理解SQL注入的產(chǎn)生過程提供一些背景知識,接下來從Web應用的代碼層介紹引發(fā)SQL注入的因素以及哪些開發(fā)實踐和行為會引發(fā)SQL注入。分析SQL注入過程和利用,并架構(gòu)如何將SQL注入的發(fā)現(xiàn)過程自動化以提高檢測簡單SQL注入的框架。第三章SQL注入攻擊技術研究:根據(jù)SQL注入技術,研究利用數(shù)據(jù)庫中的功能來攻擊系統(tǒng)端口的技術。數(shù)數(shù)據(jù)庫大多均帶有豐富的數(shù)據(jù)庫編程功能,可以利用SQL注入漏洞來訪問文件系統(tǒng)以執(zhí)行有效的任務,可以在基礎操作上執(zhí)行各種命令,擴大范圍攻擊的利用技術細節(jié)。當發(fā)現(xiàn)SQL注入漏洞以及初步的利用獲取數(shù)據(jù)后,可以利用SQL注入漏洞來訪問文件系統(tǒng)來擴大滲透范圍。還可以在操作系統(tǒng)上執(zhí)行各種命令,攻擊可以使用它們擴展數(shù)據(jù)庫的可達區(qū)域并在更大的范圍內(nèi)發(fā)動攻擊。第四章注入高級技巧研究:Web應用通常會使用過濾應用,設計這些過濾的目的就是防御SQL注入在內(nèi)的常見攻擊。這些過濾方式可以是位于web應用的代碼層中,也可以通過第三方的外部實現(xiàn),如Web應用防火墻(WAF)或入侵防御系統(tǒng)(IPS)。當注入攻擊碰到這些防御應用,若想進一步利用漏洞,則需要尋找一種能避開過濾器防護的高級方法以便惡意輸入傳遞給易受攻擊的代碼。第五章自動注入工具框架設計:根據(jù)項目的設計需求,以及Python編程語言的特點,對自動注入攻擊工具整體框架進行分析和設計。并且分析功能模塊中的重點和關鍵技術。第六章SQL注入測試:自動注入攻擊實例測試。第2章SQL注入技術Web應用工作原理和架構(gòu)簡析不論是用何種腳本語言開發(fā)的Web應用,都有一個共同點:具有交互性并且大多是數(shù)據(jù)庫驅(qū)動的?;跀?shù)據(jù)庫驅(qū)動的Web應用一般都包含三層:apresentationtier(表示層,Web瀏覽器或呈現(xiàn)引擎)、alogictier(邏輯層,如C#、ASP、.NET、PHP、JSP等編程語言)和astoragetier(存儲層,如MicrosoftSQLServer、MySQL、Oracle等數(shù)據(jù)庫)。Web瀏覽器(表示層,如InternetExplorer>Safari、Firefox等)向中間層(邏輯層)發(fā)送請求,中間層通過查詢、解析數(shù)據(jù)庫(存儲層)來響應該請求。圖2-1簡單的三層架構(gòu)Web三層架構(gòu)解決方案沒有擴展性,研究人員不斷地對Web三層架構(gòu)進行改進優(yōu)化,在可維護性和可擴展性的基礎上建立了一種新概念:n層應用開發(fā)模式。其中有一種就是Web四層架構(gòu)解決方案,該方案在Web服務器和數(shù)據(jù)庫之間使用了一層中間件服務器(通常稱為應用服務器)。下圖2-2中,Web瀏覽器(表示層)向中間層(邏輯層)發(fā)送請求,后者一次調(diào)用由位于應用層的應用服務器所提供的API,應用層通過查詢、更新數(shù)據(jù)庫(存儲層)來響應該請求。圖2-2四層架構(gòu)識別SQL注入SQL注入就是程序員對程序中動態(tài)的SQL語句沒有作嚴格的過濾或檢測,導致黑客能在注入點提交非法的SQL語句,導致程序和服務器的信息被泄漏。由于SQL注入的入門門檻低,隱蔽性好,破壞性大,殺毒軟件無法查殺,是當前最主流的入侵手段。SQL注入攻擊的本質(zhì),就是服務器將用戶傳入的數(shù)據(jù)在數(shù)據(jù)庫中當成了SQL代碼執(zhí)行。這里便有兩個關鍵因素:第一個是用戶有權(quán)限輸入數(shù)據(jù);第二個是服務器應用數(shù)據(jù)執(zhí)行了用戶傳入的數(shù)據(jù)。識別數(shù)據(jù)輸入Web環(huán)境是一種C/S(客戶端/服務器)架構(gòu)??蛻舳耸褂脼g覽器向Web服務器發(fā)送請求并等待響應。Web服務器接收到請求后,通過查詢、解析數(shù)據(jù)庫,將響應發(fā)送回客戶端。很明顯,雙方便必須使用一種協(xié)議作為雙方的約定,這種傳輸協(xié)議就是HTTP。首先,必須識別遠程Web應用所接收的所有數(shù)據(jù)輸入。HTTP協(xié)議定義了可以發(fā)送給服務器的操作方式,這里只關注研究與SQL注入攻擊相關的兩種方法:GET和POST。GET請求:GET是向服務器發(fā)索取數(shù)據(jù)的一種請求,是一種請求服務器的HTTP方法。使用GET請求時,信息是顯示在URL中的。GET請求對用戶是透明的,如下例,WEB服務器的GET請求如下所示:GET/general/vote/show/webst/VOTE_ID=131HTTP/Accept:text/html,application/xml;q=,application/xhtml+xml,image/png,image/webp,image/jpeg,image/gif,image/x-xbitmap,*/*;q=Accept-Language:zh-CN,zh;q=,en;q=Accept-Encoding:gzip,deflateProxy-Connection:Keep-Alive該請求中與數(shù)據(jù)查詢相關的參數(shù)在URL中,格式如下所示:VOTE_ID=131上述示例中包含一個參數(shù):VOTE_ID。服務器應用將會把參數(shù)值帶入數(shù)據(jù)庫中解析執(zhí)行,然后將響應結(jié)果返回給客戶端。POST請求:POST請求是作為HTTP消息的實際內(nèi)容發(fā)送給web服務器的HTTP方法。在瀏覽器中填寫表單并點擊Submit按鈕時通常使用該方法。下面的例子是瀏覽器發(fā)送給遠程WEB服務器的內(nèi)容,請求如下所示:POST/general/vote/show/webst/ITEM_ID=345HTTP/Accept:text/html,application/xml;q=,application/xhtml+xml,image/png,image/webp,image/jpeg,image/gif,image/x-xbitmap,*/*;q=Accept-Language:zh-CN,zh;q=,en;q=Accept-Encoding:gzip,deflateConnection:Keep-AliveContent-Length:40Content-Type:application/x-www-form-urlencodedcontent=POST+TEST&submit=+%CC%E1+%BD%BB+其他注入數(shù)據(jù):除了GET或POST參數(shù)傳輸檢索數(shù)據(jù)外,HTTP請求的其他內(nèi)容也可能會觸發(fā)SQL注入漏洞。Cookie就是個很典型的例子。Cookie由服務器發(fā)發(fā)送到用戶端的瀏覽器,并會在用戶端每次請求中都會回發(fā)給服務器。Cookie一般被用于辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數(shù)據(jù)。由此可見,用戶完全可以控制發(fā)送給服務器的Cookie內(nèi)容,所以Cookie也作為一種有效的用戶數(shù)據(jù)輸入方式和易受注入影響的對象。如:Accept:text/html,application/xhtml+xml,application/xml;q=,*/*;q=Accept-Language:en-US,en;q=Accept-Encoding:gzip,deflateConnection:keep-alive該應用系統(tǒng)存在一個cookie注入漏洞,漏洞代碼下圖2-3,程序代碼沒有任何過濾就將用戶傳入的cookie參數(shù)帶入到數(shù)據(jù)庫中進行執(zhí)行。用戶只要利用抓包工具將傳入的數(shù)據(jù)包截下來修改cookie字段的數(shù)據(jù)就可以將惡意命令傳入到后臺數(shù)據(jù)庫進行執(zhí)行。圖2-3存在漏洞的代碼文件操作請求參數(shù)下面先通過介紹一個非常簡單的例子來熟悉SQL注入漏洞。頁面收到一個名為VOTE_ID的參數(shù)?,F(xiàn)在開始開始手動修改VOTE_ID參數(shù)的值,將其改為意外的數(shù)值。按照下列方式進行首次嘗試:上例中使用不存在的類型名向服務器發(fā)出請求。服務器返回如下圖2-4響應:圖2-4服務器響應結(jié)果1該警告是當用戶嘗試從空結(jié)果集中讀取記錄時,數(shù)據(jù)庫返回的一個MYSQL數(shù)據(jù)庫錯誤。該錯誤表明遠程應用未能正確處理意外的數(shù)據(jù)。繼續(xù)進行推理操作,現(xiàn)在向之前發(fā)送的值添加一個單引號('),發(fā)送下列請求:下圖2-5是服務器的響應:圖2-5服務器響應結(jié)果2服務器返回下列錯誤:請聯(lián)系管理員錯誤#1064:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'\''atline1SQL語句:SELECTEND_DATEfromVOTE_TITLEwhereVOTE_ID=attacker\'文件:D:/***root/general/vote/show/webst/不難發(fā)現(xiàn),有些應用在處理用戶數(shù)據(jù)時會返意想不到的結(jié)果。WEB檢測的異常并非都是由SQL注入漏洞引起的,還會受到很多其他因素的影響。這里還可以通過進行另一個測試來識別SQLServer和Oracle中的漏洞。向Web服務發(fā)送下面兩個請求:在MYSQL中,與其等價的請求為:'1如果兩個請求結(jié)果相同,則很可能存在SQL注入漏洞。數(shù)據(jù)庫響應測試SQL注入攻擊漏洞時,可能會從WEB服務器收到不同的數(shù)據(jù)庫錯誤響應,所以對于這些錯誤的意義需要熟悉和掌握。圖2-6展示了產(chǎn)生SQL注入錯誤的過程和WEB服務器對錯誤進行處理得過程。圖2-6產(chǎn)生SQL注入錯誤的過程中的信息流產(chǎn)生SQL注入錯誤的過程中發(fā)生了以下事件:用戶端發(fā)送請求數(shù)據(jù),嘗試觸發(fā)SQL注入漏洞。假設用戶發(fā)送了一個帶單引號的值。WEB服務器接收到用戶端的請求數(shù)據(jù),并向數(shù)據(jù)庫服務器發(fā)送SQL查詢。本例中,在WEB服務器執(zhí)行的SQL語句中包含了用戶輸入?yún)?shù)并且構(gòu)造了一條SQL查詢,該查詢因末尾存在單引號而導致語法錯誤。數(shù)據(jù)庫服務器接收執(zhí)行了格式不正確的SQL查詢,并向WEB服務器返回一條錯誤消息。WEB服務器接收到的來自數(shù)據(jù)庫的錯誤向用戶發(fā)送HTML響應。下面列舉常見的SQL錯誤。1)SQLServer錯誤在請求中插入一個單引號在參數(shù)中會產(chǎn)生數(shù)據(jù)庫錯誤。對于SQLServer中,遠程應用返回類似于下列內(nèi)容的錯誤,圖2-7所示:圖2-7SQLServer錯誤通過上面的例子,我們可以確定運行在數(shù)據(jù)庫上的遠程SQL語句與下面的內(nèi)容相似:SELECT*FROMNewsWHEREArticleID='2650''該Web應用未檢測單引號,所以數(shù)據(jù)庫服務器響應返回了一個錯誤。2)MYSQL錯誤下面介紹一下典型的mysql錯誤。MYSQL可以在很多架構(gòu)和操作系統(tǒng)下執(zhí)行,兼容性很好,常見的配置是在裝有l(wèi)inux操作系統(tǒng)的apacheweb服務器上運行php,但它也可以出現(xiàn)在很多其他場合中。下列錯誤通常表明存在MYSQL注入漏洞:Warning:mysql_fetch_array(1):suppliedargumentisnotavalidMySQLresultresourcein/var/www/online9自動尋找SQL注入對于SQL注入工具的開發(fā),如何的適度的自動化SQL注入的請求是其中的關鍵。識別數(shù)據(jù)輸入是可以自動化的內(nèi)容,它涉及搜索WEB站點和尋找GET及POST請求。數(shù)據(jù)注入也可以自動完成,因為上一階段已經(jīng)獲取了發(fā)送請求所需要的所有數(shù)據(jù)。若想自動尋找SQL注入漏洞,主要問題在于檢測遠程服務器響應中的異常。對于管理員來說,區(qū)別一個錯誤頁面或其他類型的異常頁面非常容易;但對于程序來說,要識別出服務器異常輸出,有時會非常困難。某些情況下,應用可以很容易地檢測到數(shù)據(jù)庫發(fā)生了錯誤,如以下情形下:WEB應用服務器返回由數(shù)據(jù)庫產(chǎn)生的SQL錯誤;WEB應用服務器返回HTTP500內(nèi)部服務器無法執(zhí)行錯誤;某些SQL盲注情況下。但對于其他情況,應用系統(tǒng)將很難識別存在的漏洞,而且很容易出現(xiàn)遺漏。所以,自動發(fā)現(xiàn)SQL注入存在著一定的局限性,自定義的測試和手動測試也顯得非常重要。SQL盲注很多時候,WEB服務器為了安全設置關閉了錯誤回顯,但是這可以阻擋住SQL注入攻擊嗎當發(fā)現(xiàn)一個SQL注入點,但應用只提供了一個自定義的通用的錯誤頁面;或者雖然提供了正常的頁面,但與期望的測試響應存在一些小的差異?;谶@種情況下的SQL注入攻擊測試,都屬于SQL盲注。所謂“盲注”,就是在在注入攻擊Web應用時,攻擊語句被帶入到后臺數(shù)據(jù)庫中執(zhí)行,但是服務器查不會返回錯誤或者執(zhí)行結(jié)果的回顯的情況下進行的注入攻擊。服務器沒有了攻擊者期望的錯誤回顯,對于攻擊者來說沒有了非常重要的SQL注入攻擊“調(diào)試信息”,所以攻擊者必須找到一個方法來從側(cè)面驗證注入的SQL語句是否得到成功執(zhí)行。注入帶判定的參數(shù)(TimingAttack)當已經(jīng)識別可能存在SQL注入漏洞,但又沒有正常的回顯的時候,要想進一步確認和檢測漏洞,一般可以提交包含副作用的查詢參數(shù)。比較老的技術是使用timingattack,計時攻擊。2011年3月27日,一個叫TinKodes]的黑客在著名的安全郵件列表FullDisclosure上公布了他入侵的細節(jié)。這次入侵事件,就是因為一個SQL盲注漏洞引起的。據(jù)黑客公布描述,當時這個漏洞是出現(xiàn)在下面這個頁面,如圖2-8:圖2-8漏洞頁面可以看到網(wǎng)址URL:id=1170,通過修改參數(shù)id后的數(shù)值,服務器將返回不同的查詢的客戶信息。這個漏洞中,id=這個參數(shù)鏈接就是一個很隱蔽的“SQL盲注”漏洞,攻擊者通過精心構(gòu)造id參數(shù)的URL,就可以進行SQL注入攻擊。利用通常的SQL語句比如“and1=2”在此鏈接下是無法看出異常的,因為應用服務器不會返回任何異常的數(shù)據(jù)。在這里,TinKodes]利用“SQL盲注”的一個技巧:TimingAttack,用來確認漏洞是否存在。在MYSQL數(shù)據(jù)庫中,有個函數(shù):BENCHMARK。,可以用來測試函數(shù)性能。同時它含有兩個參數(shù):BENCHMARK(count,expr)函數(shù)執(zhí)行的結(jié)果,是將表達式expr執(zhí)行count次。比如:mysql>SELECTBENCHMARK(1000000,ENCODE('hello','dllk));TOC\o"1-5"\h\z++\o"CurrentDocument"|BENCHMARK(1000000,ENCODE('hello','dllk'))||0|++1rowinsetsec)就將ENCODE('hello','dllk)執(zhí)行了1000000次,共用秒。因此,攻擊者就可以利用MYSQL數(shù)據(jù)庫中的這個函數(shù)BENCHMARK。,在傳入到后臺服務器的參數(shù)中讓同一個SQL函數(shù)在數(shù)據(jù)庫中執(zhí)行若干次,然后通過服務器執(zhí)行該SQL語句的時間的長短變化,就可以用來側(cè)面判別出SQL注入攻擊語句是否已經(jīng)成功的執(zhí)行。這個攻擊利用技巧在盲注中被稱為TimingAttack。在此次的攻擊中,攻擊者接下來就是利用TimingAttack攻擊。比如構(gòu)造的攻擊參數(shù)id值如圖2-9:圖2-9TimingAttack攻擊語句1這段攻擊Payload首先進行的是判斷庫名的第一個字母是否為小寫的w,即CHAR(119)。如果判斷結(jié)果為真,就會執(zhí)行后面的BENCHMARK()函數(shù),執(zhí)行該函數(shù)就會造成較長的延時;如果判斷結(jié)果為假,則該攻擊語句很快就會被執(zhí)行完畢,頁面將很快得到加載。這樣,攻擊者就可以通過構(gòu)造攻擊Payload猜解遍歷出所有的庫名字母,直到將整個數(shù)據(jù)庫名全部猜解完成為止,然后進一步可以猜解遍歷出數(shù)據(jù)表明、列明和數(shù)據(jù)內(nèi)容,將可以將整個數(shù)據(jù)中的內(nèi)容下載過來。同時,攻擊者還可以通過以下Payload獲取到更多有用信息,圖2-10:圖2-10TimingAttack攻擊語句2此外,攻擊者可以通過利用DumpFile的方法如圖圖2-11,來寫入一個webshell木馬:圖2-11DumpFile寫如websehllTimingAttack是SQL盲注中的一種高級技巧。在各種不同的數(shù)據(jù)庫中,都有與BENCHMARK()函數(shù)類似的東西。如MYSQL:BENCHMARK(1000000,MD(1))orSLEEP(5)PostgreSQL:PG_SLEEP(5)orGENERATE_SERIES(1,1000000)MSSQLServer:WAITFORDELAY'0:0:5'如,在MicrosoftSQLServer中,可使用如下SQL代碼來產(chǎn)生一個8秒的暫停:WAITFORDELAY'0:0:8'同時,攻擊者還可以利用應用服務器的回顯輸出來進行判斷。例如,若將注入下面的字符串:'AND'1'='2插入到一個搜索字段中,將產(chǎn)生與'OR'1'='1不同的結(jié)果響應。ParameterSplittingandBalancing技術如果注入帶判斷的函數(shù)不起作用,可以嘗試"parametersplittingandbalancing”(參數(shù)拆分與平衡)技術。拆分是指拆分正常的參數(shù)輸入,平衡則是指保證最終的查詢與正常的輸入是一致。其基本思想是:將正常的請求參數(shù)進行拆分,然后使用SQL語句關鍵字對它們進行修改,最終需保證與原數(shù)據(jù)不同,使得后臺數(shù)據(jù)庫服務器解析執(zhí)行帶入的參數(shù)時,與正常的參數(shù)請求一樣的同時也帶入了“非法”的請求。SELECTreview_content,review_authorFROMreviewsWHEREid=5如果使用2+3替換5,那么輸入應用中的參數(shù)將不同于原始請求中的輸入,但SQL數(shù)據(jù)執(zhí)行在結(jié)果上是等價相同的:SELECTreview_content,review_authorFROMreviewsWHEREid=2+3這種方式不僅僅只局限于數(shù)字值型。SELECTCOUNT(id)FROMreviewsWHEREreview_aouthor='dllk'可以使用特定的數(shù)據(jù)庫運算符將dllk字符串拆分,向Web服務應用提供與dllk相對應的不同的參數(shù)輸入。對于再oracle數(shù)據(jù)庫的利用中,可以使用“||”運算符來鏈接兩個字符串:SELECTCOUNT(id)FROMreviewsWHEREreview_aouthor='dl'||'lk'它與之前的第一個查詢在最終執(zhí)行的參數(shù)是等價的。下表2-1是帶子查詢占位符的拆分字符串參數(shù):表2-1帶子查詢占位符的拆分字符串第3章SQL注入攻擊技術研究識別數(shù)據(jù)庫要成功進行SQL注入攻擊,還有重要的一點就是需要探測出服務器正在使用的數(shù)據(jù)庫系統(tǒng)DBMS。若是攻擊者連數(shù)據(jù)庫系統(tǒng)都無從判斷,就不可能構(gòu)造出有效的“惡意”參數(shù)來進行SQL注入,也就無法實施攻擊。通常WEB架構(gòu)技術可以使我們猜測驗證出數(shù)據(jù)庫系統(tǒng)。例如,ASP和.NET的WEB服務應用通常使用的事MicrosoftSQLServer作為數(shù)據(jù)庫系統(tǒng),而PHP應用則很可能使用MYSQL數(shù)據(jù)庫。如果是用JAVA、JSP等編寫的,那么很有可能使用的是Oracle數(shù)據(jù)庫。在識別SQL注入漏洞所存在的數(shù)據(jù)庫中,如果不是SQL盲注,通常情況下可以很快的判斷出數(shù)據(jù)庫系統(tǒng)。如果數(shù)據(jù)庫響應返回出SQL注入的錯誤消息,一般都會在報錯的響應中可以找到是何數(shù)據(jù)庫系統(tǒng)的線索。如圖3-1SQLServer錯誤信息:圖3-1SQLServer錯誤信息根據(jù)報錯信息可以很直接的就判斷數(shù)據(jù)庫類型為MicrosoftSQLServer。這種方法就是添加一個單引號將使得構(gòu)造的SQL語句參數(shù)帶入到數(shù)據(jù)庫服務器當作SQL語句來執(zhí)行,這將產(chǎn)生一條語法錯誤而暴露出錯誤信息。如圖3-2SQLServer錯誤信息:圖3-2SQLServer錯誤信息在錯誤消息中明確提到了“MySQL”,還附加了一些關于出錯內(nèi)容的有用細節(jié)。如下表3-1返回各種DBMS所對應的查詢:表3-1返回各種DBMS所對應的查詢例如,對于SQLServer2000SP4來說,執(zhí)行SELECT@@version查詢時,將得到如圖3-3所示信息:圖3-3SQLServer2000服務器返回信息如果應用服務器并不能直接的在響應中返回所想要的數(shù)據(jù)信息,則需要一種間接的方法來觸發(fā)獲得想要的信息。不同的數(shù)據(jù)庫,在語法查詢方式上有略微的不同,不同的數(shù)據(jù)庫系統(tǒng)就會有不同的查詢方式。比如一個簡單查詢?nèi)缦拢篠ELECT'somestring'該查詢語句對于大多數(shù)主流的數(shù)據(jù)庫系統(tǒng)都是有效的,對于不同的數(shù)據(jù)庫系統(tǒng),將查詢的字符串分成兩個字串的SQL語句的時候還是存在有細微的差異的,就SQLServer、Mysql、Oracle來說,如下表3-2:表3-2字符串分成兩個字串的SQL語句假設Web應用中沒有可以利用的SQL注入字符串參數(shù),則可以使用之前數(shù)字參數(shù)類似的技術。這樣的話就需要一條針對特定情況特定技術的SQL語句,使得在服務器經(jīng)過執(zhí)行SQL語句后計算后生成一個數(shù)字。在下表3-3所示列舉的SQL語句中,在對應的數(shù)據(jù)庫系統(tǒng)上執(zhí)行對應的SQL語句后都會生成一個整數(shù),而若在其他不同的數(shù)據(jù)庫下執(zhí)行語句的話,就將會產(chǎn)生錯誤。表3-3從數(shù)字函數(shù)推斷DBMS版本注入語句獲取數(shù)據(jù)UNION語句是數(shù)據(jù)庫管理員經(jīng)常使用函數(shù)之一。使用UNION的SQL語句,可以連接兩條或多條SELECT語句的聯(lián)合查詢得到結(jié)果?;菊Z法如下所示:SELECTcolumn-1,column-2,...,column-NFROMtable-1UNIONSELECTcolumn-1,column-2,...,column-NFROMtable-2執(zhí)行該查詢后,返回結(jié)果得到的是由兩個SELECT語句返回結(jié)果組成的表。通常在默認情況下,得到的返回結(jié)果中只會包含不同的數(shù)值。如果想在查詢的結(jié)果中將重復的值也顯示出來,只需要稍微修改下語法即可:SELECTcolumn-1,column-2,...,column-NFROMtable-1UNIONALLSELECTcolumn-1,column-2,...,column-NFROMtable-2在SQL注入測試攻擊中,數(shù)據(jù)庫的UNION查詢方法對于攻擊來說作用很大:如果服務器可以正常返回第一個查詢得到的數(shù)據(jù),若想修改加入數(shù)據(jù)庫UNION查詢,便可以利用讀取到攻擊者想要讀取的該數(shù)據(jù)庫用戶,然后就可以訪問的其他的任何一張數(shù)據(jù)表。如,如果想要找到頁面執(zhí)行的查詢的數(shù)據(jù)表所返回的列數(shù),則可以按下列方式請求URL,直到不再返回錯誤位置信息:獲取列的另一種方法是使用ORDERBY語句,ORDERBY語句并不是通過注入另一個查詢語句來獲得查詢結(jié)果。通過增大ORDERBY子語句中代表列的數(shù)字就可以來識別查詢中的列數(shù),如下所示:若在以上使用ORDERBY9查詢時收到第一個錯誤回顯,就意味著查詢的數(shù)據(jù)庫中包含的數(shù)據(jù)有8列。當攻擊識別出數(shù)據(jù)庫的列數(shù)后,接下來就是選擇數(shù)據(jù)中的其中一列或幾列來繼續(xù)攻擊查詢數(shù)據(jù)庫中的數(shù)據(jù)了。因此,如果攻擊者想提取一個數(shù)據(jù)庫字符串值,就可以通過它來保存正在尋找的數(shù)據(jù),以便找到一個字符串類型的列。攻擊者可以用NULL來很容易的實現(xiàn),只需要重復的使用字符串示例替換掉NULL即可。例如,如果原始的數(shù)據(jù)查詢中包含4列數(shù)據(jù),則可以做如下嘗試獲得字符串類型的列:只要數(shù)據(jù)庫沒有返回錯誤,就可知道剛才存儲dllk值的列保存的一個字符串,因此就可以用它來顯示需要的值。例如,若數(shù)據(jù)中第二列可以保存一個字符串字段,則當請求下面的URL即可存儲到第二列中:而下列URL則可以同時檢索當前用戶名和當前數(shù)據(jù)庫名:攻擊者通過精心構(gòu)造使用UNIONSELECT的SQL語句注入,就可以獲取整張數(shù)據(jù)表。假設攻擊者已經(jīng)得到當前數(shù)據(jù)庫包含一張名為users的表,表中包含userid、first_name、和second_name列。則可以使用下面的方式來獲取用戶名:使用UNION注入任意查詢來攻擊數(shù)據(jù)庫,是一種既快捷又有效的攻擊手段技巧。但該方法并不通用,WEB應用也沒那么容易就輕易的泄漏數(shù)據(jù)庫數(shù)據(jù)。在MicrosoftSQLServer中,對于攻擊者來說,攻擊者最想了解的是當前執(zhí)行數(shù)據(jù)庫查詢的應用用戶是否是以系統(tǒng)管理員帳戶(SA)運行的。因為權(quán)限的不同,所能進行的查詢和操作就不同,在后續(xù)的擴大滲透中,在數(shù)據(jù)庫上執(zhí)行的敏感的提權(quán)操作也會有所不同,對于攻擊者的攻擊的程度也不同。為確定是否為SA權(quán)限,可以使用下列注入語句查詢:IF(system_user='sa')WAITFORDELAY'0:0:5'--該查詢將轉(zhuǎn)換為下列URL:語句中的System_user在SQLServer中是T-SQL函數(shù),這個函數(shù)在數(shù)據(jù)庫中執(zhí)行完成后會返回數(shù)據(jù)為當前登錄的用戶名。該Payload的執(zhí)行,是根據(jù)system_user函數(shù)執(zhí)行的值來判定是否執(zhí)行WAITFOR函數(shù)(等待6秒)。攻擊者可以通過Web應用查詢后返回的結(jié)果加載HTML數(shù)據(jù)所花費的時間來判定是否為SA用戶。該Payload的SQL查詢語句尾部的兩條橫線是注釋作用,可以注釋掉所有可能影響原查詢結(jié)果的除偽造拼接的SQL攻擊查詢代碼。上面基于時間的判定的技巧很靈活,但是基于時間判定的的方法不適合提取大量信息。可以利用基于錯誤的判定的方法,如:is_srvrolemember()也是SQLServer中的T-SQL函數(shù),當它被執(zhí)行,可以返回下列值:1:用戶屬于該組。0:用戶不屬于該組。NULL:該組不存在。我們假設用戶屬于webadmin組,那么URL中的id的參數(shù)應該等于12/1,因此,Web應用就會正常返回數(shù)據(jù)頁面。如果當前的用戶并不是webadmin組中的成員,那么此時URL中的id值就是12/0;這樣的話將會導致SQL語句查詢失敗,Web應用返回的結(jié)果是一個錯誤。對于返回的錯誤來說,錯誤的具體消息內(nèi)容肯定會各有千秋:錯誤可能只是由Web服務器相應錯誤返回的‘500internalservererror’,錯誤信息也有可能包含了完整的SQLServer錯誤消息,甚至由于管理員的限制,錯誤的信息是管理員主動設置的自定義的404錯誤頁面。對于WAITFOR的基于時間的方法來說,基于錯誤來判定的方法有個很大的優(yōu)點就是效率,基于時間的方法涉及查詢延遲的問題,基于錯誤的判定的方法的請求可以馬上返回注入利用的結(jié)果。當然基于錯誤的方法缺點就是將會觸發(fā)很多錯誤,這些錯誤將會被記入到服務器的日志當中,這對于攻擊者來說是不愿意見到的。不過,可以稍作修改優(yōu)化,例:%2B是“+”的URL編碼。最終將按照下列式子為id參數(shù)賦值:id=24+(casewhen(system_user='sa')then1else0end)如果執(zhí)行的不是sa,那么id=24,請求等價于:而如果執(zhí)行查詢的用戶是sa,那么id=25,請求就等價于:所以,攻擊者就可以可以根據(jù)Web服務器查詢后返回的結(jié)果中加載的HTML中包含的字符串的不同來判斷當前用戶是否為sa。提升權(quán)限所有的數(shù)據(jù)庫系統(tǒng)管理員都可以對數(shù)據(jù)庫用戶的權(quán)限進行很詳細的很細微的設置和控制。管理員可以為每個用戶賦予一定量的操作執(zhí)行權(quán)限來實現(xiàn)用戶對數(shù)據(jù)存儲信息的訪問。通常一個數(shù)據(jù)庫系統(tǒng)都可能包含了很多個數(shù)據(jù)庫,但是攻擊者利用的數(shù)據(jù)庫的用戶權(quán)限只能訪問其中某一個數(shù)據(jù)庫,在正常的情況下,其他的數(shù)據(jù)庫都不能進行任何操作,但是攻擊者目前掌控的數(shù)據(jù)庫中并沒有想要的信息?;蛘呤钱斍皵?shù)據(jù)庫的用戶權(quán)限可以讀取所有數(shù)據(jù)庫的內(nèi)容,但是只有對于當前數(shù)據(jù)庫有寫權(quán)限,對于其他數(shù)據(jù)庫不能執(zhí)行修改操作。攻擊者若想獲取其他數(shù)據(jù)庫的操作或者對于系統(tǒng)的其他地方進行操作,就需要更高的權(quán)限。這個過程就是提升權(quán)限。SQLServer數(shù)據(jù)庫的提權(quán)在MicrosoftSQLServer中,使用命令OPENROWSET是一個很好也比較典型的的數(shù)據(jù)庫攻擊方法。OPENROWSET是可以實現(xiàn)SQLServer對遠程的OLEDB數(shù)據(jù)源進行一次性連接,而DBA則可以用來檢索和查詢遠程數(shù)據(jù)庫上的數(shù)據(jù),這樣就可以作為連接數(shù)據(jù)庫的一種方法。下面是典型調(diào)用OPENROWSET的方法,例:SQLServer的OPENROWSET在SQL注入攻擊中有多種攻擊方式和技巧。例如在SQLServer2000上,攻擊者可以使用OPENROWSET來進行暴力猜解SA密碼并提升權(quán)限。例如:若dllktest是正確的密碼,那么執(zhí)行該查詢并會返回結(jié)果A;但若密碼不正確,那么將收到下面的返回信息:LoginFailedforuser'sa'.這樣就可以構(gòu)造一種暴力猜解SA密碼的方法。如果找到正確的密碼,接著就可以使用sp_addsrolemember存儲過程來將用戶添加到sysadmin管理員組,這樣就可以很容易地提升權(quán)限。命令OPENROWSET同時也可以用于掃描SQLServer存在的弱口令,如:Oracle數(shù)據(jù)庫的提權(quán)對于Oracle數(shù)據(jù)庫,通常通過Web應用的來進行SQL注入利用提升權(quán)限的很困難。因為在Oracle數(shù)據(jù)庫中,大多數(shù)的提權(quán)攻擊方法都需要前提是PL/SQL注入,而PL/SQL這種注入漏洞通常都很少見。若碰到PL/SQL注入漏洞,則可以通過注入PL/SQL代碼來提升權(quán)限,以及在數(shù)據(jù)庫服務器上操作系統(tǒng)命令。在非PL/SQL注入漏洞中,存在有一個方法,漏洞是出在ORACLE的mod_plsql組件中。該漏洞的利用示例如下URL:攻擊者在SQL的接口應用上提權(quán)要簡單得多。大多數(shù)提權(quán)過程都是用的以下的步驟:(1)首先創(chuàng)建一DBA權(quán)限并授權(quán)給public的Payload。然后將Payload注入存在漏洞的PL/SQL存儲過程中。Payload如圖3-4所示:圖3-4創(chuàng)建DBA權(quán)限給public(2)下圖圖3-5然后將該Payload注入到包中:圖3-5Payload注入(3)圖3-6所示激活啟用DBA:圖3-6激活DBA(4)圖3-7所示從public中取消DBA:圖3-7從public取消DBA當前session雖然依然有DBA權(quán)限,但不再是ORACLE權(quán)限設置中了。使用這種攻擊的局限就是前提利用要有CREATEPROCEDURE的權(quán)限。獲取口令hashSQL注入利用要想攻擊得到口令hash,所以也必須構(gòu)造一定的SQL語法傳入數(shù)據(jù)庫服務器進行查詢檢索。一般很多WEB應用也是將WEB管理員的帳號密碼存放到數(shù)據(jù)庫中。(1)SQLServer如果,。匚注入利用的環(huán)境是MicrosoftSQLServer,但根據(jù)數(shù)據(jù)庫版本的不同,利用的方式會差別很大。但不管是那個版本的數(shù)據(jù)庫,都得需要有管理員權(quán)限猜能訪問得到口令hash。舉例若是數(shù)據(jù)庫為SQLServer2000,hash是存儲在master數(shù)據(jù)庫的sysxlogins表里。我們可以通過下面的語句進行查詢得到:SELECTname,passeordFROM.SysxloginsSQLServer2000數(shù)據(jù)中,存儲的hash是由pwdencrypt()這個函數(shù)生成的。這個函數(shù)并不是公開的,它會生成帶鹽的salthash,其中的salt是一個和時間相關的函數(shù)。(2)MySQLMySQL數(shù)據(jù)中,hash是存儲在表中。如下是可以獲取用戶名等的SQL查詢語句:SELECTname,passwordFROM;MYSQL數(shù)據(jù)庫中的hash是通過PASSWORD(涵數(shù)生成的,不同的MYSQL版本函數(shù)生成hash的算法不一樣。(3)Oracle在Oracle數(shù)據(jù)庫中,hash是存儲在$表的password列中。其中dba_users的視圖指向于$表,但是自Oracle11g開始,hash不再出現(xiàn)在dba_users視圖中了,Oracle的hash是數(shù)據(jù)加密標準(DES)hash。$表中包含Oracle數(shù)據(jù)庫的用戶以及hash??梢允褂孟铝蠸QL查詢來獲得hash,如圖3-8所示:圖3-8SQL查詢獲得hash針對OracleDES角色hash,如圖3-9所示:圖3-9查詢OracleDES角色hash針對OracleSHA1hash(Oracle11g以上),如圖3-10所示:圖3-10Oracle11g以上查詢SHA1hashOracle數(shù)據(jù)庫安裝時附帶了很多其他的默認表,這些表中有時也存儲著hash,有時甚至還包含明文密碼。很多時候明文通常都是在表中。文件讀寫技術MySQL數(shù)據(jù)庫的文件讀寫MySQL提供了一個很敏感的功能,該功能經(jīng)常被攻擊者利用,該功能是SQL語句中可以使用LOADDATAINFILE和LOAD_FILE命令來進行文件讀取,可以將文件以文本文件的方式讀取存儲到數(shù)據(jù)庫中。下面來示例LOADDATAINFILE的使用方法。創(chuàng)建一個文本文件,名為,如圖3-11所示:圖3-11內(nèi)容然后在MySQL控制臺下運行下列命令,作用是創(chuàng)建一張表來保存信息,如圖3-12所示:圖3-12創(chuàng)建表然后使用下面的命令導入數(shù)據(jù)到表中,如圖3-13所示:圖3-13導入數(shù)據(jù)到表然后查詢剛新建的表,可以看到文本文件已經(jīng)導入到數(shù)據(jù)庫中,如圖3-14所示:圖3-14表中導入的數(shù)據(jù)MySQL數(shù)據(jù)庫還提供了LOAD_FILE函數(shù)來進行文件的讀取,該函數(shù)可以不用創(chuàng)建數(shù)據(jù)表就可以直接查看到結(jié)果,如圖3-15所示:圖3-15LOAD_FILE文件讀取攻擊者通常利用上面的命令函數(shù)來讀取應用系統(tǒng)的配置文件,甚至可以通過讀取的編碼轉(zhuǎn)換變形等讀取到系統(tǒng)的hash文件。對于MySQL寫文件,與在文章前面的說到的MYSQLLOADDATAINFILE讀文件命令有一個相對應的寫文件的命令slectintooutfile(dumpfile),就可以用來寫文件。MySQL的這條命令可以將select語句的記過直接寫入到一個完全可讀文件中,同時,MySQL的dumpfile允許直接寫入二進制文件。寫文件示例,如圖3-16所示:圖3-16MYSQLoutfile寫文件上述示例中的SQL語句執(zhí)行后,會在/tmp目錄中創(chuàng)建一個文件。SQLServer數(shù)據(jù)庫的文件讀寫對于MicrosoftSQLServer的文件讀取方法,攻擊者通常借用的最多的就是BULKINSERT語句。下圖3-17所示是使用MicrosoftSQLQueryAnalyzer進行的測試示例:圖3-17SQLServer文件讀取測試SQLServer的寫文件可以使用前面說的讀取文件的的方法來有效地向文件系統(tǒng)寫文件。示例如圖3-18所示:圖3-18SQLServer寫文件測試MicrosoftSQLServer還可以從數(shù)據(jù)源創(chuàng)建文件的能力,方法如圖3-19所示:圖3-19SQLServer創(chuàng)建文件對于SQLServer的SQL注入攻擊利用,很多SQL注入工具的都是使用xp_cmdshell來實現(xiàn)文件操作。利用xp_cmdshell寫文件最簡單的方法,就是使用重定向符>>來創(chuàng)建文本文件,如圖3-20所示:圖3-20SQLServer利用xp_cmdshell寫文件示例Oracle數(shù)據(jù)庫的文件讀寫Oracle數(shù)據(jù)庫提供了很多與系統(tǒng)底層的交互,有很多種方法底層系統(tǒng)操作讀取文件的方法,但是其中大多數(shù)方法都是基于PL/SQL代碼才能夠運行。Oracle中通過三種不同的接口來訪問文件:Utl_fiel_dir/OracledirectoriesJavaOracleText在默認情況下,非特殊權(quán)限的用戶是沒有權(quán)限在操作系統(tǒng)層讀寫文件的。Oracle數(shù)據(jù)中攻擊者讀文件最常用的是使用utl_file_dir和Oracledirectories這兩種方法。使用utl_file_dir可以讓Oracle數(shù)據(jù)庫在系統(tǒng)中指定一個目錄,數(shù)據(jù)庫的用戶都可以在指定的該目錄中進行文件讀寫。若設置utl_file_dir的值為*,則用數(shù)據(jù)庫寫文件的操作就沒有了目錄限制。下表3-4所示列舉的就是使用utl_file_dir/Oracledirectories的方法基于Oracle數(shù)據(jù)庫來讀取文件的情景:表3-4Oracle數(shù)據(jù)庫utl_file_dir/Oracledirectories的方法讀文件下面提供的就是一個Oracle讀取文件的示例,示例中利用PL/SQL代碼讀取了位于MEDIA_DIR目錄下的一個文本文件,讀取了其中的1000個字節(jié)。如下圖3-21所示圖3-21Oracle讀取文件自Oracle9i開始,Oracle數(shù)據(jù)庫提供了從外部表讀文件的功能。Oracles數(shù)據(jù)庫可以使用SQL*Loader或OracleDatapump從一定結(jié)構(gòu)的文件中讀取到文件。下面的示例是針對于從外部表讀取文件的代碼,如圖3-22所示:圖3-22從外部表讀取文件在Oracle數(shù)據(jù)庫中,除了使用utl_file_dir、Oracledirectory這兩種方法外,還可以使用Java程序來進行文件的讀寫。可以在MacroIvaldis的Web站點上找到該方法的示例代碼,網(wǎng)址為:除以上方法外,還有一種是利用OracleText,這是一種比較少見的讀取文件的技術。它需要將想讀取的文件插入到一張表中,然后創(chuàng)建一個全文索引或者等待索引創(chuàng)建成功的過程狀態(tài)下即可。下面示例代碼就是利用OracleText方法將插入到一張表中,用以來讀取該文件,如圖3-23所示:TASLE£ile^1idHUMBERPREWARXEY,VARCHfiR{255}UtTIQUE;otformat寸ARCHA甘{后】iWSEttTrtrrofilesVALUES(lfrc;\boot.lri'rNTTLLh;C^-JATEIN&EXQtT快上卓目也心2ISctnsya.cunLextPARAMETERS(!datastareflle_datastcreformatcoluminformat1)?--retxievedatafrgm(hqItSKtknd愣XSelecttaken_teMtfrcun.c!e$file?圖3-23OracleText方法將插入到一張表中對于Oracle數(shù)據(jù)庫寫文件,與讀文件一樣,同樣提供了很多從底層操作系統(tǒng)創(chuàng)建文件的方法,可使用Utl_file、DBMS_ADVISOR、外部表、Java、操作系統(tǒng)命令和重定向等方法來進行文件的寫入操作。從Oracle9i以后,使用utl_file方法可以在文件系統(tǒng)上寫入二進制文件。其中,DBMS_ADVISOR基本是創(chuàng)建文件最快捷的方式,下面的示例創(chuàng)建一個的文件,內(nèi)容為dllktest:CreatedirectoryEXTas'C\'EXECSYS.('dllktest'.'EXT','')從Oracle10g以后,可以使用外部表創(chuàng)建一個包含用戶名和密碼的文件,如圖3-24所示:圖3-24從外部創(chuàng)建包含用戶名和密碼的文件可以在MacroIvaldi的Web站點上找到Java的示例代碼:執(zhí)彳丁系統(tǒng)命令執(zhí)行系統(tǒng)命令根據(jù)數(shù)據(jù)庫來操作分別有以下幾種方式:MySQL執(zhí)行系統(tǒng)命令MySQL數(shù)據(jù)庫本身并不支持執(zhí)行shell命令。但大多數(shù)情況下,若MYSQL數(shù)據(jù)庫服務器和WEB服務器沒有分離,是位于同一服務器上時,這樣攻擊者可以先使用“selectintoDUMPFILE”的方法在服務器上寫上一個webshell,然后通過webshell來對操作系統(tǒng)進行控制執(zhí)行命令。SQLServer執(zhí)行系統(tǒng)命令在MicrosoftSQLServer中,可以利用xp_cmdshell的方法來直接執(zhí)行所要執(zhí)行的命令。如下圖3-25所示:圖3-25xp_cmdshell執(zhí)行命令SQLServer在默認情況下,是禁止對組件"xp_cmdshell”以及"”的訪問的,同時,此組件通常也在管理員進行服務器安全配置時被關閉。但是系統(tǒng)管理員還是可以通過使用sp_configure的方法來啟用"xp_cmdshell”,這樣就給攻擊者有了可趁之機。而攻擊者可以通過執(zhí)行其他的幾條指令進行恢復:;EXECsp_configure‘showadvancedoptions’,1-;RECONFIGUREWITHOVERRIDE-;EXECsp_configure‘xp_cmdshell’,1-;RECONFIGUREWITHOVERRIDE-;EXECsp_configure‘showadvancedoptions’,0-dbccaddextendedproc("sp_oacreate”,””)dbccaddextendedproc("xp_cmdshell”,””)Oracle執(zhí)行系統(tǒng)命令不同的Oracle數(shù)據(jù)庫版本,執(zhí)行命令的方法也各有差異。利用DBMS_SCHEDULER圖3-26利用DBMS_SCHEDULER執(zhí)行系統(tǒng)命令本地PL/SQL下列的示例代碼使用的是本地PL/SQL為Public授予為DBA權(quán)限。其中Grant命令通常是在SYS用戶執(zhí)行的命令,通常為INSERTINTOSYSAUTH$命令。在下面的示例中,執(zhí)行后,創(chuàng)建了一個名為的文件,并且是由Sqlplus來執(zhí)行的文本文件。示例如下圖3-27所示:圖3-27本地PL/SQL執(zhí)行系統(tǒng)命令其他方法除了上面的提到的執(zhí)行命令的方法外,還可以使用數(shù)據(jù)庫中的其他功能來執(zhí)行系統(tǒng)命令:Altersystemsetevents本地PL/SQL9i緩沖區(qū)溢出+shellcode自定義代碼當然,對于大多數(shù)攻擊者來說,通常攻擊者都是通過數(shù)據(jù)庫來寫入一個木馬文件,然后通過基于調(diào)用數(shù)據(jù)庫組件或者其他的組件的木馬文件來進行命令執(zhí)行。第4章SQL注入高級手法過濾繞過機制概述Web應用通常會使用過濾應用,設計這些過濾的目的就是防御SQL注入在內(nèi)的常見攻擊。這些過濾方式可以是位于web應用的代碼層中,也可以通過第三方的外部實現(xiàn),如Web應用防火墻(WAF)或入侵防御系統(tǒng)(IPS)。在SQL注入攻擊中,遇到的過濾關鍵字一般是:SQL關鍵字:landlexeclinsertlselectldeletelupdatelcountl*l%lchrlmidlmasterltruncatelcharldeclare等;特定的單個字符,比如引號標記等;空白符;截斷符等。可能還會有代碼層級別的過濾器,使用的方法包括編碼、消除敏感字符等等各種方法,用來過濾掉畸形的數(shù)據(jù)串等,從輸入中去除掉帶有攻擊型的敏感字符然后正常處理剩下的內(nèi)容,甚至采集識別進行二次渲染生成新的文件。這些受到保護的web應用層,要是想利用漏洞,則需要尋找一種能避開過濾器防護的方法以便惡意輸入傳遞給易受攻擊的代碼。常見方法大小寫變換如果對于關鍵字過濾的不是太嚴格或者機制不夠完善,攻擊者有時則可以通過變換攻擊字符串參數(shù)的字符大小寫就可以繞過過濾機制。此技巧的基礎就是因為數(shù)據(jù)庫不區(qū)分執(zhí)行的SQL語句代碼的大小寫。例如,如果下面的輸入被攔截:'UNIONSELECTpasswordFROMwebUsersWHEREusername='admin'--則可以通過下列方法繞過過濾:'uNioNSeLecTpasswordFroMwebUserswHeReusername='admin'--?使用編碼的方式編碼是一種很具有技巧性的技術。通常攻擊使用的是URL編碼,其最基本的方式就是將問題字符的十六進制用ASCII碼來編碼替換它們,并且在轉(zhuǎn)換后的ASCII編碼前面加上%。如,單引號字符的ASCII碼對應的為0x27,其URL編碼的表示方式為%27,空格則為%20。而在有時,基本的URL編碼確實被一些防御過濾軟件或者過濾機制過濾掉了,但是攻擊者還可以將編碼轉(zhuǎn)換為雙URL編碼,這種情況通常就是用在有些Web應用本身會將用戶輸入的內(nèi)容多次解碼,而攻擊者就使攻擊的參數(shù)在解碼完畢之前繞過濾防護。?構(gòu)造畸形數(shù)據(jù)包的方式攻擊者可以通過構(gòu)造畸形數(shù)據(jù)包來繞過過濾,其核心思想就是:原本是GET的數(shù)據(jù)包,用POST的方式提交。反之亦可。這個利用技巧利用的是接參函數(shù)的不規(guī)范造成的漏洞。?使用空字節(jié)繞過過濾機制對于在應用代碼外部實現(xiàn)的SQL注入過濾,如入侵檢測系統(tǒng)或WAF,很多時候?qū)τ谶@些情況,都可以嘗試使用空字節(jié)來繞過過濾。要想利用空字節(jié)進行攻擊,只需要在過濾程序?qū)τ谧柚沟墓舸a前插入一個使用URL編碼的空字節(jié)(%00)即可。?利用截斷技巧繞過過濾機制有些過濾防護系統(tǒng)采用對用戶輸入的數(shù)據(jù)進行截斷或者調(diào)整數(shù)據(jù)使其在預定義的最大長度,有時可能是為了盡量阻止緩沖區(qū)溢出攻擊的行為。截斷用戶在SQL查詢中提供的輸入會引發(fā)漏洞。在MicrosoftSQLServer中,參數(shù)化查詢必須為每個字符串參數(shù)指定最大長度。如果參數(shù)中包含更長的輸入,那么輸入會被截斷成為預定的最大長度。假設應用允許忘記口令的用戶通過提交email的形式來找回原來的口令,如果應用接收過長的輸入并在SQL查詢中將其截斷,那么攻擊者便可以提交下列的輸入:接下來當應用向原來提供的email發(fā)送口令是,還會向攻擊者發(fā)送一份副本,這樣攻擊者就可以成功攻擊受害者的賬戶。構(gòu)造超長數(shù)據(jù)包的方式對于某些過濾系統(tǒng),如WAF等,攻擊者可以盡量超長的構(gòu)造一些正常的數(shù)據(jù)請求,然后再在后面帶入SQL注入的攻擊參數(shù),因為很多過濾系統(tǒng)在對于提交的數(shù)據(jù)數(shù)據(jù)超出某個長度以后,將不能有效的進行過濾判斷。二階SQL注入對于前面所提到的SQL注入攻擊,都是屬于常規(guī)性的。前面提到的SQL注入在單個HTTP請求和響應中的流程如下所示:(1)攻擊者HTTP請求中插入了精心構(gòu)造的參數(shù);(2)應用服務器處理輸入的參數(shù),參數(shù)經(jīng)過了拼接導致SQL查詢被執(zhí)行;(3)應用服務器有可能會對攻擊者請求的參數(shù)返回輸出結(jié)果。而這里提到另外一種高級的注入手法就是二階SQL注入。這種攻擊事情的過程如下所示:(1)攻擊者HTTP請求中插入了精心構(gòu)造的參數(shù);(2)應用服務器存儲該輸入的參數(shù)準備處理;(3)攻擊者進行第二次HTTP請求,同時插入了精心構(gòu)造的參數(shù);(4)應用服務器將處理第二次請求,應用服務器將會檢索已存儲的參數(shù)并處理,因此導致了SQL查詢被執(zhí)行;(5)應用服務器有可能會對第二次請求的參數(shù)響應返回輸出結(jié)果。二階SQL注入屬于一種更細微的漏洞,通常更難被檢查到。下面舉例說明,假設一個通訊簿的應用,在應用系統(tǒng)中,用戶可以保存朋友的聯(lián)系信息。用戶在創(chuàng)建一個聯(lián)系人時,用戶可以輸入姓名、Email和地址等信息。應用系統(tǒng)使用INSERT語句為該聯(lián)系人創(chuàng)建新的數(shù)據(jù)庫記錄,并將輸入中的引號雙重編碼以防止SQL注入攻擊。流程圖如圖4-1所示:圖4-1通訊簿的添加記錄流程圖而當用戶修改已存在的聯(lián)系人時,應用系統(tǒng)將會先使用SELECT檢索該聯(lián)系人的信息,并保存到內(nèi)存中;然后使用用戶提供的新信息更新相關數(shù)據(jù),并在此對該輸入中的引號進行重新編碼,而用戶沒有更新的數(shù)據(jù)項將在內(nèi)存中將保持不變;最后使用UPDATE語句將內(nèi)存中的數(shù)據(jù)回寫到數(shù)據(jù)中。這個過程的流程圖如圖4-2所示如下:圖4-2通訊薄應用更新數(shù)據(jù)流程圖假設上例中引號雙重編碼可以有效的防止常規(guī)的SQL注入。但是,這樣的情況下應用系統(tǒng)仍然易受到二階SQL注入攻擊。若攻擊者想利用該漏洞,首先需要使用某個字段中的攻擊payload創(chuàng)建一個聯(lián)系人?,F(xiàn)假設數(shù)據(jù)庫系統(tǒng)是MicrosoftSQLServer,使用下列語句創(chuàng)建一個聯(lián)系人;a'+@version+'a輸入中的引號被雙重編碼,最終INSERT語句會如下所示:聯(lián)系人的姓名安全的保存到數(shù)據(jù)庫中了。接下來更新創(chuàng)建聯(lián)系人,只需要提供一個新值即可。應用首先檢索已存在聯(lián)系人的信息:SELECT*RROMwebUserswherecontactid=123檢索出來的信息保存在內(nèi)存中。應用系統(tǒng)使用新提供的數(shù)據(jù)值替換內(nèi)存中的值,并將引號雙重編碼。然后執(zhí)行UPDATE語句,將信息保存到數(shù)據(jù)庫中:UPDATEwebUsersSETname='a'+@@version+'a',address='mianyangswust',...WHEREcontactid=123到上面這個語句后,攻擊以成功執(zhí)行并修改了應用的查詢。當查看更新過的聯(lián)系人的細節(jié)信息時,顯示出來的是:Name:aMicrosoftSQLServer....Copyright(c)....(Build2600:)aAddress:mianyangswust通訊薄應用系統(tǒng)成功的執(zhí)行了攻擊者構(gòu)造的SQL語句,這就證明該應用存在SQL注入攻擊漏洞,并且可被攻擊利用?;旌瞎艋旌瞎艟褪侵甘褂枚喾N攻擊技巧來對應用服務器進行攻擊,同時也可以就SQL注入漏洞與其他漏洞或者技術相結(jié)合起來來進行應用服務器攻擊。如,在有時,可以利用SQL注入漏洞和和其他不同的漏洞或bug進行結(jié)合,如跨站腳本(XSS)漏洞。若進行SQL注入利用攻擊的時候,應用服務器并沒有給出返回的輸出回顯,可以利用該漏洞與反射XSS漏洞相結(jié)合來側(cè)面判斷SQL注入攻擊是否成功執(zhí)行來當成返回回顯。在不同的數(shù)據(jù)庫類型和版本中,還有很多各自可利用的小bug和漏洞可以與SQL注入進行結(jié)合。第5章自動注入攻擊工具框架設計設計需求項目的需求是軟件設計和實現(xiàn)的最根本需求依據(jù)。根據(jù)SQL注入漏洞的利用過程,據(jù)分析的內(nèi)容構(gòu)建SQL注入的自動化檢測及注入攻擊利用框架。根據(jù)SQL注入攻擊的過程設計開發(fā)一個SQL注入攻擊程序,實現(xiàn)以下功能:(1)能夠自動掃描識別兩種以上類型的SQL注入攻擊;(2)能夠利用SQL注入漏洞,進行數(shù)據(jù)庫攻擊,如猜測帳號、口令等;(3)至少具有對四種類型的數(shù)據(jù)庫進行進行攻擊檢測,能夠?qū)?shù)據(jù)庫的結(jié)構(gòu)信息進行猜解,能對數(shù)據(jù)庫進行數(shù)據(jù)操作;(4)能夠利用SQL注入執(zhí)行系統(tǒng)命令,能對有一定權(quán)限的目標進行文件操作和提權(quán)操作;(5)能一定程度上自定義注入攻擊以繞過簡單防注入機制。自動注入攻擊工具框架總體設計通過對Python程序編寫的學習和研究,軟件分成三個主體部分:自動抓取目標Web網(wǎng)站鏈接;檢測是否存在SQL注入漏洞;進行SQL注入攻擊。自動注入攻擊工具框架總體架構(gòu)圖如圖5-1所示:圖5-1自動注入攻擊工具框架總體架構(gòu)圖關鍵技術需要識別Web應用程序是否具有SQL注入漏洞,首先必須得要找出目標Web應用程序的網(wǎng)站鏈接,并且識別該鏈接是否為可控制輸入數(shù)據(jù)。只有有了這個基礎,才有可能是產(chǎn)生可控的數(shù)據(jù)交互。然后通過遍歷發(fā)送HTTP請求以及特殊數(shù)據(jù)來觸發(fā)和進一步驗證,通過服務器處理發(fā)送的數(shù)據(jù)所產(chǎn)生的反應來一步步的判斷SQL注入。對于識別和抓取目標Web系統(tǒng)的鏈接,設計有兩條思路,一為通SWeb爬蟲實現(xiàn)對于Web系統(tǒng)進行鏈接爬行和抓取,然后判斷是否存在SQL注入;一為通過搜索引擎收錄的目標Web鏈接,將之抓取過來進行注入分析。網(wǎng)絡爬蟲技術Python內(nèi)置的很多模塊對于網(wǎng)頁爬取都有很大的作用,無需再借?Web?覽器或者服務器就能處理HTML文檔。使用httplib,urlparse,urllib2庫用來爬取鏈接、數(shù)據(jù)、圖像、Cookie等都非常便利。若想對于目標進行鏈接爬取,首先需要解析URL,通過Python的urlparse模塊可以很輕松的分解URL并重新組裝。關鍵代碼如圖5-2所示:圖5-2python使用urlparse解析URL當解析了URL鏈接后,更重要的是分析頁面的內(nèi)容,因為頁面中的內(nèi)容有可能還包含著該Web網(wǎng)站的其他鏈接,這樣通過一層層的爬取,就能將Web站點中的頁面基本爬取完畢。Python中的HTMLParser模塊能夠根據(jù)HTML文檔中的標簽來快捷、簡便地解析HTML文檔,這對網(wǎng)頁內(nèi)鏈接的抓取就顯得易如反掌。先定義一個HTMLParser的新的類,使用覆蓋handle_starttag()的方法來顯示所有鏈接中的href標簽屬性,然后創(chuàng)建好一個實例用來返回HTMLParser的對象,這樣,就可以使用(url)打開并讀取HTML文檔中的內(nèi)容了。對于HTML文件中包含的鏈接內(nèi)容,可以使用read()函數(shù)讀取將數(shù)據(jù)傳遞給HTMLParser對象,HTMLParser的feed函數(shù)可以接收到數(shù)據(jù),這樣就可以抓取到頁面內(nèi)的鏈接了。同時ChilkatPythonModule是一個很強大的商業(yè)版Python工具開發(fā)包,Chilkat可以處理網(wǎng)絡、加密、壓縮解壓縮、XML等等內(nèi)容。關鍵代碼如圖5-3所示:圖5-3爬蟲抓取鏈接判斷,。1注入利用谷歌抓取鏈接利用爬蟲技術來對Web目標的鏈接進行抓取確實不失為一個好方法,但很多時候,由于服務器安全設置或者是防火墻的設置,并不允許同一臺服務器的與目標服務器建立大量的連接請求。很多時候網(wǎng)絡爬蟲的效率和效果并不是很好。這時就可以利用搜索引擎搜索的關鍵字來定位與目標相關的Web鏈接,然后直接將抓取的鏈接進行SQL注入檢測。核心代碼如圖5-4所示:圖5-4抓取谷歌收錄的Web鏈接識別服務器響應信息當在測試SQL注入漏洞時,發(fā)送給目?Web服務器一些非法或者意外的字符后,需要根據(jù)服務器返回的信息來判斷是否存在SQL注入漏洞或者是SQL注入攻擊是否成功執(zhí)行。這就需要識別服務器響應的信息。需要對于頁面中的內(nèi)容進行識別。對于SQL注入頁面判斷來說,常規(guī)的注入,基于錯誤的頁面可以通過判定訪問的正常頁面與返回的頁面進行比較。首先記錄正常頁面的信息,然后發(fā)送非法請求后再次記錄返回的頁面信息,通過分析出產(chǎn)生錯誤的頁面中數(shù)據(jù)的不同來確定頁面是否有誤。如正常頁面中網(wǎng)頁包含字符"true”,通過,。匚注入測試請求后返回的爆錯頁面中并不會存在字符“true”,這樣就可以通過分析定義關鍵字“true”來判斷測試是否成功。而這其中關鍵的地方就在于怎樣讓程序來識別頁面內(nèi)容中的信息。同樣在Python中,可以使用HTMLParser模塊,使用覆蓋handle_data()的方法來解析文本數(shù)據(jù)。關鍵代碼如圖5-5所示:圖5-5python解析文本數(shù)據(jù)在對于一些服務器的返回爆錯信息中,可以直接通過識別服務器上的每一個HTTP響應對象中的respose包含的數(shù)字“狀態(tài)碼”。對于服務器的httperror,urlopen會產(chǎn)生一個httperror。典型的錯誤包含“404”(頁面無法找到),“403”(禁止請求),和“401”(需驗證)。提取Cookie信息使用Python從頁面中提取cookies信息,可以使用cookielib模塊中的LWPCookieJar(涵數(shù)創(chuàng)建一個cookiejar來實現(xiàn)。LWPCookieJar(涵數(shù)可以返回一個從硬盤加載和存儲的Cookie的對象。然后使用urllib2模塊的build_opener([handler,...])函數(shù)創(chuàng)建opener對象來處理cookies。然后使用urlopen(Request)函數(shù)來打開HTML文件,HTML文件中的Cookie就會被存放在LWPCookieJar對象中,之后,使用save(filename)函數(shù)就獲取到Cookie了。利用爬蟲技術來對Web目標的鏈接進行抓取確實不失為一個好方法,但很多時候,由于服務器安全設置或者是防火墻的設置,并不允許同一臺服務器的與目標服務器建立大量的連接請求。很多時候網(wǎng)絡爬蟲的效率和效果并不是很好。核心代碼如下圖5-6所示:圖5-6Python提取Cookie信息SQL注入工具模塊實現(xiàn)這里以Mysql數(shù)據(jù)庫為示例。檢測流程如下圖5-7所示:圖5-7SQL注入檢測流程存活測試,通過發(fā)送數(shù)據(jù)包GET或POST的方式根據(jù)服務器的響應來判斷目標Web是否存活。對于網(wǎng)頁的穩(wěn)定性測試,因為只有動態(tài)的網(wǎng)頁才會有數(shù)據(jù)的交互,對于純粹的html頁面是沒有直接的數(shù)據(jù)庫交互的,所有可以通過多次訪問來確定服務器響應的網(wǎng)頁的md5值是否完全匹配。也可以直接通過尋找關鍵字來確定是否是動態(tài)網(wǎng)頁。通過GET/POST方式請求來發(fā)送非法或者意外的數(shù)據(jù)請求來進行SQL注入攻擊檢測。數(shù)據(jù)庫指紋識別,通過提交注入?yún)?shù)使得應用服務器返回版本信息,然后通過抓取網(wǎng)頁中的內(nèi)容信息來獲取數(shù)據(jù)庫指紋。同時不同的數(shù)據(jù)庫提交的注入?yún)?shù)不同,通過返回的數(shù)據(jù)版本信息特征碼來區(qū)分數(shù)據(jù)庫版本。數(shù)據(jù)庫指紋識別核心代碼如下圖5-8所示:圖5-8數(shù)據(jù)庫指紋識別代碼SQL注入
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 胸科病人管理規(guī)范
- 七年級語文下冊 第六單元 比較 探究《山海經(jīng)》兩篇 夸父逐日教學設計 北師大版
- 2024秋八年級英語上冊 Module 3 Sports Unit 1 Nothing is more enjoyable than playing tennis教學設計(新版)外研版
- 15 堅持才會有收獲 第2課時 教學設計-2023-2024學年道德與法治二年級下冊統(tǒng)編版
- 2024秋一年級道德與法治上冊 第3課 走看校園去教學設計 鄂教版
- 談判溝通技巧培訓
- 7 能量從哪里來 教學設計-2024-2025學年科學六年級上冊教科版
- 14《母雞》(教學設計)2023-2024學年部編版語文四年級下冊
- Unit 4 My Family Lesson 1 My Family Photo 教學設計 2024-2025學年冀教版英語七年級上冊
- 年度財務顧問聘用協(xié)議8篇
- 荊楚文化之楚國歷史文化省公開課一等獎全國示范課微課金獎
- 北京市師范大學附屬實驗中學2023-2024學年八年級下學期期中考試語文試題
- 上海2019年高三春考英語卷(帶參考答案作文答案圖片版)
- 2024年山東省濟南市市中區(qū)中考一模道德與法治試題
- 2024ABB IRB 1100產(chǎn)品手冊指南
- 南通市教育局直屬學校暨部分市屬事業(yè)單位委托招聘教師筆試真題2023
- 籃球比賽記錄表
- 施工隊長培訓課件
- 消防安全評定等級
- 生產(chǎn)加工型小微企業(yè)安全管理考試(含答案)
- 房屋居住權(quán)合同
評論
0/150
提交評論