自動(dòng)注入攻擊工具的研發(fā)_第1頁
自動(dòng)注入攻擊工具的研發(fā)_第2頁
自動(dòng)注入攻擊工具的研發(fā)_第3頁
自動(dòng)注入攻擊工具的研發(fā)_第4頁
自動(dòng)注入攻擊工具的研發(fā)_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

項(xiàng)目背景及意義SQL注入攻擊是一種非常有效且破壞性很大的滲透手段。它是針對(duì)于數(shù)據(jù)庫的一種攻擊手段,通過利用數(shù)據(jù)庫的外部接口把惡意代碼插入到SQL語言中使數(shù)據(jù)庫服務(wù)器解析并執(zhí)行,以達(dá)到入侵目標(biāo)數(shù)據(jù)庫及至整個(gè)操作系統(tǒng)的目的。了解和熟悉SQL注入原理,掌握防御SQL注入攻擊的原理和技巧就變得至關(guān)重要。SQL注入攻擊的普遍性、難捉摸性、簡易性等特點(diǎn)讓其成為了網(wǎng)絡(luò)中黑客主流攻擊方式之一。因?yàn)镾QL注入是從正常的Web平臺(tái)入口進(jìn)行請(qǐng)求訪問,和請(qǐng)求正常的Web頁面沒有什么區(qū)別,所以目前市面上除了專門的Web防御防火墻外,大部分防火墻都不會(huì)對(duì)這類SQL注入攻擊進(jìn)行監(jiān)控和發(fā)出警報(bào),若網(wǎng)站管理員沒有經(jīng)常查看IIS日志的經(jīng)驗(yàn)和習(xí)慣,有可能被入侵很長一段時(shí)間后都沒有任何發(fā)覺。由于現(xiàn)在廣泛流行的惡意攻擊工具,SQL注入在近年來呈現(xiàn)一種增長的趨勢。據(jù)OWASP(開放式web應(yīng)用程序安全項(xiàng)目)每隔三年更新一次的“十大安全隱患列表”,在近幾次公布的總結(jié)Web應(yīng)用程序最可能、最常見、最危險(xiǎn)的十大安全隱患中,SQL注入攻擊一直排列靠前。OWASPTOP102010中列出的最嚴(yán)重的Web應(yīng)用程序的漏洞中,注入(Injection)風(fēng)險(xiǎn)位居第一。Web應(yīng)用的發(fā)展越來越成熟,應(yīng)用的各項(xiàng)技術(shù)發(fā)展得也越來越復(fù)雜。它們涵蓋了從外部動(dòng)態(tài)展示INTERNET和內(nèi)部工作網(wǎng)絡(luò)到以WEB協(xié)議方式傳遞數(shù)據(jù)的企業(yè)工作應(yīng)用(如文檔管理系統(tǒng)等)。這些系統(tǒng)的實(shí)用性及其數(shù)據(jù)存儲(chǔ)、處理內(nèi)容的機(jī)密性和敏感性對(duì)于企業(yè)的主要業(yè)務(wù)而言都非常重要。當(dāng)前市面的注入攻擊檢測工具只能對(duì)單個(gè)網(wǎng)頁或者單個(gè)URL進(jìn)行檢測和注入,無法對(duì)整個(gè)網(wǎng)站的漏洞進(jìn)行檢測。而漏洞掃描工具可以對(duì)整個(gè)網(wǎng)站漏洞進(jìn)行掃描卻無法進(jìn)行進(jìn)一步的注入攻擊檢測。很大程度上不能滿足開發(fā)人員和管理人員對(duì)網(wǎng)站SQL注入漏洞全面了解的要求。本研究的最終目的是分析SQL注入攻擊的類型、關(guān)鍵技術(shù)和原理,并研究SQL注入在實(shí)際應(yīng)用中的操作方法,在此基礎(chǔ)之上,設(shè)計(jì)并開發(fā)了一套自動(dòng)注入工具。因?yàn)閻阂夤粽卟粌H可以通過SQL注入攻擊對(duì)Web應(yīng)用數(shù)據(jù)進(jìn)行盜取、篡改信息,還可以進(jìn)一步對(duì)于服務(wù)器進(jìn)行惡意操作,并且植入木馬或者后門程序,甚至控制整個(gè)服務(wù)器,這就嚴(yán)重影響了應(yīng)用的正常運(yùn)行以及對(duì)于應(yīng)用的信息安全帶來嚴(yán)重后果。所以,對(duì)于功能齊備的SQL注入攻擊掃描與檢測工具的研究與開發(fā)具,具有非常重要的現(xiàn)實(shí)意義。應(yīng)用程序開發(fā)者或網(wǎng)站管理人員使用此工具對(duì)自已的網(wǎng)站進(jìn)行安全檢測,以達(dá)到減小$。任主入的可能性。同時(shí),在滲透測試工作中,對(duì)于安全測試也具有很大的幫助。研究內(nèi)容自動(dòng)注入攻擊工具的研發(fā)本研究首先理解Web應(yīng)用的工作原理,首先簡要概述Web應(yīng)用系統(tǒng)通用的架構(gòu)模式,理解了構(gòu)建模式后能更清晰的了解SQL注入的產(chǎn)生過程,然后從Web應(yīng)用的代碼層來分析介紹是什么引起了通用的SQL注入,然后研究介紹SQL注入漏洞的利用過程。從框架到利用逐步分析SQL注入的過程和利用,然后根據(jù)分析的內(nèi)容構(gòu)建SQL注入的自動(dòng)化檢測及注入攻擊利用框架。SQL注入原理SQL注入的原理,是將SQL代碼插入或者非正常時(shí)添加到應(yīng)用的參數(shù)當(dāng)中,并且進(jìn)行了一定的拼接傳入到了后臺(tái)的數(shù)據(jù)庫服務(wù)器,最終使服務(wù)器執(zhí)行了該拼接的惡意SQL命令。所有的是通過SQL語句執(zhí)行的應(yīng)用過程均存在被攻擊的威脅,因?yàn)镾QL的多樣多變性語言結(jié)構(gòu)特征使得攻擊者可以拼接構(gòu)建豐富的代碼編碼手段等來拼接語句來欺騙服務(wù)器。SQL注入攻擊的主要方式就是直接將命令插入到應(yīng)用服務(wù)的表單參數(shù)中傳入到后臺(tái)數(shù)據(jù)庫查詢字符串中,這些參數(shù)就會(huì)被帶入到后臺(tái)數(shù)據(jù)庫服務(wù)器進(jìn)行執(zhí)行解析,攻擊者便可以構(gòu)造惡意命令來達(dá)到攻擊目的。SQL注入檢測技術(shù)檢測發(fā)現(xiàn)SQL注入漏洞有一條簡單的規(guī)則:SQL注入是通過發(fā)送特殊數(shù)據(jù)來觸發(fā)異常操作。該規(guī)則包括如下含義:?檢測Web應(yīng)用上所有的輸入數(shù)據(jù);?集合SQL語法,歸類所有可能觸發(fā)異常的數(shù)據(jù)類型;?檢測數(shù)據(jù)庫服務(wù)器應(yīng)用響應(yīng)中的異常。首先需要清楚Web瀏覽器向Web服務(wù)器發(fā)送請(qǐng)求的過程。不同的服務(wù)應(yīng)用會(huì)有不同的體現(xiàn)方式,它們均處在基于Web的環(huán)境中,所以基本原理是相同的。識(shí)別和檢測應(yīng)用接受的所有數(shù)據(jù),攻擊一般都會(huì)修改這些數(shù)據(jù),所以需要識(shí)別并分析服務(wù)器對(duì)它們的響應(yīng)。有時(shí)響應(yīng)中會(huì)直接包含來自數(shù)據(jù)庫的SQL錯(cuò)誤,有時(shí)需要不斷的方式來檢測和確定響應(yīng)中細(xì)微的差別。章節(jié)安排本論文章節(jié)安排如下:第一章緒論:綜述此研究設(shè)計(jì)的背景意義以及研究內(nèi)容。第二章SQL注入技術(shù)研究:主要對(duì)SQL注入攻擊方式過程和攻擊特點(diǎn)進(jìn)行歸類、識(shí)別,首先理解Web應(yīng)用的工作原理,概述Web應(yīng)用通用的構(gòu)建方式,為理解SQL注入的產(chǎn)生過程提供一些背景知識(shí),接下來從Web應(yīng)用的代碼層介紹引發(fā)SQL注入的因素以及哪些開發(fā)實(shí)踐和行為會(huì)引發(fā)SQL注入。分析SQL注入過程和利用,并架構(gòu)如何將SQL注入的發(fā)現(xiàn)過程自動(dòng)化以提高檢測簡單SQL注入的框架。第三章SQL注入攻擊技術(shù)研究:根據(jù)SQL注入技術(shù),研究利用數(shù)據(jù)庫中的功能來攻擊系統(tǒng)端口的技術(shù)。數(shù)數(shù)據(jù)庫大多均帶有豐富的數(shù)據(jù)庫編程功能,可以利用SQL注入漏洞來訪問文件系統(tǒng)以執(zhí)行有效的任務(wù),可以在基礎(chǔ)操作上執(zhí)行各種命令,擴(kuò)大范圍攻擊的利用技術(shù)細(xì)節(jié)。當(dāng)發(fā)現(xiàn)SQL注入漏洞以及初步的利用獲取數(shù)據(jù)后,可以利用SQL注入漏洞來訪問文件系統(tǒng)來擴(kuò)大滲透范圍。還可以在操作系統(tǒng)上執(zhí)行各種命令,攻擊可以使用它們擴(kuò)展數(shù)據(jù)庫的可達(dá)區(qū)域并在更大的范圍內(nèi)發(fā)動(dòng)攻擊。第四章注入高級(jí)技巧研究:Web應(yīng)用通常會(huì)使用過濾應(yīng)用,設(shè)計(jì)這些過濾的目的就是防御SQL注入在內(nèi)的常見攻擊。這些過濾方式可以是位于web應(yīng)用的代碼層中,也可以通過第三方的外部實(shí)現(xiàn),如Web應(yīng)用防火墻(WAF)或入侵防御系統(tǒng)(IPS)。當(dāng)注入攻擊碰到這些防御應(yīng)用,若想進(jìn)一步利用漏洞,則需要尋找一種能避開過濾器防護(hù)的高級(jí)方法以便惡意輸入傳遞給易受攻擊的代碼。第五章自動(dòng)注入工具框架設(shè)計(jì):根據(jù)項(xiàng)目的設(shè)計(jì)需求,以及Python編程語言的特點(diǎn),對(duì)自動(dòng)注入攻擊工具整體框架進(jìn)行分析和設(shè)計(jì)。并且分析功能模塊中的重點(diǎn)和關(guān)鍵技術(shù)。第六章SQL注入測試:自動(dòng)注入攻擊實(shí)例測試。第2章SQL注入技術(shù)Web應(yīng)用工作原理和架構(gòu)簡析不論是用何種腳本語言開發(fā)的Web應(yīng)用,都有一個(gè)共同點(diǎn):具有交互性并且大多是數(shù)據(jù)庫驅(qū)動(dòng)的?;跀?shù)據(jù)庫驅(qū)動(dòng)的Web應(yīng)用一般都包含三層:apresentationtier(表示層,Web瀏覽器或呈現(xiàn)引擎)、alogictier(邏輯層,如C#、ASP、.NET、PHP、JSP等編程語言)和astoragetier(存儲(chǔ)層,如MicrosoftSQLServer、MySQL、Oracle等數(shù)據(jù)庫)。Web瀏覽器(表示層,如InternetExplorer>Safari、Firefox等)向中間層(邏輯層)發(fā)送請(qǐng)求,中間層通過查詢、解析數(shù)據(jù)庫(存儲(chǔ)層)來響應(yīng)該請(qǐng)求。圖2-1簡單的三層架構(gòu)Web三層架構(gòu)解決方案沒有擴(kuò)展性,研究人員不斷地對(duì)Web三層架構(gòu)進(jìn)行改進(jìn)優(yōu)化,在可維護(hù)性和可擴(kuò)展性的基礎(chǔ)上建立了一種新概念:n層應(yīng)用開發(fā)模式。其中有一種就是Web四層架構(gòu)解決方案,該方案在Web服務(wù)器和數(shù)據(jù)庫之間使用了一層中間件服務(wù)器(通常稱為應(yīng)用服務(wù)器)。下圖2-2中,Web瀏覽器(表示層)向中間層(邏輯層)發(fā)送請(qǐng)求,后者一次調(diào)用由位于應(yīng)用層的應(yīng)用服務(wù)器所提供的API,應(yīng)用層通過查詢、更新數(shù)據(jù)庫(存儲(chǔ)層)來響應(yīng)該請(qǐng)求。圖2-2四層架構(gòu)識(shí)別SQL注入SQL注入就是程序員對(duì)程序中動(dòng)態(tài)的SQL語句沒有作嚴(yán)格的過濾或檢測,導(dǎo)致黑客能在注入點(diǎn)提交非法的SQL語句,導(dǎo)致程序和服務(wù)器的信息被泄漏。由于SQL注入的入門門檻低,隱蔽性好,破壞性大,殺毒軟件無法查殺,是當(dāng)前最主流的入侵手段。SQL注入攻擊的本質(zhì),就是服務(wù)器將用戶傳入的數(shù)據(jù)在數(shù)據(jù)庫中當(dāng)成了SQL代碼執(zhí)行。這里便有兩個(gè)關(guān)鍵因素:第一個(gè)是用戶有權(quán)限輸入數(shù)據(jù);第二個(gè)是服務(wù)器應(yīng)用數(shù)據(jù)執(zhí)行了用戶傳入的數(shù)據(jù)。識(shí)別數(shù)據(jù)輸入Web環(huán)境是一種C/S(客戶端/服務(wù)器)架構(gòu)??蛻舳耸褂脼g覽器向Web服務(wù)器發(fā)送請(qǐng)求并等待響應(yīng)。Web服務(wù)器接收到請(qǐng)求后,通過查詢、解析數(shù)據(jù)庫,將響應(yīng)發(fā)送回客戶端。很明顯,雙方便必須使用一種協(xié)議作為雙方的約定,這種傳輸協(xié)議就是HTTP。首先,必須識(shí)別遠(yuǎn)程Web應(yīng)用所接收的所有數(shù)據(jù)輸入。HTTP協(xié)議定義了可以發(fā)送給服務(wù)器的操作方式,這里只關(guān)注研究與SQL注入攻擊相關(guān)的兩種方法:GET和POST。GET請(qǐng)求:GET是向服務(wù)器發(fā)索取數(shù)據(jù)的一種請(qǐng)求,是一種請(qǐng)求服務(wù)器的HTTP方法。使用GET請(qǐng)求時(shí),信息是顯示在URL中的。GET請(qǐng)求對(duì)用戶是透明的,如下例,WEB服務(wù)器的GET請(qǐng)求如下所示: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該請(qǐng)求中與數(shù)據(jù)查詢相關(guān)的參數(shù)在URL中,格式如下所示:VOTE_ID=131上述示例中包含一個(gè)參數(shù):VOTE_ID。服務(wù)器應(yīng)用將會(huì)把參數(shù)值帶入數(shù)據(jù)庫中解析執(zhí)行,然后將響應(yīng)結(jié)果返回給客戶端。POST請(qǐng)求:POST請(qǐng)求是作為HTTP消息的實(shí)際內(nèi)容發(fā)送給web服務(wù)器的HTTP方法。在瀏覽器中填寫表單并點(diǎn)擊Submit按鈕時(shí)通常使用該方法。下面的例子是瀏覽器發(fā)送給遠(yuǎn)程WEB服務(wù)器的內(nèi)容,請(qǐng)求如下所示: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請(qǐng)求的其他內(nèi)容也可能會(huì)觸發(fā)SQL注入漏洞。Cookie就是個(gè)很典型的例子。Cookie由服務(wù)器發(fā)發(fā)送到用戶端的瀏覽器,并會(huì)在用戶端每次請(qǐng)求中都會(huì)回發(fā)給服務(wù)器。Cookie一般被用于辨別用戶身份、進(jìn)行session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)。由此可見,用戶完全可以控制發(fā)送給服務(wù)器的Cookie內(nèi)容,所以Cookie也作為一種有效的用戶數(shù)據(jù)輸入方式和易受注入影響的對(duì)象。如:Accept:text/html,application/xhtml+xml,application/xml;q=,*/*;q=Accept-Language:en-US,en;q=Accept-Encoding:gzip,deflateConnection:keep-alive該應(yīng)用系統(tǒng)存在一個(gè)cookie注入漏洞,漏洞代碼下圖2-3,程序代碼沒有任何過濾就將用戶傳入的cookie參數(shù)帶入到數(shù)據(jù)庫中進(jìn)行執(zhí)行。用戶只要利用抓包工具將傳入的數(shù)據(jù)包截下來修改cookie字段的數(shù)據(jù)就可以將惡意命令傳入到后臺(tái)數(shù)據(jù)庫進(jìn)行執(zhí)行。圖2-3存在漏洞的代碼文件操作請(qǐng)求參數(shù)下面先通過介紹一個(gè)非常簡單的例子來熟悉SQL注入漏洞。頁面收到一個(gè)名為VOTE_ID的參數(shù)?,F(xiàn)在開始開始手動(dòng)修改VOTE_ID參數(shù)的值,將其改為意外的數(shù)值。按照下列方式進(jìn)行首次嘗試:上例中使用不存在的類型名向服務(wù)器發(fā)出請(qǐng)求。服務(wù)器返回如下圖2-4響應(yīng):圖2-4服務(wù)器響應(yīng)結(jié)果1該警告是當(dāng)用戶嘗試從空結(jié)果集中讀取記錄時(shí),數(shù)據(jù)庫返回的一個(gè)MYSQL數(shù)據(jù)庫錯(cuò)誤。該錯(cuò)誤表明遠(yuǎn)程應(yīng)用未能正確處理意外的數(shù)據(jù)。繼續(xù)進(jìn)行推理操作,現(xiàn)在向之前發(fā)送的值添加一個(gè)單引號(hào)('),發(fā)送下列請(qǐng)求:下圖2-5是服務(wù)器的響應(yīng):圖2-5服務(wù)器響應(yīng)結(jié)果2服務(wù)器返回下列錯(cuò)誤:請(qǐng)聯(lián)系管理員錯(cuò)誤#1064:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'\''atline1SQL語句:SELECTEND_DATEfromVOTE_TITLEwhereVOTE_ID=attacker\'文件:D:/***root/general/vote/show/webst/不難發(fā)現(xiàn),有些應(yīng)用在處理用戶數(shù)據(jù)時(shí)會(huì)返意想不到的結(jié)果。WEB檢測的異常并非都是由SQL注入漏洞引起的,還會(huì)受到很多其他因素的影響。這里還可以通過進(jìn)行另一個(gè)測試來識(shí)別SQLServer和Oracle中的漏洞。向Web服務(wù)發(fā)送下面兩個(gè)請(qǐng)求:在MYSQL中,與其等價(jià)的請(qǐng)求為:'1如果兩個(gè)請(qǐng)求結(jié)果相同,則很可能存在SQL注入漏洞。數(shù)據(jù)庫響應(yīng)測試SQL注入攻擊漏洞時(shí),可能會(huì)從WEB服務(wù)器收到不同的數(shù)據(jù)庫錯(cuò)誤響應(yīng),所以對(duì)于這些錯(cuò)誤的意義需要熟悉和掌握。圖2-6展示了產(chǎn)生SQL注入錯(cuò)誤的過程和WEB服務(wù)器對(duì)錯(cuò)誤進(jìn)行處理得過程。圖2-6產(chǎn)生SQL注入錯(cuò)誤的過程中的信息流產(chǎn)生SQL注入錯(cuò)誤的過程中發(fā)生了以下事件:用戶端發(fā)送請(qǐng)求數(shù)據(jù),嘗試觸發(fā)SQL注入漏洞。假設(shè)用戶發(fā)送了一個(gè)帶單引號(hào)的值。WEB服務(wù)器接收到用戶端的請(qǐng)求數(shù)據(jù),并向數(shù)據(jù)庫服務(wù)器發(fā)送SQL查詢。本例中,在WEB服務(wù)器執(zhí)行的SQL語句中包含了用戶輸入?yún)?shù)并且構(gòu)造了一條SQL查詢,該查詢因末尾存在單引號(hào)而導(dǎo)致語法錯(cuò)誤。數(shù)據(jù)庫服務(wù)器接收?qǐng)?zhí)行了格式不正確的SQL查詢,并向WEB服務(wù)器返回一條錯(cuò)誤消息。WEB服務(wù)器接收到的來自數(shù)據(jù)庫的錯(cuò)誤向用戶發(fā)送HTML響應(yīng)。下面列舉常見的SQL錯(cuò)誤。1)SQLServer錯(cuò)誤在請(qǐng)求中插入一個(gè)單引號(hào)在參數(shù)中會(huì)產(chǎn)生數(shù)據(jù)庫錯(cuò)誤。對(duì)于SQLServer中,遠(yuǎn)程應(yīng)用返回類似于下列內(nèi)容的錯(cuò)誤,圖2-7所示:圖2-7SQLServer錯(cuò)誤通過上面的例子,我們可以確定運(yùn)行在數(shù)據(jù)庫上的遠(yuǎn)程SQL語句與下面的內(nèi)容相似:SELECT*FROMNewsWHEREArticleID='2650''該Web應(yīng)用未檢測單引號(hào),所以數(shù)據(jù)庫服務(wù)器響應(yīng)返回了一個(gè)錯(cuò)誤。2)MYSQL錯(cuò)誤下面介紹一下典型的mysql錯(cuò)誤。MYSQL可以在很多架構(gòu)和操作系統(tǒng)下執(zhí)行,兼容性很好,常見的配置是在裝有l(wèi)inux操作系統(tǒng)的apacheweb服務(wù)器上運(yùn)行php,但它也可以出現(xiàn)在很多其他場合中。下列錯(cuò)誤通常表明存在MYSQL注入漏洞:Warning:mysql_fetch_array(1):suppliedargumentisnotavalidMySQLresultresourcein/var/www/online9自動(dòng)尋找SQL注入對(duì)于SQL注入工具的開發(fā),如何的適度的自動(dòng)化SQL注入的請(qǐng)求是其中的關(guān)鍵。識(shí)別數(shù)據(jù)輸入是可以自動(dòng)化的內(nèi)容,它涉及搜索WEB站點(diǎn)和尋找GET及POST請(qǐng)求。數(shù)據(jù)注入也可以自動(dòng)完成,因?yàn)樯弦浑A段已經(jīng)獲取了發(fā)送請(qǐng)求所需要的所有數(shù)據(jù)。若想自動(dòng)尋找SQL注入漏洞,主要問題在于檢測遠(yuǎn)程服務(wù)器響應(yīng)中的異常。對(duì)于管理員來說,區(qū)別一個(gè)錯(cuò)誤頁面或其他類型的異常頁面非常容易;但對(duì)于程序來說,要識(shí)別出服務(wù)器異常輸出,有時(shí)會(huì)非常困難。某些情況下,應(yīng)用可以很容易地檢測到數(shù)據(jù)庫發(fā)生了錯(cuò)誤,如以下情形下:WEB應(yīng)用服務(wù)器返回由數(shù)據(jù)庫產(chǎn)生的SQL錯(cuò)誤;WEB應(yīng)用服務(wù)器返回HTTP500內(nèi)部服務(wù)器無法執(zhí)行錯(cuò)誤;某些SQL盲注情況下。但對(duì)于其他情況,應(yīng)用系統(tǒng)將很難識(shí)別存在的漏洞,而且很容易出現(xiàn)遺漏。所以,自動(dòng)發(fā)現(xiàn)SQL注入存在著一定的局限性,自定義的測試和手動(dòng)測試也顯得非常重要。SQL盲注很多時(shí)候,WEB服務(wù)器為了安全設(shè)置關(guān)閉了錯(cuò)誤回顯,但是這可以阻擋住SQL注入攻擊嗎當(dāng)發(fā)現(xiàn)一個(gè)SQL注入點(diǎn),但應(yīng)用只提供了一個(gè)自定義的通用的錯(cuò)誤頁面;或者雖然提供了正常的頁面,但與期望的測試響應(yīng)存在一些小的差異?;谶@種情況下的SQL注入攻擊測試,都屬于SQL盲注。所謂“盲注”,就是在在注入攻擊Web應(yīng)用時(shí),攻擊語句被帶入到后臺(tái)數(shù)據(jù)庫中執(zhí)行,但是服務(wù)器查不會(huì)返回錯(cuò)誤或者執(zhí)行結(jié)果的回顯的情況下進(jìn)行的注入攻擊。服務(wù)器沒有了攻擊者期望的錯(cuò)誤回顯,對(duì)于攻擊者來說沒有了非常重要的SQL注入攻擊“調(diào)試信息”,所以攻擊者必須找到一個(gè)方法來從側(cè)面驗(yàn)證注入的SQL語句是否得到成功執(zhí)行。注入帶判定的參數(shù)(TimingAttack)當(dāng)已經(jīng)識(shí)別可能存在SQL注入漏洞,但又沒有正常的回顯的時(shí)候,要想進(jìn)一步確認(rèn)和檢測漏洞,一般可以提交包含副作用的查詢參數(shù)。比較老的技術(shù)是使用timingattack,計(jì)時(shí)攻擊。2011年3月27日,一個(gè)叫TinKodes]的黑客在著名的安全郵件列表FullDisclosure上公布了他入侵的細(xì)節(jié)。這次入侵事件,就是因?yàn)橐粋€(gè)SQL盲注漏洞引起的。據(jù)黑客公布描述,當(dāng)時(shí)這個(gè)漏洞是出現(xiàn)在下面這個(gè)頁面,如圖2-8:圖2-8漏洞頁面可以看到網(wǎng)址URL:id=1170,通過修改參數(shù)id后的數(shù)值,服務(wù)器將返回不同的查詢的客戶信息。這個(gè)漏洞中,id=這個(gè)參數(shù)鏈接就是一個(gè)很隱蔽的“SQL盲注”漏洞,攻擊者通過精心構(gòu)造id參數(shù)的URL,就可以進(jìn)行SQL注入攻擊。利用通常的SQL語句比如“and1=2”在此鏈接下是無法看出異常的,因?yàn)閼?yīng)用服務(wù)器不會(huì)返回任何異常的數(shù)據(jù)。在這里,TinKodes]利用“SQL盲注”的一個(gè)技巧:TimingAttack,用來確認(rèn)漏洞是否存在。在MYSQL數(shù)據(jù)庫中,有個(gè)函數(shù):BENCHMARK。,可以用來測試函數(shù)性能。同時(shí)它含有兩個(gè)參數(shù):BENCHMARK(count,expr)函數(shù)執(zhí)行的結(jié)果,是將表達(dá)式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ù)庫中的這個(gè)函數(shù)BENCHMARK。,在傳入到后臺(tái)服務(wù)器的參數(shù)中讓同一個(gè)SQL函數(shù)在數(shù)據(jù)庫中執(zhí)行若干次,然后通過服務(wù)器執(zhí)行該SQL語句的時(shí)間的長短變化,就可以用來側(cè)面判別出SQL注入攻擊語句是否已經(jīng)成功的執(zhí)行。這個(gè)攻擊利用技巧在盲注中被稱為TimingAttack。在此次的攻擊中,攻擊者接下來就是利用TimingAttack攻擊。比如構(gòu)造的攻擊參數(shù)id值如圖2-9:圖2-9TimingAttack攻擊語句1這段攻擊Payload首先進(jìn)行的是判斷庫名的第一個(gè)字母是否為小寫的w,即CHAR(119)。如果判斷結(jié)果為真,就會(huì)執(zhí)行后面的BENCHMARK()函數(shù),執(zhí)行該函數(shù)就會(huì)造成較長的延時(shí);如果判斷結(jié)果為假,則該攻擊語句很快就會(huì)被執(zhí)行完畢,頁面將很快得到加載。這樣,攻擊者就可以通過構(gòu)造攻擊Payload猜解遍歷出所有的庫名字母,直到將整個(gè)數(shù)據(jù)庫名全部猜解完成為止,然后進(jìn)一步可以猜解遍歷出數(shù)據(jù)表明、列明和數(shù)據(jù)內(nèi)容,將可以將整個(gè)數(shù)據(jù)中的內(nèi)容下載過來。同時(shí),攻擊者還可以通過以下Payload獲取到更多有用信息,圖2-10:圖2-10TimingAttack攻擊語句2此外,攻擊者可以通過利用DumpFile的方法如圖圖2-11,來寫入一個(gè)webshell木馬:圖2-11DumpFile寫如websehllTimingAttack是SQL盲注中的一種高級(jí)技巧。在各種不同的數(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)生一個(gè)8秒的暫停:WAITFORDELAY'0:0:8'同時(shí),攻擊者還可以利用應(yīng)用服務(wù)器的回顯輸出來進(jìn)行判斷。例如,若將注入下面的字符串:'AND'1'='2插入到一個(gè)搜索字段中,將產(chǎn)生與'OR'1'='1不同的結(jié)果響應(yīng)。ParameterSplittingandBalancing技術(shù)如果注入帶判斷的函數(shù)不起作用,可以嘗試"parametersplittingandbalancing”(參數(shù)拆分與平衡)技術(shù)。拆分是指拆分正常的參數(shù)輸入,平衡則是指保證最終的查詢與正常的輸入是一致。其基本思想是:將正常的請(qǐng)求參數(shù)進(jìn)行拆分,然后使用SQL語句關(guān)鍵字對(duì)它們進(jìn)行修改,最終需保證與原數(shù)據(jù)不同,使得后臺(tái)數(shù)據(jù)庫服務(wù)器解析執(zhí)行帶入的參數(shù)時(shí),與正常的參數(shù)請(qǐng)求一樣的同時(shí)也帶入了“非法”的請(qǐng)求。SELECTreview_content,review_authorFROMreviewsWHEREid=5如果使用2+3替換5,那么輸入應(yīng)用中的參數(shù)將不同于原始請(qǐng)求中的輸入,但SQL數(shù)據(jù)執(zhí)行在結(jié)果上是等價(jià)相同的:SELECTreview_content,review_authorFROMreviewsWHEREid=2+3這種方式不僅僅只局限于數(shù)字值型。SELECTCOUNT(id)FROMreviewsWHEREreview_aouthor='dllk'可以使用特定的數(shù)據(jù)庫運(yùn)算符將dllk字符串拆分,向Web服務(wù)應(yīng)用提供與dllk相對(duì)應(yīng)的不同的參數(shù)輸入。對(duì)于再oracle數(shù)據(jù)庫的利用中,可以使用“||”運(yùn)算符來鏈接兩個(gè)字符串:SELECTCOUNT(id)FROMreviewsWHEREreview_aouthor='dl'||'lk'它與之前的第一個(gè)查詢?cè)谧罱K執(zhí)行的參數(shù)是等價(jià)的。下表2-1是帶子查詢占位符的拆分字符串參數(shù):表2-1帶子查詢占位符的拆分字符串第3章SQL注入攻擊技術(shù)研究識(shí)別數(shù)據(jù)庫要成功進(jìn)行SQL注入攻擊,還有重要的一點(diǎn)就是需要探測出服務(wù)器正在使用的數(shù)據(jù)庫系統(tǒng)DBMS。若是攻擊者連數(shù)據(jù)庫系統(tǒng)都無從判斷,就不可能構(gòu)造出有效的“惡意”參數(shù)來進(jìn)行SQL注入,也就無法實(shí)施攻擊。通常WEB架構(gòu)技術(shù)可以使我們猜測驗(yàn)證出數(shù)據(jù)庫系統(tǒng)。例如,ASP和.NET的WEB服務(wù)應(yīng)用通常使用的事MicrosoftSQLServer作為數(shù)據(jù)庫系統(tǒng),而PHP應(yīng)用則很可能使用MYSQL數(shù)據(jù)庫。如果是用JAVA、JSP等編寫的,那么很有可能使用的是Oracle數(shù)據(jù)庫。在識(shí)別SQL注入漏洞所存在的數(shù)據(jù)庫中,如果不是SQL盲注,通常情況下可以很快的判斷出數(shù)據(jù)庫系統(tǒng)。如果數(shù)據(jù)庫響應(yīng)返回出SQL注入的錯(cuò)誤消息,一般都會(huì)在報(bào)錯(cuò)的響應(yīng)中可以找到是何數(shù)據(jù)庫系統(tǒng)的線索。如圖3-1SQLServer錯(cuò)誤信息:圖3-1SQLServer錯(cuò)誤信息根據(jù)報(bào)錯(cuò)信息可以很直接的就判斷數(shù)據(jù)庫類型為MicrosoftSQLServer。這種方法就是添加一個(gè)單引號(hào)將使得構(gòu)造的SQL語句參數(shù)帶入到數(shù)據(jù)庫服務(wù)器當(dāng)作SQL語句來執(zhí)行,這將產(chǎn)生一條語法錯(cuò)誤而暴露出錯(cuò)誤信息。如圖3-2SQLServer錯(cuò)誤信息:圖3-2SQLServer錯(cuò)誤信息在錯(cuò)誤消息中明確提到了“MySQL”,還附加了一些關(guān)于出錯(cuò)內(nèi)容的有用細(xì)節(jié)。如下表3-1返回各種DBMS所對(duì)應(yīng)的查詢:表3-1返回各種DBMS所對(duì)應(yīng)的查詢例如,對(duì)于SQLServer2000SP4來說,執(zhí)行SELECT@@version查詢時(shí),將得到如圖3-3所示信息:圖3-3SQLServer2000服務(wù)器返回信息如果應(yīng)用服務(wù)器并不能直接的在響應(yīng)中返回所想要的數(shù)據(jù)信息,則需要一種間接的方法來觸發(fā)獲得想要的信息。不同的數(shù)據(jù)庫,在語法查詢方式上有略微的不同,不同的數(shù)據(jù)庫系統(tǒng)就會(huì)有不同的查詢方式。比如一個(gè)簡單查詢?nèi)缦拢篠ELECT'somestring'該查詢語句對(duì)于大多數(shù)主流的數(shù)據(jù)庫系統(tǒng)都是有效的,對(duì)于不同的數(shù)據(jù)庫系統(tǒng),將查詢的字符串分成兩個(gè)字串的SQL語句的時(shí)候還是存在有細(xì)微的差異的,就SQLServer、Mysql、Oracle來說,如下表3-2:表3-2字符串分成兩個(gè)字串的SQL語句假設(shè)Web應(yīng)用中沒有可以利用的SQL注入字符串參數(shù),則可以使用之前數(shù)字參數(shù)類似的技術(shù)。這樣的話就需要一條針對(duì)特定情況特定技術(shù)的SQL語句,使得在服務(wù)器經(jīng)過執(zhí)行SQL語句后計(jì)算后生成一個(gè)數(shù)字。在下表3-3所示列舉的SQL語句中,在對(duì)應(yīng)的數(shù)據(jù)庫系統(tǒng)上執(zhí)行對(duì)應(yīng)的SQL語句后都會(huì)生成一個(gè)整數(shù),而若在其他不同的數(shù)據(jù)庫下執(zhí)行語句的話,就將會(huì)產(chǎn)生錯(cuò)誤。表3-3從數(shù)字函數(shù)推斷DBMS版本注入語句獲取數(shù)據(jù)UNION語句是數(shù)據(jù)庫管理員經(jīng)常使用函數(shù)之一。使用UNION的SQL語句,可以連接兩條或多條SELECT語句的聯(lián)合查詢得到結(jié)果。基本語法如下所示:SELECTcolumn-1,column-2,...,column-NFROMtable-1UNIONSELECTcolumn-1,column-2,...,column-NFROMtable-2執(zhí)行該查詢后,返回結(jié)果得到的是由兩個(gè)SELECT語句返回結(jié)果組成的表。通常在默認(rèn)情況下,得到的返回結(jié)果中只會(huì)包含不同的數(shù)值。如果想在查詢的結(jié)果中將重復(fù)的值也顯示出來,只需要稍微修改下語法即可:SELECTcolumn-1,column-2,...,column-NFROMtable-1UNIONALLSELECTcolumn-1,column-2,...,column-NFROMtable-2在SQL注入測試攻擊中,數(shù)據(jù)庫的UNION查詢方法對(duì)于攻擊來說作用很大:如果服務(wù)器可以正常返回第一個(gè)查詢得到的數(shù)據(jù),若想修改加入數(shù)據(jù)庫UNION查詢,便可以利用讀取到攻擊者想要讀取的該數(shù)據(jù)庫用戶,然后就可以訪問的其他的任何一張數(shù)據(jù)表。如,如果想要找到頁面執(zhí)行的查詢的數(shù)據(jù)表所返回的列數(shù),則可以按下列方式請(qǐng)求URL,直到不再返回錯(cuò)誤位置信息:獲取列的另一種方法是使用ORDERBY語句,ORDERBY語句并不是通過注入另一個(gè)查詢語句來獲得查詢結(jié)果。通過增大ORDERBY子語句中代表列的數(shù)字就可以來識(shí)別查詢中的列數(shù),如下所示:若在以上使用ORDERBY9查詢時(shí)收到第一個(gè)錯(cuò)誤回顯,就意味著查詢的數(shù)據(jù)庫中包含的數(shù)據(jù)有8列。當(dāng)攻擊識(shí)別出數(shù)據(jù)庫的列數(shù)后,接下來就是選擇數(shù)據(jù)中的其中一列或幾列來繼續(xù)攻擊查詢數(shù)據(jù)庫中的數(shù)據(jù)了。因此,如果攻擊者想提取一個(gè)數(shù)據(jù)庫字符串值,就可以通過它來保存正在尋找的數(shù)據(jù),以便找到一個(gè)字符串類型的列。攻擊者可以用NULL來很容易的實(shí)現(xiàn),只需要重復(fù)的使用字符串示例替換掉NULL即可。例如,如果原始的數(shù)據(jù)查詢中包含4列數(shù)據(jù),則可以做如下嘗試獲得字符串類型的列:只要數(shù)據(jù)庫沒有返回錯(cuò)誤,就可知道剛才存儲(chǔ)dllk值的列保存的一個(gè)字符串,因此就可以用它來顯示需要的值。例如,若數(shù)據(jù)中第二列可以保存一個(gè)字符串字段,則當(dāng)請(qǐng)求下面的URL即可存儲(chǔ)到第二列中:而下列URL則可以同時(shí)檢索當(dāng)前用戶名和當(dāng)前數(shù)據(jù)庫名:攻擊者通過精心構(gòu)造使用UNIONSELECT的SQL語句注入,就可以獲取整張數(shù)據(jù)表。假設(shè)攻擊者已經(jīng)得到當(dāng)前數(shù)據(jù)庫包含一張名為users的表,表中包含userid、first_name、和second_name列。則可以使用下面的方式來獲取用戶名:使用UNION注入任意查詢來攻擊數(shù)據(jù)庫,是一種既快捷又有效的攻擊手段技巧。但該方法并不通用,WEB應(yīng)用也沒那么容易就輕易的泄漏數(shù)據(jù)庫數(shù)據(jù)。在MicrosoftSQLServer中,對(duì)于攻擊者來說,攻擊者最想了解的是當(dāng)前執(zhí)行數(shù)據(jù)庫查詢的應(yīng)用用戶是否是以系統(tǒng)管理員帳戶(SA)運(yùn)行的。因?yàn)闄?quán)限的不同,所能進(jìn)行的查詢和操作就不同,在后續(xù)的擴(kuò)大滲透中,在數(shù)據(jù)庫上執(zhí)行的敏感的提權(quán)操作也會(huì)有所不同,對(duì)于攻擊者的攻擊的程度也不同。為確定是否為SA權(quán)限,可以使用下列注入語句查詢:IF(system_user='sa')WAITFORDELAY'0:0:5'--該查詢將轉(zhuǎn)換為下列URL:語句中的System_user在SQLServer中是T-SQL函數(shù),這個(gè)函數(shù)在數(shù)據(jù)庫中執(zhí)行完成后會(huì)返回?cái)?shù)據(jù)為當(dāng)前登錄的用戶名。該P(yáng)ayload的執(zhí)行,是根據(jù)system_user函數(shù)執(zhí)行的值來判定是否執(zhí)行WAITFOR函數(shù)(等待6秒)。攻擊者可以通過Web應(yīng)用查詢后返回的結(jié)果加載HTML數(shù)據(jù)所花費(fèi)的時(shí)間來判定是否為SA用戶。該P(yáng)ayload的SQL查詢語句尾部的兩條橫線是注釋作用,可以注釋掉所有可能影響原查詢結(jié)果的除偽造拼接的SQL攻擊查詢代碼。上面基于時(shí)間的判定的技巧很靈活,但是基于時(shí)間判定的的方法不適合提取大量信息??梢岳没阱e(cuò)誤的判定的方法,如:is_srvrolemember()也是SQLServer中的T-SQL函數(shù),當(dāng)它被執(zhí)行,可以返回下列值:1:用戶屬于該組。0:用戶不屬于該組。NULL:該組不存在。我們假設(shè)用戶屬于webadmin組,那么URL中的id的參數(shù)應(yīng)該等于12/1,因此,Web應(yīng)用就會(huì)正常返回?cái)?shù)據(jù)頁面。如果當(dāng)前的用戶并不是webadmin組中的成員,那么此時(shí)URL中的id值就是12/0;這樣的話將會(huì)導(dǎo)致SQL語句查詢失敗,Web應(yīng)用返回的結(jié)果是一個(gè)錯(cuò)誤。對(duì)于返回的錯(cuò)誤來說,錯(cuò)誤的具體消息內(nèi)容肯定會(huì)各有千秋:錯(cuò)誤可能只是由Web服務(wù)器相應(yīng)錯(cuò)誤返回的‘500internalservererror’,錯(cuò)誤信息也有可能包含了完整的SQLServer錯(cuò)誤消息,甚至由于管理員的限制,錯(cuò)誤的信息是管理員主動(dòng)設(shè)置的自定義的404錯(cuò)誤頁面。對(duì)于WAITFOR的基于時(shí)間的方法來說,基于錯(cuò)誤來判定的方法有個(gè)很大的優(yōu)點(diǎn)就是效率,基于時(shí)間的方法涉及查詢延遲的問題,基于錯(cuò)誤的判定的方法的請(qǐng)求可以馬上返回注入利用的結(jié)果。當(dāng)然基于錯(cuò)誤的方法缺點(diǎn)就是將會(huì)觸發(fā)很多錯(cuò)誤,這些錯(cuò)誤將會(huì)被記入到服務(wù)器的日志當(dāng)中,這對(duì)于攻擊者來說是不愿意見到的。不過,可以稍作修改優(yōu)化,例:%2B是“+”的URL編碼。最終將按照下列式子為id參數(shù)賦值:id=24+(casewhen(system_user='sa')then1else0end)如果執(zhí)行的不是sa,那么id=24,請(qǐng)求等價(jià)于:而如果執(zhí)行查詢的用戶是sa,那么id=25,請(qǐng)求就等價(jià)于:所以,攻擊者就可以可以根據(jù)Web服務(wù)器查詢后返回的結(jié)果中加載的HTML中包含的字符串的不同來判斷當(dāng)前用戶是否為sa。提升權(quán)限所有的數(shù)據(jù)庫系統(tǒng)管理員都可以對(duì)數(shù)據(jù)庫用戶的權(quán)限進(jìn)行很詳細(xì)的很細(xì)微的設(shè)置和控制。管理員可以為每個(gè)用戶賦予一定量的操作執(zhí)行權(quán)限來實(shí)現(xiàn)用戶對(duì)數(shù)據(jù)存儲(chǔ)信息的訪問。通常一個(gè)數(shù)據(jù)庫系統(tǒng)都可能包含了很多個(gè)數(shù)據(jù)庫,但是攻擊者利用的數(shù)據(jù)庫的用戶權(quán)限只能訪問其中某一個(gè)數(shù)據(jù)庫,在正常的情況下,其他的數(shù)據(jù)庫都不能進(jìn)行任何操作,但是攻擊者目前掌控的數(shù)據(jù)庫中并沒有想要的信息?;蛘呤钱?dāng)前數(shù)據(jù)庫的用戶權(quán)限可以讀取所有數(shù)據(jù)庫的內(nèi)容,但是只有對(duì)于當(dāng)前數(shù)據(jù)庫有寫權(quán)限,對(duì)于其他數(shù)據(jù)庫不能執(zhí)行修改操作。攻擊者若想獲取其他數(shù)據(jù)庫的操作或者對(duì)于系統(tǒng)的其他地方進(jìn)行操作,就需要更高的權(quán)限。這個(gè)過程就是提升權(quán)限。SQLServer數(shù)據(jù)庫的提權(quán)在MicrosoftSQLServer中,使用命令OPENROWSET是一個(gè)很好也比較典型的的數(shù)據(jù)庫攻擊方法。OPENROWSET是可以實(shí)現(xiàn)SQLServer對(duì)遠(yuǎn)程的OLEDB數(shù)據(jù)源進(jìn)行一次性連接,而DBA則可以用來檢索和查詢遠(yuǎn)程數(shù)據(jù)庫上的數(shù)據(jù),這樣就可以作為連接數(shù)據(jù)庫的一種方法。下面是典型調(diào)用OPENROWSET的方法,例:SQLServer的OPENROWSET在SQL注入攻擊中有多種攻擊方式和技巧。例如在SQLServer2000上,攻擊者可以使用OPENROWSET來進(jìn)行暴力猜解SA密碼并提升權(quán)限。例如:若dllktest是正確的密碼,那么執(zhí)行該查詢并會(huì)返回結(jié)果A;但若密碼不正確,那么將收到下面的返回信息:LoginFailedforuser'sa'.這樣就可以構(gòu)造一種暴力猜解SA密碼的方法。如果找到正確的密碼,接著就可以使用sp_addsrolemember存儲(chǔ)過程來將用戶添加到sysadmin管理員組,這樣就可以很容易地提升權(quán)限。命令OPENROWSET同時(shí)也可以用于掃描SQLServer存在的弱口令,如:Oracle數(shù)據(jù)庫的提權(quán)對(duì)于Oracle數(shù)據(jù)庫,通常通過Web應(yīng)用的來進(jìn)行SQL注入利用提升權(quán)限的很困難。因?yàn)樵贠racle數(shù)據(jù)庫中,大多數(shù)的提權(quán)攻擊方法都需要前提是PL/SQL注入,而PL/SQL這種注入漏洞通常都很少見。若碰到PL/SQL注入漏洞,則可以通過注入PL/SQL代碼來提升權(quán)限,以及在數(shù)據(jù)庫服務(wù)器上操作系統(tǒng)命令。在非PL/SQL注入漏洞中,存在有一個(gè)方法,漏洞是出在ORACLE的mod_plsql組件中。該漏洞的利用示例如下URL:攻擊者在SQL的接口應(yīng)用上提權(quán)要簡單得多。大多數(shù)提權(quán)過程都是用的以下的步驟:(1)首先創(chuàng)建一DBA權(quán)限并授權(quán)給public的Payload。然后將Payload注入存在漏洞的PL/SQL存儲(chǔ)過程中。Payload如圖3-4所示:圖3-4創(chuàng)建DBA權(quán)限給public(2)下圖圖3-5然后將該P(yáng)ayload注入到包中:圖3-5Payload注入(3)圖3-6所示激活啟用DBA:圖3-6激活DBA(4)圖3-7所示從public中取消DBA:圖3-7從public取消DBA當(dāng)前session雖然依然有DBA權(quán)限,但不再是ORACLE權(quán)限設(shè)置中了。使用這種攻擊的局限就是前提利用要有CREATEPROCEDURE的權(quán)限。獲取口令hashSQL注入利用要想攻擊得到口令hash,所以也必須構(gòu)造一定的SQL語法傳入數(shù)據(jù)庫服務(wù)器進(jìn)行查詢檢索。一般很多WEB應(yīng)用也是將WEB管理員的帳號(hào)密碼存放到數(shù)據(jù)庫中。(1)SQLServer如果,。匚注入利用的環(huán)境是MicrosoftSQLServer,但根據(jù)數(shù)據(jù)庫版本的不同,利用的方式會(huì)差別很大。但不管是那個(gè)版本的數(shù)據(jù)庫,都得需要有管理員權(quán)限猜能訪問得到口令hash。舉例若是數(shù)據(jù)庫為SQLServer2000,hash是存儲(chǔ)在master數(shù)據(jù)庫的sysxlogins表里。我們可以通過下面的語句進(jìn)行查詢得到:SELECTname,passeordFROM.SysxloginsSQLServer2000數(shù)據(jù)中,存儲(chǔ)的hash是由pwdencrypt()這個(gè)函數(shù)生成的。這個(gè)函數(shù)并不是公開的,它會(huì)生成帶鹽的salthash,其中的salt是一個(gè)和時(shí)間相關(guān)的函數(shù)。(2)MySQLMySQL數(shù)據(jù)中,hash是存儲(chǔ)在表中。如下是可以獲取用戶名等的SQL查詢語句:SELECTname,passwordFROM;MYSQL數(shù)據(jù)庫中的hash是通過PASSWORD(涵數(shù)生成的,不同的MYSQL版本函數(shù)生成hash的算法不一樣。(3)Oracle在Oracle數(shù)據(jù)庫中,hash是存儲(chǔ)在$表的password列中。其中dba_users的視圖指向于$表,但是自O(shè)racle11g開始,hash不再出現(xiàn)在dba_users視圖中了,Oracle的hash是數(shù)據(jù)加密標(biāo)準(zhǔn)(DES)hash。$表中包含Oracle數(shù)據(jù)庫的用戶以及hash??梢允褂孟铝蠸QL查詢來獲得hash,如圖3-8所示:圖3-8SQL查詢獲得hash針對(duì)OracleDES角色hash,如圖3-9所示:圖3-9查詢OracleDES角色hash針對(duì)OracleSHA1hash(Oracle11g以上),如圖3-10所示:圖3-10Oracle11g以上查詢SHA1hashOracle數(shù)據(jù)庫安裝時(shí)附帶了很多其他的默認(rèn)表,這些表中有時(shí)也存儲(chǔ)著hash,有時(shí)甚至還包含明文密碼。很多時(shí)候明文通常都是在表中。文件讀寫技術(shù)MySQL數(shù)據(jù)庫的文件讀寫MySQL提供了一個(gè)很敏感的功能,該功能經(jīng)常被攻擊者利用,該功能是SQL語句中可以使用LOADDATAINFILE和LOAD_FILE命令來進(jìn)行文件讀取,可以將文件以文本文件的方式讀取存儲(chǔ)到數(shù)據(jù)庫中。下面來示例LOADDATAINFILE的使用方法。創(chuàng)建一個(gè)文本文件,名為,如圖3-11所示:圖3-11內(nèi)容然后在MySQL控制臺(tái)下運(yùn)行下列命令,作用是創(chuàng)建一張表來保存信息,如圖3-12所示:圖3-12創(chuàng)建表然后使用下面的命令導(dǎo)入數(shù)據(jù)到表中,如圖3-13所示:圖3-13導(dǎo)入數(shù)據(jù)到表然后查詢剛新建的表,可以看到文本文件已經(jīng)導(dǎo)入到數(shù)據(jù)庫中,如圖3-14所示:圖3-14表中導(dǎo)入的數(shù)據(jù)MySQL數(shù)據(jù)庫還提供了LOAD_FILE函數(shù)來進(jìn)行文件的讀取,該函數(shù)可以不用創(chuàng)建數(shù)據(jù)表就可以直接查看到結(jié)果,如圖3-15所示:圖3-15LOAD_FILE文件讀取攻擊者通常利用上面的命令函數(shù)來讀取應(yīng)用系統(tǒng)的配置文件,甚至可以通過讀取的編碼轉(zhuǎn)換變形等讀取到系統(tǒng)的hash文件。對(duì)于MySQL寫文件,與在文章前面的說到的MYSQLLOADDATAINFILE讀文件命令有一個(gè)相對(duì)應(yīng)的寫文件的命令slectintooutfile(dumpfile),就可以用來寫文件。MySQL的這條命令可以將select語句的記過直接寫入到一個(gè)完全可讀文件中,同時(shí),MySQL的dumpfile允許直接寫入二進(jìn)制文件。寫文件示例,如圖3-16所示:圖3-16MYSQLoutfile寫文件上述示例中的SQL語句執(zhí)行后,會(huì)在/tmp目錄中創(chuàng)建一個(gè)文件。SQLServer數(shù)據(jù)庫的文件讀寫對(duì)于MicrosoftSQLServer的文件讀取方法,攻擊者通常借用的最多的就是BULKINSERT語句。下圖3-17所示是使用MicrosoftSQLQueryAnalyzer進(jìn)行的測試示例:圖3-17SQLServer文件讀取測試SQLServer的寫文件可以使用前面說的讀取文件的的方法來有效地向文件系統(tǒng)寫文件。示例如圖3-18所示:圖3-18SQLServer寫文件測試MicrosoftSQLServer還可以從數(shù)據(jù)源創(chuàng)建文件的能力,方法如圖3-19所示:圖3-19SQLServer創(chuàng)建文件對(duì)于SQLServer的SQL注入攻擊利用,很多SQL注入工具的都是使用xp_cmdshell來實(shí)現(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代碼才能夠運(yùn)行。Oracle中通過三種不同的接口來訪問文件:Utl_fiel_dir/OracledirectoriesJavaOracleText在默認(rèn)情況下,非特殊權(quán)限的用戶是沒有權(quán)限在操作系統(tǒng)層讀寫文件的。Oracle數(shù)據(jù)中攻擊者讀文件最常用的是使用utl_file_dir和Oracledirectories這兩種方法。使用utl_file_dir可以讓Oracle數(shù)據(jù)庫在系統(tǒng)中指定一個(gè)目錄,數(shù)據(jù)庫的用戶都可以在指定的該目錄中進(jìn)行文件讀寫。若設(shè)置utl_file_dir的值為*,則用數(shù)據(jù)庫寫文件的操作就沒有了目錄限制。下表3-4所示列舉的就是使用utl_file_dir/Oracledirectories的方法基于Oracle數(shù)據(jù)庫來讀取文件的情景:表3-4Oracle數(shù)據(jù)庫utl_file_dir/Oracledirectories的方法讀文件下面提供的就是一個(gè)Oracle讀取文件的示例,示例中利用PL/SQL代碼讀取了位于MEDIA_DIR目錄下的一個(gè)文本文件,讀取了其中的1000個(gè)字節(jié)。如下圖3-21所示圖3-21Oracle讀取文件自O(shè)racle9i開始,Oracle數(shù)據(jù)庫提供了從外部表讀文件的功能。Oracles數(shù)據(jù)庫可以使用SQL*Loader或OracleDatapump從一定結(jié)構(gòu)的文件中讀取到文件。下面的示例是針對(duì)于從外部表讀取文件的代碼,如圖3-22所示:圖3-22從外部表讀取文件在Oracle數(shù)據(jù)庫中,除了使用utl_file_dir、Oracledirectory這兩種方法外,還可以使用Java程序來進(jìn)行文件的讀寫。可以在MacroIvaldis的Web站點(diǎn)上找到該方法的示例代碼,網(wǎng)址為:除以上方法外,還有一種是利用OracleText,這是一種比較少見的讀取文件的技術(shù)。它需要將想讀取的文件插入到一張表中,然后創(chuàng)建一個(gè)全文索引或者等待索引創(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方法將插入到一張表中對(duì)于Oracle數(shù)據(jù)庫寫文件,與讀文件一樣,同樣提供了很多從底層操作系統(tǒng)創(chuàng)建文件的方法,可使用Utl_file、DBMS_ADVISOR、外部表、Java、操作系統(tǒng)命令和重定向等方法來進(jìn)行文件的寫入操作。從Oracle9i以后,使用utl_file方法可以在文件系統(tǒng)上寫入二進(jìn)制文件。其中,DBMS_ADVISOR基本是創(chuàng)建文件最快捷的方式,下面的示例創(chuàng)建一個(gè)的文件,內(nèi)容為dllktest:CreatedirectoryEXTas'C\'EXECSYS.('dllktest'.'EXT','')從Oracle10g以后,可以使用外部表創(chuàng)建一個(gè)包含用戶名和密碼的文件,如圖3-24所示:圖3-24從外部創(chuàng)建包含用戶名和密碼的文件可以在MacroIvaldi的Web站點(diǎn)上找到Java的示例代碼:執(zhí)彳丁系統(tǒng)命令執(zhí)行系統(tǒng)命令根據(jù)數(shù)據(jù)庫來操作分別有以下幾種方式:MySQL執(zhí)行系統(tǒng)命令MySQL數(shù)據(jù)庫本身并不支持執(zhí)行shell命令。但大多數(shù)情況下,若MYSQL數(shù)據(jù)庫服務(wù)器和WEB服務(wù)器沒有分離,是位于同一服務(wù)器上時(shí),這樣攻擊者可以先使用“selectintoDUMPFILE”的方法在服務(wù)器上寫上一個(gè)webshell,然后通過webshell來對(duì)操作系統(tǒng)進(jìn)行控制執(zhí)行命令。SQLServer執(zhí)行系統(tǒng)命令在MicrosoftSQLServer中,可以利用xp_cmdshell的方法來直接執(zhí)行所要執(zhí)行的命令。如下圖3-25所示:圖3-25xp_cmdshell執(zhí)行命令SQLServer在默認(rèn)情況下,是禁止對(duì)組件"xp_cmdshell”以及"”的訪問的,同時(shí),此組件通常也在管理員進(jìn)行服務(wù)器安全配置時(shí)被關(guān)閉。但是系統(tǒng)管理員還是可以通過使用sp_configure的方法來啟用"xp_cmdshell”,這樣就給攻擊者有了可趁之機(jī)。而攻擊者可以通過執(zhí)行其他的幾條指令進(jìn)行恢復(fù):;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)建了一個(gè)名為的文件,并且是由Sqlplus來執(zhí)行的文本文件。示例如下圖3-27所示:圖3-27本地PL/SQL執(zhí)行系統(tǒng)命令其他方法除了上面的提到的執(zhí)行命令的方法外,還可以使用數(shù)據(jù)庫中的其他功能來執(zhí)行系統(tǒng)命令:Altersystemsetevents本地PL/SQL9i緩沖區(qū)溢出+shellcode自定義代碼當(dāng)然,對(duì)于大多數(shù)攻擊者來說,通常攻擊者都是通過數(shù)據(jù)庫來寫入一個(gè)木馬文件,然后通過基于調(diào)用數(shù)據(jù)庫組件或者其他的組件的木馬文件來進(jìn)行命令執(zhí)行。第4章SQL注入高級(jí)手法過濾繞過機(jī)制概述Web應(yīng)用通常會(huì)使用過濾應(yīng)用,設(shè)計(jì)這些過濾的目的就是防御SQL注入在內(nèi)的常見攻擊。這些過濾方式可以是位于web應(yīng)用的代碼層中,也可以通過第三方的外部實(shí)現(xiàn),如Web應(yīng)用防火墻(WAF)或入侵防御系統(tǒng)(IPS)。在SQL注入攻擊中,遇到的過濾關(guān)鍵字一般是:SQL關(guān)鍵字:landlexeclinsertlselectldeletelupdatelcountl*l%lchrlmidlmasterltruncatelcharldeclare等;特定的單個(gè)字符,比如引號(hào)標(biāo)記等;空白符;截?cái)喾???赡苓€會(huì)有代碼層級(jí)別的過濾器,使用的方法包括編碼、消除敏感字符等等各種方法,用來過濾掉畸形的數(shù)據(jù)串等,從輸入中去除掉帶有攻擊型的敏感字符然后正常處理剩下的內(nèi)容,甚至采集識(shí)別進(jìn)行二次渲染生成新的文件。這些受到保護(hù)的web應(yīng)用層,要是想利用漏洞,則需要尋找一種能避開過濾器防護(hù)的方法以便惡意輸入傳遞給易受攻擊的代碼。常見方法大小寫變換如果對(duì)于關(guān)鍵字過濾的不是太嚴(yán)格或者機(jī)制不夠完善,攻擊者有時(shí)則可以通過變換攻擊字符串參數(shù)的字符大小寫就可以繞過過濾機(jī)制。此技巧的基礎(chǔ)就是因?yàn)閿?shù)據(jù)庫不區(qū)分執(zhí)行的SQL語句代碼的大小寫。例如,如果下面的輸入被攔截:'UNIONSELECTpasswordFROMwebUsersWHEREusername='admin'--則可以通過下列方法繞過過濾:'uNioNSeLecTpasswordFroMwebUserswHeReusername='admin'--?使用編碼的方式編碼是一種很具有技巧性的技術(shù)。通常攻擊使用的是URL編碼,其最基本的方式就是將問題字符的十六進(jìn)制用ASCII碼來編碼替換它們,并且在轉(zhuǎn)換后的ASCII編碼前面加上%。如,單引號(hào)字符的ASCII碼對(duì)應(yīng)的為0x27,其URL編碼的表示方式為%27,空格則為%20。而在有時(shí),基本的URL編碼確實(shí)被一些防御過濾軟件或者過濾機(jī)制過濾掉了,但是攻擊者還可以將編碼轉(zhuǎn)換為雙URL編碼,這種情況通常就是用在有些Web應(yīng)用本身會(huì)將用戶輸入的內(nèi)容多次解碼,而攻擊者就使攻擊的參數(shù)在解碼完畢之前繞過濾防護(hù)。?構(gòu)造畸形數(shù)據(jù)包的方式攻擊者可以通過構(gòu)造畸形數(shù)據(jù)包來繞過過濾,其核心思想就是:原本是GET的數(shù)據(jù)包,用POST的方式提交。反之亦可。這個(gè)利用技巧利用的是接參函數(shù)的不規(guī)范造成的漏洞。?使用空字節(jié)繞過過濾機(jī)制對(duì)于在應(yīng)用代碼外部實(shí)現(xiàn)的SQL注入過濾,如入侵檢測系統(tǒng)或WAF,很多時(shí)候?qū)τ谶@些情況,都可以嘗試使用空字節(jié)來繞過過濾。要想利用空字節(jié)進(jìn)行攻擊,只需要在過濾程序?qū)τ谧柚沟墓舸a前插入一個(gè)使用URL編碼的空字節(jié)(%00)即可。?利用截?cái)嗉记衫@過過濾機(jī)制有些過濾防護(hù)系統(tǒng)采用對(duì)用戶輸入的數(shù)據(jù)進(jìn)行截?cái)嗷蛘哒{(diào)整數(shù)據(jù)使其在預(yù)定義的最大長度,有時(shí)可能是為了盡量阻止緩沖區(qū)溢出攻擊的行為。截?cái)嘤脩粼赟QL查詢中提供的輸入會(huì)引發(fā)漏洞。在MicrosoftSQLServer中,參數(shù)化查詢必須為每個(gè)字符串參數(shù)指定最大長度。如果參數(shù)中包含更長的輸入,那么輸入會(huì)被截?cái)喑蔀轭A(yù)定的最大長度。假設(shè)應(yīng)用允許忘記口令的用戶通過提交email的形式來找回原來的口令,如果應(yīng)用接收過長的輸入并在SQL查詢中將其截?cái)啵敲垂粽弑憧梢蕴峤幌铝械妮斎耄航酉聛懋?dāng)應(yīng)用向原來提供的email發(fā)送口令是,還會(huì)向攻擊者發(fā)送一份副本,這樣攻擊者就可以成功攻擊受害者的賬戶。構(gòu)造超長數(shù)據(jù)包的方式對(duì)于某些過濾系統(tǒng),如WAF等,攻擊者可以盡量超長的構(gòu)造一些正常的數(shù)據(jù)請(qǐng)求,然后再在后面帶入SQL注入的攻擊參數(shù),因?yàn)楹芏噙^濾系統(tǒng)在對(duì)于提交的數(shù)據(jù)數(shù)據(jù)超出某個(gè)長度以后,將不能有效的進(jìn)行過濾判斷。二階SQL注入對(duì)于前面所提到的SQL注入攻擊,都是屬于常規(guī)性的。前面提到的SQL注入在單個(gè)HTTP請(qǐng)求和響應(yīng)中的流程如下所示:(1)攻擊者HTTP請(qǐng)求中插入了精心構(gòu)造的參數(shù);(2)應(yīng)用服務(wù)器處理輸入的參數(shù),參數(shù)經(jīng)過了拼接導(dǎo)致SQL查詢被執(zhí)行;(3)應(yīng)用服務(wù)器有可能會(huì)對(duì)攻擊者請(qǐng)求的參數(shù)返回輸出結(jié)果。而這里提到另外一種高級(jí)的注入手法就是二階SQL注入。這種攻擊事情的過程如下所示:(1)攻擊者HTTP請(qǐng)求中插入了精心構(gòu)造的參數(shù);(2)應(yīng)用服務(wù)器存儲(chǔ)該輸入的參數(shù)準(zhǔn)備處理;(3)攻擊者進(jìn)行第二次HTTP請(qǐng)求,同時(shí)插入了精心構(gòu)造的參數(shù);(4)應(yīng)用服務(wù)器將處理第二次請(qǐng)求,應(yīng)用服務(wù)器將會(huì)檢索已存儲(chǔ)的參數(shù)并處理,因此導(dǎo)致了SQL查詢被執(zhí)行;(5)應(yīng)用服務(wù)器有可能會(huì)對(duì)第二次請(qǐng)求的參數(shù)響應(yīng)返回輸出結(jié)果。二階SQL注入屬于一種更細(xì)微的漏洞,通常更難被檢查到。下面舉例說明,假設(shè)一個(gè)通訊簿的應(yīng)用,在應(yīng)用系統(tǒng)中,用戶可以保存朋友的聯(lián)系信息。用戶在創(chuàng)建一個(gè)聯(lián)系人時(shí),用戶可以輸入姓名、Email和地址等信息。應(yīng)用系統(tǒng)使用INSERT語句為該聯(lián)系人創(chuàng)建新的數(shù)據(jù)庫記錄,并將輸入中的引號(hào)雙重編碼以防止SQL注入攻擊。流程圖如圖4-1所示:圖4-1通訊簿的添加記錄流程圖而當(dāng)用戶修改已存在的聯(lián)系人時(shí),應(yīng)用系統(tǒng)將會(huì)先使用SELECT檢索該聯(lián)系人的信息,并保存到內(nèi)存中;然后使用用戶提供的新信息更新相關(guān)數(shù)據(jù),并在此對(duì)該輸入中的引號(hào)進(jìn)行重新編碼,而用戶沒有更新的數(shù)據(jù)項(xiàng)將在內(nèi)存中將保持不變;最后使用UPDATE語句將內(nèi)存中的數(shù)據(jù)回寫到數(shù)據(jù)中。這個(gè)過程的流程圖如圖4-2所示如下:圖4-2通訊薄應(yīng)用更新數(shù)據(jù)流程圖假設(shè)上例中引號(hào)雙重編碼可以有效的防止常規(guī)的SQL注入。但是,這樣的情況下應(yīng)用系統(tǒng)仍然易受到二階SQL注入攻擊。若攻擊者想利用該漏洞,首先需要使用某個(gè)字段中的攻擊payload創(chuàng)建一個(gè)聯(lián)系人。現(xiàn)假設(shè)數(shù)據(jù)庫系統(tǒng)是MicrosoftSQLServer,使用下列語句創(chuàng)建一個(gè)聯(lián)系人;a'+@version+'a輸入中的引號(hào)被雙重編碼,最終INSERT語句會(huì)如下所示:聯(lián)系人的姓名安全的保存到數(shù)據(jù)庫中了。接下來更新創(chuàng)建聯(lián)系人,只需要提供一個(gè)新值即可。應(yīng)用首先檢索已存在聯(lián)系人的信息:SELECT*RROMwebUserswherecontactid=123檢索出來的信息保存在內(nèi)存中。應(yīng)用系統(tǒng)使用新提供的數(shù)據(jù)值替換內(nèi)存中的值,并將引號(hào)雙重編碼。然后執(zhí)行UPDATE語句,將信息保存到數(shù)據(jù)庫中:UPDATEwebUsersSETname='a'+@@version+'a',address='mianyangswust',...WHEREcontactid=123到上面這個(gè)語句后,攻擊以成功執(zhí)行并修改了應(yīng)用的查詢。當(dāng)查看更新過的聯(lián)系人的細(xì)節(jié)信息時(shí),顯示出來的是:Name:aMicrosoftSQLServer....Copyright(c)....(Build2600:)aAddress:mianyangswust通訊薄應(yīng)用系統(tǒng)成功的執(zhí)行了攻擊者構(gòu)造的SQL語句,這就證明該應(yīng)用存在SQL注入攻擊漏洞,并且可被攻擊利用?;旌瞎艋旌瞎艟褪侵甘褂枚喾N攻擊技巧來對(duì)應(yīng)用服務(wù)器進(jìn)行攻擊,同時(shí)也可以就SQL注入漏洞與其他漏洞或者技術(shù)相結(jié)合起來來進(jìn)行應(yīng)用服務(wù)器攻擊。如,在有時(shí),可以利用SQL注入漏洞和和其他不同的漏洞或bug進(jìn)行結(jié)合,如跨站腳本(XSS)漏洞。若進(jìn)行SQL注入利用攻擊的時(shí)候,應(yīng)用服務(wù)器并沒有給出返回的輸出回顯,可以利用該漏洞與反射XSS漏洞相結(jié)合來側(cè)面判斷SQL注入攻擊是否成功執(zhí)行來當(dāng)成返回回顯。在不同的數(shù)據(jù)庫類型和版本中,還有很多各自可利用的小bug和漏洞可以與SQL注入進(jìn)行結(jié)合。第5章自動(dòng)注入攻擊工具框架設(shè)計(jì)設(shè)計(jì)需求項(xiàng)目的需求是軟件設(shè)計(jì)和實(shí)現(xiàn)的最根本需求依據(jù)。根據(jù)SQL注入漏洞的利用過程,據(jù)分析的內(nèi)容構(gòu)建SQL注入的自動(dòng)化檢測及注入攻擊利用框架。根據(jù)SQL注入攻擊的過程設(shè)計(jì)開發(fā)一個(gè)SQL注入攻擊程序,實(shí)現(xiàn)以下功能:(1)能夠自動(dòng)掃描識(shí)別兩種以上類型的SQL注入攻擊;(2)能夠利用SQL注入漏洞,進(jìn)行數(shù)據(jù)庫攻擊,如猜測帳號(hào)、口令等;(3)至少具有對(duì)四種類型的數(shù)據(jù)庫進(jìn)行進(jìn)行攻擊檢測,能夠?qū)?shù)據(jù)庫的結(jié)構(gòu)信息進(jìn)行猜解,能對(duì)數(shù)據(jù)庫進(jìn)行數(shù)據(jù)操作;(4)能夠利用SQL注入執(zhí)行系統(tǒng)命令,能對(duì)有一定權(quán)限的目標(biāo)進(jìn)行文件操作和提權(quán)操作;(5)能一定程度上自定義注入攻擊以繞過簡單防注入機(jī)制。自動(dòng)注入攻擊工具框架總體設(shè)計(jì)通過對(duì)Python程序編寫的學(xué)習(xí)和研究,軟件分成三個(gè)主體部分:自動(dòng)抓取目標(biāo)Web網(wǎng)站鏈接;檢測是否存在SQL注入漏洞;進(jìn)行SQL注入攻擊。自動(dòng)注入攻擊工具框架總體架構(gòu)圖如圖5-1所示:圖5-1自動(dòng)注入攻擊工具框架總體架構(gòu)圖關(guān)鍵技術(shù)需要識(shí)別Web應(yīng)用程序是否具有SQL注入漏洞,首先必須得要找出目標(biāo)Web應(yīng)用程序的網(wǎng)站鏈接,并且識(shí)別該鏈接是否為可控制輸入數(shù)據(jù)。只有有了這個(gè)基礎(chǔ),才有可能是產(chǎn)生可控的數(shù)據(jù)交互。然后通過遍歷發(fā)送HTTP請(qǐng)求以及特殊數(shù)據(jù)來觸發(fā)和進(jìn)一步驗(yàn)證,通過服務(wù)器處理發(fā)送的數(shù)據(jù)所產(chǎn)生的反應(yīng)來一步步的判斷SQL注入。對(duì)于識(shí)別和抓取目標(biāo)Web系統(tǒng)的鏈接,設(shè)計(jì)有兩條思路,一為通SWeb爬蟲實(shí)現(xiàn)對(duì)于Web系統(tǒng)進(jìn)行鏈接爬行和抓取,然后判斷是否存在SQL注入;一為通過搜索引擎收錄的目標(biāo)Web鏈接,將之抓取過來進(jìn)行注入分析。網(wǎng)絡(luò)爬蟲技術(shù)Python內(nèi)置的很多模塊對(duì)于網(wǎng)頁爬取都有很大的作用,無需再借?Web?覽器或者服務(wù)器就能處理HTML文檔。使用httplib,urlparse,urllib2庫用來爬取鏈接、數(shù)據(jù)、圖像、Cookie等都非常便利。若想對(duì)于目標(biāo)進(jìn)行鏈接爬取,首先需要解析URL,通過Python的urlparse模塊可以很輕松的分解URL并重新組裝。關(guān)鍵代碼如圖5-2所示:圖5-2python使用urlparse解析URL當(dāng)解析了URL鏈接后,更重要的是分析頁面的內(nèi)容,因?yàn)轫撁嬷械膬?nèi)容有可能還包含著該Web網(wǎng)站的其他鏈接,這樣通過一層層的爬取,就能將Web站點(diǎn)中的頁面基本爬取完畢。Python中的HTMLParser模塊能夠根據(jù)HTML文檔中的標(biāo)簽來快捷、簡便地解析HTML文檔,這對(duì)網(wǎng)頁內(nèi)鏈接的抓取就顯得易如反掌。先定義一個(gè)HTMLParser的新的類,使用覆蓋handle_starttag()的方法來顯示所有鏈接中的href標(biāo)簽屬性,然后創(chuàng)建好一個(gè)實(shí)例用來返回HTMLParser的對(duì)象,這樣,就可以使用(url)打開并讀取HTML文檔中的內(nèi)容了。對(duì)于HTML文件中包含的鏈接內(nèi)容,可以使用read()函數(shù)讀取將數(shù)據(jù)傳遞給HTMLParser對(duì)象,HTMLParser的feed函數(shù)可以接收到數(shù)據(jù),這樣就可以抓取到頁面內(nèi)的鏈接了。同時(shí)ChilkatPythonModule是一個(gè)很強(qiáng)大的商業(yè)版Python工具開發(fā)包,Chilkat可以處理網(wǎng)絡(luò)、加密、壓縮解壓縮、XML等等內(nèi)容。關(guān)鍵代碼如圖5-3所示:圖5-3爬蟲抓取鏈接判斷,。1注入利用谷歌抓取鏈接利用爬蟲技術(shù)來對(duì)Web目標(biāo)的鏈接進(jìn)行抓取確實(shí)不失為一個(gè)好方法,但很多時(shí)候,由于服務(wù)器安全設(shè)置或者是防火墻的設(shè)置,并不允許同一臺(tái)服務(wù)器的與目標(biāo)服務(wù)器建立大量的連接請(qǐng)求。很多時(shí)候網(wǎng)絡(luò)爬蟲的效率和效果并不是很好。這時(shí)就可以利用搜索引擎搜索的關(guān)鍵字來定位與目標(biāo)相關(guān)的Web鏈接,然后直接將抓取的鏈接進(jìn)行SQL注入檢測。核心代碼如圖5-4所示:圖5-4抓取谷歌收錄的Web鏈接識(shí)別服務(wù)器響應(yīng)信息當(dāng)在測試SQL注入漏洞時(shí),發(fā)送給目?Web服務(wù)器一些非法或者意外的字符后,需要根據(jù)服務(wù)器返回的信息來判斷是否存在SQL注入漏洞或者是SQL注入攻擊是否成功執(zhí)行。這就需要識(shí)別服務(wù)器響應(yīng)的信息。需要對(duì)于頁面中的內(nèi)容進(jìn)行識(shí)別。對(duì)于SQL注入頁面判斷來說,常規(guī)的注入,基于錯(cuò)誤的頁面可以通過判定訪問的正常頁面與返回的頁面進(jìn)行比較。首先記錄正常頁面的信息,然后發(fā)送非法請(qǐng)求后再次記錄返回的頁面信息,通過分析出產(chǎn)生錯(cuò)誤的頁面中數(shù)據(jù)的不同來確定頁面是否有誤。如正常頁面中網(wǎng)頁包含字符"true”,通過,。匚注入測試請(qǐng)求后返回的爆錯(cuò)頁面中并不會(huì)存在字符“true”,這樣就可以通過分析定義關(guān)鍵字“true”來判斷測試是否成功。而這其中關(guān)鍵的地方就在于怎樣讓程序來識(shí)別頁面內(nèi)容中的信息。同樣在Python中,可以使用HTMLParser模塊,使用覆蓋handle_data()的方法來解析文本數(shù)據(jù)。關(guān)鍵代碼如圖5-5所示:圖5-5python解析文本數(shù)據(jù)在對(duì)于一些服務(wù)器的返回爆錯(cuò)信息中,可以直接通過識(shí)別服務(wù)器上的每一個(gè)HTTP響應(yīng)對(duì)象中的respose包含的數(shù)字“狀態(tài)碼”。對(duì)于服務(wù)器的httperror,urlopen會(huì)產(chǎn)生一個(gè)httperror。典型的錯(cuò)誤包含“404”(頁面無法找到),“403”(禁止請(qǐng)求),和“401”(需驗(yàn)證)。提取Cookie信息使用Python從頁面中提取cookies信息,可以使用cookielib模塊中的LWPCookieJar(涵數(shù)創(chuàng)建一個(gè)cookiejar來實(shí)現(xiàn)。LWPCookieJar(涵數(shù)可以返回一個(gè)從硬盤加載和存儲(chǔ)的Cookie的對(duì)象。然后使用urllib2模塊的build_opener([handler,...])函數(shù)創(chuàng)建opener對(duì)象來處理cookies。然后使用urlopen(Request)函數(shù)來打開HTML文件,HTML文件中的Cookie就會(huì)被存放在LWPCookieJar對(duì)象中,之后,使用save(filename)函數(shù)就獲取到Cookie了。利用爬蟲技術(shù)來對(duì)Web目標(biāo)的鏈接進(jìn)行抓取確實(shí)不失為一個(gè)好方法,但很多時(shí)候,由于服務(wù)器安全設(shè)置或者是防火墻的設(shè)置,并不允許同一臺(tái)服務(wù)器的與目標(biāo)服務(wù)器建立大量的連接請(qǐng)求。很多時(shí)候網(wǎng)絡(luò)爬蟲的效率和效果并不是很好。核心代碼如下圖5-6所示:圖5-6Python提取Cookie信息SQL注入工具模塊實(shí)現(xiàn)這里以Mysql數(shù)據(jù)庫為示例。檢測流程如下圖5-7所示:圖5-7SQL注入檢測流程存活測試,通過發(fā)送數(shù)據(jù)包GET或POST的方式根據(jù)服務(wù)器的響應(yīng)來判斷目標(biāo)Web是否存活。對(duì)于網(wǎng)頁的穩(wěn)定性測試,因?yàn)橹挥袆?dòng)態(tài)的網(wǎng)頁才會(huì)有數(shù)據(jù)的交互,對(duì)于純粹的html頁面是沒有直接的數(shù)據(jù)庫交互的,所有可以通過多次訪問來確定服務(wù)器響應(yīng)的網(wǎng)頁的md5值是否完全匹配。也可以直接通過尋找關(guān)鍵字來確定是否是動(dòng)態(tài)網(wǎng)頁。通過GET/POST方式請(qǐng)求來發(fā)送非法或者意外的數(shù)據(jù)請(qǐng)求來進(jìn)行SQL注入攻擊檢測。數(shù)據(jù)庫指紋識(shí)別,通過提交注入?yún)?shù)使得應(yīng)用服務(wù)器返回版本信息,然后通過抓取網(wǎng)頁中的內(nèi)容信息來獲取數(shù)據(jù)庫指紋。同時(shí)不同的數(shù)據(jù)庫提交的注入?yún)?shù)不同,通過返回的數(shù)據(jù)版本信息特征碼來區(qū)分?jǐn)?shù)據(jù)庫版本。數(shù)據(jù)庫指紋識(shí)別核心代碼如下圖5-8所示:圖5-8數(shù)據(jù)庫指紋識(shí)別代碼SQL注入

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論