




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、西南科技大學本科生畢業論文 PAGE 56第1章 緒論1.1 項目背景及意義SQL注入攻擊是一種非常有效且破壞性很大的滲透手段。它是針對于數據庫的一種攻擊手段,通過利用數據庫的外部接口把惡意代碼插入到SQL語言中使數據庫服務器解析并執行,以達到入侵目標數據庫及至整個操作系統的目的。了解和熟悉SQL注入原理,掌握防御SQL注入攻擊的原理和技巧就變得至關重要。SQL注入攻擊的普遍性、難捉摸性、簡易性等特點讓其成為了網絡中黑客主流攻擊方式之一。因為SQL注入是從正常的Web平臺入口進行請求訪問,和請求正常的Web頁面沒有什么區別,所以目前市面上除了專門的Web防御防火墻外,大部分防火墻都不會對這類S
2、QL注入攻擊進行監控和發出警報,若網站管理員沒有經常查看IIS日志的經驗和習慣,有可能被入侵很長一段時間后都沒有任何發覺。由于現在廣泛流行的惡意攻擊工具,SQL注入在近年來呈現一種增長的趨勢。據OWASP(開放式web應用程序安全項目)每隔三年更新一次的“十大安全隱患列表”,在近幾次公布的總結Web應用程序最可能、最常見、最危險的十大安全隱患中,SQL注入攻擊一直排列靠前。OWASP TOP 10 2010中列出的最嚴重的Web應用程序的漏洞中,注入(Injection)風險位居第一。Web應用的發展越來越成熟,應用的各項技術發展得也越來越復雜。它們涵蓋了從外部動態展示INTERNET和內部工
3、作網絡到以WEB協議方式傳遞數據的企業工作應用(如文檔管理系統等)。這些系統的實用性及其數據存儲、處理內容的機密性和敏感性對于企業的主要業務而言都非常重要。當前市面的注入攻擊檢測工具只能對單個網頁或者單個URL進行檢測和注入,無法對整個網站的漏洞進行檢測。而漏洞掃描工具可以對整個網站漏洞進行掃描卻無法進行進一步的注入攻擊檢測。很大程度上不能滿足開發人員和管理人員對網站SQL注入漏洞全面了解的要求。本研究的最終目的是分析SQL注入攻擊的類型、關鍵技術和原理,并研究SQL注入在實際應用中的操作方法,在此基礎之上,設計并開發了一套自動注入工具。因為惡意攻擊者不僅可以通過SQL注入攻擊對Web應用數據
4、進行盜取、篡改信息,還可以進一步對于服務器進行惡意操作,并且植入木馬或者后門程序,甚至控制整個服務器,這就嚴重影響了應用的正常運行以及對于應用的信息安全帶來嚴重后果。所以,對于功能齊備的SQL注入攻擊掃描與檢測工具的研究與開發具,具有非常重要的現實意義。應用程序開發者或網站管理人員使用此工具對自已的網站進行安全檢測,以達到減小SQL注入的可能性。同時,在滲透測試工作中,對于安全測試也具有很大的幫助。1.2 研究內容1.2.1 自動注入攻擊工具的研發本研究首先理解Web應用的工作原理,首先簡要概述Web應用系統通用的架構模式,理解了構建模式后能更清晰的了解SQL注入的產生過程,然后從Web應用的
5、代碼層來分析介紹是什么引起了通用的SQL注入,然后研究介紹SQL注入漏洞的利用過程。從框架到利用逐步分析SQL注入的過程和利用,然后根據分析的內容構建SQL注入的自動化檢測及注入攻擊利用框架。1.2.2 SQL注入原理SQL注入的原理,是將SQL代碼插入或者非正常時添加到應用的參數當中,并且進行了一定的拼接傳入到了后臺的數據庫服務器,最終使服務器執行了該拼接的惡意SQL命令。所有的是通過SQL語句執行的應用過程均存在被攻擊的威脅,因為SQL的多樣多變性語言結構特征使得攻擊者可以拼接構建豐富的代碼編碼手段等來拼接語句來欺騙服務器。SQL注入攻擊的主要方式就是直接將命令插入到應用服務的表單參數中傳
6、入到后臺數據庫查詢字符串中,這些參數就會被帶入到后臺數據庫服務器進行執行解析,攻擊者便可以構造惡意命令來達到攻擊目的。1.2.3 SQL注入檢測技術檢測發現SQL注入漏洞有一條簡單的規則:SQL注入是通過發送特殊數據來觸發異常操作。該規則包括如下含義:檢測Web應用上所有的輸入數據;集合SQL語法,歸類所有可能觸發異常的數據類型;檢測數據庫服務器應用響應中的異常。首先需要清楚Web瀏覽器向Web服務器發送請求的過程。不同的服務應用會有不同的體現方式,它們均處在基于Web的環境中,所以基本原理是相同的。識別和檢測應用接受的所有數據,攻擊一般都會修改這些數據,所以需要識別并分析服務器對它們的響應。
7、有時響應中會直接包含來自數據庫的SQL錯誤,有時需要不斷的方式來檢測和確定響應中細微的差別。1.3 章節安排本論文章節安排如下:第一章 緒論:綜述此研究設計的背景意義以及研究內容。第二章 SQL注入技術研究:主要對SQL注入攻擊方式過程和攻擊特點進行歸類、識別,首先理解Web應用的工作原理,概述Web應用通用的構建方式,為理解SQL注入的產生過程提供一些背景知識,接下來從Web應用的代碼層介紹引發SQL注入的因素以及哪些開發實踐和行為會引發SQL注入。分析SQL注入過程和利用,并架構如何將SQL注入的發現過程自動化以提高檢測簡單SQL注入的框架。第三章 SQL注入攻擊技術研究:根據SQL注入技
8、術,研究利用數據庫中的功能來攻擊系統端口的技術。數數據庫大多均帶有豐富的數據庫編程功能,可以利用SQL注入漏洞來訪問文件系統以執行有效的任務,可以在基礎操作上執行各種命令,擴大范圍攻擊的利用技術細節。當發現SQL注入漏洞以及初步的利用獲取數據后,可以利用SQL注入漏洞來訪問文件系統來擴大滲透范圍。還可以在操作系統上執行各種命令,攻擊可以使用它們擴展數據庫的可達區域并在更大的范圍內發動攻擊。第四章 注入高級技巧研究:Web應用通常會使用過濾應用,設計這些過濾的目的就是防御SQL注入在內的常見攻擊。這些過濾方式可以是位于web應用的代碼層中,也可以通過第三方的外部實現,如Web應用防火墻(WAF)
9、或入侵防御系統(IPS)。當注入攻擊碰到這些防御應用,若想進一步利用漏洞,則需要尋找一種能避開過濾器防護的高級方法以便惡意輸入傳遞給易受攻擊的代碼。第五章 自動注入工具框架設計:根據項目的設計需求,以及Python編程語言的特點,對自動注入攻擊工具整體框架進行分析和設計。并且分析功能模塊中的重點和關鍵技術。第六章 SQL注入測試:自動注入攻擊實例測試。第2章 SQL注入技術2.1 Web應用工作原理和架構簡析不論是用何種腳本語言開發的Web應用,都有一個共同點:具有交互性并且大多是數據庫驅動的。基于數據庫驅動的Web應用一般都包含三層:a presentation tier(表示層,Web瀏覽
10、器或呈現引擎)、a logic tier(邏輯層,如C#、ASP、.NET、PHP、JSP等編程語言)和a storage tier(存儲層,如Microsoft SQL Server、MySQL、Oracle等數據庫)。Web瀏覽器(表示層,如Internet Explorer、Safari、Firefox等)向中間層(邏輯層)發送請求,中間層通過查詢、解析數據庫(存儲層)來響應該請求。圖2-1 簡單的三層架構 Web三層架構解決方案沒有擴展性,研究人員不斷地對Web三層架構進行改進優化,在可維護性和可擴展性的基礎上建立了一種新概念:n層應用開發模式。其中有一種就是Web四層架構解決方案,該
11、方案在Web服務器和數據庫之間使用了一層中間件服務器(通常稱為應用服務器)。下圖2-2中,Web瀏覽器(表示層)向中間層(邏輯層)發送請求,后者一次調用由位于應用層的應用服務器所提供的API,應用層通過查詢、更新數據庫(存儲層)來響應該請求。圖2-2 四層架構2.2 識別SQL注入SQL注入就是程序員對程序中動態的SQL語句沒有作嚴格的過濾或檢測,導致黑客能在注入點提交非法的SQL語句,導致程序和服務器的信息被泄漏。由于SQL注入的入門門檻低,隱蔽性好,破壞性大,殺毒軟件無法查殺,是當前最主流的入侵手段。SQL注入攻擊的本質,就是服務器將用戶傳入的數據在數據庫中當成了SQL代碼執行。這里便有兩
12、個關鍵因素:第一個是用戶有權限輸入數據;第二個是服務器應用數據執行了用戶傳入的數據。2.2.1 識別數據輸入Web環境是一種C/S(客戶端/服務器)架構。客戶端使用瀏覽器向Web服務器發送請求并等待響應。Web服務器接收到請求后,通過查詢、解析數據庫,將響應發送回客戶端。很明顯,雙方便必須使用一種協議作為雙方的約定,這種傳輸協議就是HTTP。首先,必須識別遠程Web應用所接收的所有數據輸入。HTTP協議定義了可以發送給服務器的操作方式,這里只關注研究與SQL注入攻擊相關的兩種方法:GET和POST。GET請求:GET是向服務器發索取數據的一種請求,是一種請求服務器的HTTP方法。使用GET請求
13、時,信息是顯示在URL中的。GET請求對用戶是透明的,如下例,WEB服務器的GET請求如下所示:GET /general/vote/show/webst/list.php?VOTE_ID=131 HTTP/1.1User-Agent: Opera/9.80 (Windows NT 6.1; U; Edition IBIS; zh-cn) Presto/2.10.229 Version/11.62Host: *.Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image
14、/jpeg, image/gif, image/x-xbitmap, */*;q=0.1Accept-Language: zh-CN,zh;q=0.9,en;q=0.8Accept-Encoding: gzip, deflateCookie: SID_4143=82b90aee; SID_99=bfb67d86; UI_COOKIE=0; LWr7_2132_ulastactivity=85ebvMTfOWVLvxgzzzV4uv0PkMG14SL7yUg9SVBP%2BzMNhDtpaSVL; PHPSESSID=073edfe7894acb322ba1061678e82090; lzsta
15、t_uv=10735291292559574567|2879946Proxy-Connection: Keep-Alive該請求中與數據查詢相關的參數在URL中,格式如下所示:list.php?VOTE_ID=131上述示例中包含一個參數:VOTE_ID。服務器應用將會把參數值帶入數據庫中解析執行,然后將響應結果返回給客戶端。POST請求:POST請求是作為HTTP消息的實際內容發送給web服務器的HTTP方法。在瀏覽器中填寫表單并點擊Submit按鈕時通常使用該方法。下面的例子是瀏覽器發送給遠程WEB服務器的內容,請求如下所示:POST /general/vote/show/webst/pl
16、_write.php?ITEM_ID=345 HTTP/1.1User-Agent: Opera/9.80 (Windows NT 6.1; U; Edition IBIS; zh-cn) Presto/2.10.229 Version/11.62Host: *.Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1Accept-Language: zh-CN,zh;q=0.9
17、,en;q=0.8Accept-Encoding: gzip, deflateReferer: http:/*./general/vote/show/webst/pl_write.php?ITEM_ID=345Cookie: SID_4143=82b90aee; SID_99=bfb67d86; UI_COOKIE=0; LWr7_2132_ulastactivity=85ebvMTfOWVLvxgzzzV4uv0PkMG14SL7yUg9SVBP%2BzMNhDtpaSVL; PHPSESSID=073edfe7894acb322ba1061678e82090; lzstat_uv=1073
18、5291292559574567|2879946Connection: Keep-AliveContent-Length: 40Content-Type: application/x-www-form-urlencodedcontent=POST+TEST&submit=+%CC%E1+%BD%BB+其他注入數據:除了GET或POST參數傳輸檢索數據外,HTTP請求的其他內容也可能會觸發SQL注入漏洞。Cookie就是個很典型的例子。Cookie由服務器發發送到用戶端的瀏覽器,并會在用戶端每次請求中都會回發給服務器。Cookie一般被用于辨別用戶身份、進行session跟蹤而儲存在用戶本地終端
19、上的數據。由此可見,用戶完全可以控制發送給服務器的Cookie內容,所以Cookie也作為一種有效的用戶數據輸入方式和易受注入影響的對象。如:GET /elf/home.php HTTP/1.1Host: User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-En
20、coding: gzip, deflateCookie: _utma=235504861.1045863906.1362721158.1363922147.1364178877.17; _utmz=235504861.1363878397.13.3.utmcsr=|utmccn=(referral)|utmcmd=referral|utmcct=/app/procurement/bids/; s_nr=1364197401953-Repeat; s_vnum=1364799600337%26vn%3D19; s_vi=CSv1|289CC3EC851D1C92-400001326012B18C
21、CE; fsr.r=d:90,i:d046012-55164494-d970-1460-e7619,e:1363330479331; elf_e=hack; elf_s=ab; elf_h=86b9fa33b1b652a3c73ea82f5e6263beConnection: keep-alive該應用系統存在一個cookie注入漏洞,漏洞代碼下圖2-3,程序代碼沒有任何過濾就將用戶傳入的cookie參數帶入到數據庫中進行執行。用戶只要利用抓包工具將傳入的數據包截下來修改cookie字段的數據就可以將惡意命令傳入到后臺數據庫進行執行。圖2-3 存在漏洞的代碼文件2.2.2 操作請求參數下面先通
22、過介紹一個非常簡單的例子來熟悉SQL注入漏洞。以我們學校http:/*./為例。瀏覽到某頁面的URL如下: HYPERLINK http:/*./general/vote/show/webst/list.php?VOTE_ID=131 http:/*./general/vote/show/webst/list.php?VOTE_ID=131List.php頁面收到一個名為VOTE_ID的參數。現在開始開始手動修改VOTE_ID參數的值,將其改為意外的數值。按照下列方式進行首次嘗試: HYPERLINK http:/*./general/vote/show/webst/list.php?VOTE
23、_ID=131 http:/*./general/vote/show/webst/list.php?VOTE_ID=attacker上例中使用不存在的類型名向服務器發出請求。服務器返回如下圖2-4響應:圖2-4 服務器響應結果1該警告是當用戶嘗試從空結果集中讀取記錄時,數據庫返回的一個MYSQL數據庫錯誤。該錯誤表明遠程應用未能正確處理意外的數據。繼續進行推理操作,現在向之前發送的值添加一個單引號(),發送下列請求: HYPERLINK http:/*./general/vote/show/webst/list.php?VOTE_ID=131 http:/*./general/vote/sho
24、w/webst/list.php?VOTE_ID=attacker下圖2-5是服務器的響應:圖2-5 服務器響應結果2服務器返回下列錯誤:請聯系管理員 錯誤#1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1SQL語句: SELECT END_DATE from VOTE_TITLE where VOTE_ID=attacker文件:D:/*root
25、/general/vote/show/webst/list.php不難發現,有些應用在處理用戶數據時會返意想不到的結果。WEB檢測的異常并非都是由SQL注入漏洞引起的,還會受到很多其他因素的影響。這里還可以通過進行另一個測試來識別SQL Server和Oracle中的漏洞。向Web服務發送下面兩個請求: HYPERLINK /general/vote/show/webst/list.php?VOTE_ID=131 http:/*./general/vote/show/webst/list.php?VOTE_ID=131 HYPERLINK /general/vote/show/webst/li
26、st.php?VOTE_ID=13+1 http:/*./general/vote/show/webst/list.php?VOTE_ID=13+1在MYSQL中,與其等價的請求為: HYPERLINK /general/vote/show/webst/list.php?VOTE_ID=131 http:/*./general/vote/show/webst/list.php?VOTE_ID=131 HYPERLINK /general/vote/show/webst/list.php?VOTE_ID=13 http:/*./general/vote/show/webst/list.php?V
27、OTE_ID=13 1如果兩個請求結果相同,則很可能存在SQL注入漏洞。2.2.3 數據庫響應測試SQL注入攻擊漏洞時,可能會從WEB服務器收到不同的數據庫錯誤響應,所以對于這些錯誤的意義需要熟悉和掌握。圖2-6展示了產生SQL注入錯誤的過程和WEB服務器對錯誤進行處理得過程。圖2-6 產生SQL注入錯誤的過程中的信息流產生SQL注入錯誤的過程中發生了以下事件:用戶端發送請求數據,嘗試觸發SQL注入漏洞。假設用戶發送了一個帶單引號的值。WEB服務器接收到用戶端的請求數據,并向數據庫服務器發送SQL查詢。本例中,在WEB服務器執行的SQL語句中包含了用戶輸入參數并且構造了一條SQL查詢,該查詢因
28、末尾存在單引號而導致語法錯誤。數據庫服務器接收執行了格式不正確的SQL查詢,并向WEB服務器返回一條錯誤消息。WEB服務器接收到的來自數據庫的錯誤向用戶發送HTML響應。下面列舉常見的SQL錯誤。SQL Server錯誤在請求中插入一個單引號在參數中會產生數據庫錯誤。對于SQL Server中,遠程應用返回類似于下列內容的錯誤,圖2-7所示:/Display_News.asp?ArticleID=2650圖2-7 SQL Server錯誤通過上面的例子,我們可以確定運行在數據庫上的遠程SQL語句與下面的內容相似:SELECT *FROM NewsWHERE ArticleID=2650該Web
29、應用未檢測單引號,所以數據庫服務器響應返回了一個錯誤。MYSQL錯誤下面介紹一下典型的mysql錯誤。MYSQL可以在很多架構和操作系統下執行,兼容性很好,常見的配置是在裝有linux操作系統的apache web服務器上運行php,但它也可以出現在很多其他場合中。下列錯誤通常表明存在MYSQL注入漏洞:Warning:mysql_fetch_array(1):supplied argument is not a valid MySQL result resource in /var/www/list.php on line 92.2.4 自動尋找SQL注入對于SQL注入工具的開發,如何的適度
30、的自動化SQL注入的請求是其中的關鍵。識別數據輸入是可以自動化的內容,它涉及搜索WEB站點和尋找GET及POST請求。數據注入也可以自動完成,因為上一階段已經獲取了發送請求所需要的所有數據。若想自動尋找SQL注入漏洞,主要問題在于檢測遠程服務器響應中的異常。對于管理員來說,區別一個錯誤頁面或其他類型的異常頁面非常容易;但對于程序來說,要識別出服務器異常輸出,有時會非常困難。某些情況下,應用可以很容易地檢測到數據庫發生了錯誤,如以下情形下:WEB應用服務器返回由數據庫產生的SQL錯誤;WEB應用服務器返回HTTP500內部服務器無法執行錯誤;某些SQL盲注情況下。但對于其他情況,應用系統將很難識
31、別存在的漏洞,而且很容易出現遺漏。所以,自動發現SQL注入存在著一定的局限性,自定義的測試和手動測試也顯得非常重要。2.3 SQL盲注很多時候,WEB服務器為了安全設置關閉了錯誤回顯,但是這可以阻擋住SQL注入攻擊嗎?當發現一個SQL注入點,但應用只提供了一個自定義的通用的錯誤頁面;或者雖然提供了正常的頁面,但與期望的測試響應存在一些小的差異。基于這種情況下的SQL注入攻擊測試,都屬于SQL盲注。所謂“盲注”,就是在在注入攻擊Web應用時,攻擊語句被帶入到后臺數據庫中執行,但是服務器查不會返回錯誤或者執行結果的回顯的情況下進行的注入攻擊。服務器沒有了攻擊者期望的錯誤回顯,對于攻擊者來說沒有了非
32、常重要的SQL注入攻擊“調試信息”,所以攻擊者必須找到一個方法來從側面驗證注入的SQL語句是否得到成功執行。2.3.1 注入帶判定的參數(Timing Attack) 當已經識別可能存在SQL注入漏洞,但又沒有正常的回顯的時候,要想進一步確認和檢測漏洞,一般可以提交包含副作用的查詢參數。比較老的技術是使用timing attack,計時攻擊。2011年3月27日,一個叫TinKode4的黑客在著名的安全郵件列表Full Disclosure上公布了他入侵的細節。這次入侵事件,就是因為一個SQL盲注漏洞引起的。據黑客公布描述,當時這個漏洞是出現在下面這個頁面,如圖2-8:圖2-8 漏洞頁面可以看
33、到網址URL:index.html?id=1170,通過修改參數id后的數值,服務器將返回不同的查詢的客戶信息。這個漏洞中,id=這個參數鏈接就是一個很隱蔽的“SQL盲注”漏洞,攻擊者通過精心構造id參數的URL,就可以進行SQL注入攻擊。利用通常的SQL語句比如“and 1=2”在此鏈接下是無法看出異常的,因為應用服務器不會返回任何異常的數據。在這里,TinKode4利用“SQL盲注”的一個技巧:Timing Attack,用來確認漏洞是否存在。在MYSQL數據庫中,有個函數:BENCHMARK(),可以用來測試函數性能。同時它含有兩個參數:BENCHMARK(count,expr)函數執行
34、的結果,是將表達式expr執行count次。比如:mysql SELECT BENCHMARK(1000000,ENCODE(hello,dllk);+| BENCHMARK(1000000,ENCODE(hello,dllk) | 0 |+1 row in set (4.97 sec)就將ENCODE(hello,dllk)執行了1000000次,共用4.97秒。因此,攻擊者就可以利用MYSQL數據庫中的這個函數BENCHMARK(),在傳入到后臺服務器的參數中讓同一個SQL函數在數據庫中執行若干次,然后通過服務器執行該SQL語句的時間的長短變化,就可以用來側面判別出SQL注入攻擊語句是否已
35、經成功的執行。這個攻擊利用技巧在盲注中被稱為Timing Attack。在此次的攻擊中,攻擊者接下來就是利用Timing Attack攻擊。比如構造的攻擊參數id值如圖2-9:圖2-9 Timing Attack攻擊語句1這段攻擊Payload首先進行的是判斷庫名的第一個字母是否為小寫的w,即CHAR(119)。如果判斷結果為真,就會執行后面的BENCHMARK()函數,執行該函數就會造成較長的延時;如果判斷結果為假,則該攻擊語句很快就會被執行完畢,頁面將很快得到加載。這樣,攻擊者就可以通過構造攻擊Payload猜解遍歷出所有的庫名字母,直到將整個數據庫名全部猜解完成為止,然后進一步可以猜解遍
36、歷出數據表明、列明和數據內容,將可以將整個數據中的內容下載過來。同時,攻擊者還可以通過以下Payload獲取到更多有用信息,圖2-10:圖2-10 Timing Attack攻擊語句2此外,攻擊者可以通過利用Dump File的方法如圖圖2-11,來寫入一個webshell木馬:圖2-11 DumpFile寫如websehllTiming Attack是SQL盲注中的一種高級技巧。在各種不同的數據庫中,都有與BENCHMARK()函數類似的東西。如MYSQL:BENCHMARK(1000000,MD(1) or SLEEP(5)PostgreSQL:PG_SLEEP(5) or GENERAT
37、E_SERIES(1,1000000)MS SQL Server:WAITFOR DELAY 0:0:5如,在Microsoft SQL Server中,可使用如下SQL代碼來產生一個8秒的暫停:WAITFOR DELAY 0:0:8同樣,對于MYSQL數據庫,攻擊者也可以使用SLEEP()函數(該函數適用于MYSQL5.0.12及以后的版本)來進行Timing Attack。同時,攻擊者還可以利用應用服務器的回顯輸出來進行判斷。例如,若將注入下面的字符串: AND 1=2插入到一個搜索字段中,將產生與 OR 1=1不同的結果響應。2.3.2 Parameter Splitting and B
38、alancing技術如果注入帶判斷的函數不起作用,可以嘗試“parameter splitting and balancing”(參數拆分與平衡)技術。拆分是指拆分正常的參數輸入,平衡則是指保證最終的查詢與正常的輸入是一致。其基本思想是:將正常的請求參數進行拆分,然后使用SQL語句關鍵字對它們進行修改,最終需保證與原數據不同,使得后臺數據庫服務器解析執行帶入的參數時,與正常的參數請求一樣的同時也帶入了“非法”的請求。例如,在http:/*./view_review.php?id=5這個URL中,將id參數的值插入到一條SQL語句中構成下列查詢:SELECT review_content,rev
39、iew_author FROM reviews WHERE id=5如果使用2+3替換5,那么輸入應用中的參數將不同于原始請求中的輸入,但SQL數據執行在結果上是等價相同的:SELECT review_content,review_author FROM reviews WHERE id=2+3這種方式不僅僅只局限于數字值型。假設http:/*./view_review.php?Author=dllk這個URL返回與某一數據庫項目相關的信息,我們將Author參數的值放到一條SQL查詢中構成下列查詢:SELECT COUNT(id) FROM reviews WHERE review_aout
40、hor = dllk可以使用特定的數據庫運算符將dllk字符串拆分,向Web服務應用提供與dllk相對應的不同的參數輸入。對于再oracle數據庫的利用中,可以使用“|”運算符來鏈接兩個字符串:SELECT COUNT(id) FROM reviews WHERE review_aouthor = dl|lk它與之前的第一個查詢在最終執行的參數是等價的。下表2-1是帶子查詢占位符的拆分字符串參數:表2-1 帶子查詢占位符的拆分字符串第3章 SQL注入攻擊技術研究3.1 識別數據庫要成功進行SQL注入攻擊,還有重要的一點就是需要探測出服務器正在使用的數據庫系統DBMS。若是攻擊者連數據庫系統都無
41、從判斷,就不可能構造出有效的“惡意”參數來進行SQL注入,也就無法實施攻擊。通常WEB架構技術可以使我們猜測驗證出數據庫系統。例如,ASP和.NET的WEB服務應用通常使用的事Microsoft SQL Server作為數據庫系統,而PHP應用則很可能使用MYSQL數據庫。如果是用JAVA、JSP等編寫的,那么很有可能使用的是Oracle數據庫。在識別SQL注入漏洞所存在的數據庫中,如果不是SQL盲注,通常情況下可以很快的判斷出數據庫系統。如果數據庫響應返回出SQL注入的錯誤消息,一般都會在報錯的響應中可以找到是何數據庫系統的線索。如圖3-1 SQL Server錯誤信息:圖3-1 SQL S
42、erver錯誤信息根據報錯信息可以很直接的就判斷數據庫類型為Microsoft SQL Server。這種方法就是添加一個單引號將使得構造的SQL語句參數帶入到數據庫服務器當作SQL語句來執行,這將產生一條語法錯誤而暴露出錯誤信息。如圖3-2 SQL Server錯誤信息: HYPERLINK http:/*./general/vote/show/webst/list.php?VOTE_ID=131 http:/*./general/vote/show/webst/list.php?VOTE_ID=131圖3-2 SQL Server錯誤信息在錯誤消息中明確提到了“MySQL”,還附加了一些關
43、于出錯內容的有用細節。如下表3-1返回各種DBMS所對應的查詢:表3-1 返回各種DBMS所對應的查詢例如,對于SQL Server 2000 SP4來說,執行SELECTversion查詢時,將得到如圖3-3所示信息:圖3-3 SQL Server 2000服務器返回信息如果應用服務器并不能直接的在響應中返回所想要的數據信息,則需要一種間接的方法來觸發獲得想要的信息。不同的數據庫,在語法查詢方式上有略微的不同,不同的數據庫系統就會有不同的查詢方式。比如一個簡單查詢如下:SELECT somestring該查詢語句對于大多數主流的數據庫系統都是有效的,對于不同的數據庫系統,將查詢的字符串分成兩
44、個字串的SQL語句的時候還是存在有細微的差異的,就SQL Server、Mysql、Oracle來說,如下表3-2:表3-2 字符串分成兩個字串的SQL語句假設Web應用中沒有可以利用的SQL注入字符串參數,則可以使用之前數字參數類似的技術。這樣的話就需要一條針對特定情況特定技術的SQL語句,使得在服務器經過執行SQL語句后計算后生成一個數字。在下表3-3所示列舉的SQL語句中,在對應的數據庫系統上執行對應的SQL語句后都會生成一個整數,而若在其他不同的數據庫下執行語句的話,就將會產生錯誤。表3-3 從數字函數推斷DBMS版本3.2 注入語句獲取數據UNION語句是數據庫管理員經常使用函數之一
45、。使用UNION的SQL語句,可以連接兩條或多條SELECT語句的聯合查詢得到結果。基本語法如下所示:SELECT column-1,column-2,.,column-N FROM table-1UNIONSELECT column-1,column-2,.,column-N FROM table-2執行該查詢后,返回結果得到的是由兩個SELECT語句返回結果組成的表。通常在默認情況下,得到的返回結果中只會包含不同的數值。如果想在查詢的結果中將重復的值也顯示出來,只需要稍微修改下語法即可:SELECT column-1,column-2,.,column-N FROM table-1UNIO
46、N ALLSELECT column-1,column-2,.,column-N FROM table-2在SQL注入測試攻擊中,數據庫的UNION查詢方法對于攻擊來說作用很大:如果服務器可以正常返回第一個查詢得到的數據,若想修改加入數據庫UNION查詢,便可以利用讀取到攻擊者想要讀取的該數據庫用戶,然后就可以訪問的其他的任何一張數據表。如,如果想要找到list.asp頁面執行的查詢的數據表所返回的列數,則可以按下列方式請求URL,直到不再返回錯誤位置信息:http:/*./list.asp?Id=12+union+select+null-http:/*./list.asp?Id=12+uni
47、on+select+null,null-http:/*./list.asp?Id=12+union+select+null,null,null-獲取列的另一種方法是使用ORDER BY語句,ORDER BY語句并不是通過注入另一個查詢語句來獲得查詢結果。通過增大ORDER BY 子語句中代表列的數字就可以來識別查詢中的列數,如下所示:http:/*./list.asp?Id=12+order+by+1http:/*./list.asp?Id=12+order+by+2http:/*./list.asp?Id=12+order+by+3.若在以上使用ORDER BY 9查詢時收到第一個錯誤回顯,
48、就意味著查詢的數據庫中包含的數據有8列。當攻擊識別出數據庫的列數后,接下來就是選擇數據中的其中一列或幾列來繼續攻擊查詢數據庫中的數據了。因此,如果攻擊者想提取一個數據庫字符串值,就可以通過它來保存正在尋找的數據,以便找到一個字符串類型的列。攻擊者可以用NULL來很容易的實現,只需要重復的使用字符串示例替換掉NULL即可。例如,如果原始的數據查詢中包含4列數據,則可以做如下嘗試獲得字符串類型的列:http:/*./list.asp?Id=12+union+select+dllk,null,null,nullhttp:/*./list.asp?Id=12+union+select+null,dll
49、k,null,nullhttp:/*./list.asp?Id=12+union+select+null,null,dllk,nullhttp:/*./list.asp?Id=12+union+select+null,null,null,dllk只要數據庫沒有返回錯誤,就可知道剛才存儲dllk值的列保存的一個字符串,因此就可以用它來顯示需要的值。例如,若數據中第二列可以保存一個字符串字段,則當請求下面的URL即可存儲到第二列中:http:/*./list.asp?Id=12+union+select+null,system_user,null,null而下列URL則可以同時檢索當前用戶名和當前
50、數據庫名:http:/*./list.asp?Id=12+union+select+null,system_user,db_name(),null攻擊者通過精心構造使用UNION SELECT的SQL語句注入,就可以獲取整張數據表。假設攻擊者已經得到當前數據庫包含一張名為users的表,表中包含userid、first_name、和second_name列。則可以使用下面的方式來獲取用戶名:http:/*./list.asp?Id=12+union+select+userid,first_name,second_name,null+FROM+userrs使用UNION注入任意查詢來攻擊數據庫,
51、是一種既快捷又有效的攻擊手段技巧。但該方法并不通用,WEB應用也沒那么容易就輕易的泄漏數據庫數據。在Microsoft SQL Server中,對于攻擊者來說,攻擊者最想了解的是當前執行數據庫查詢的應用用戶是否是以系統管理員帳戶(SA)運行的。因為權限的不同,所能進行的查詢和操作就不同,在后續的擴大滲透中,在數據庫上執行的敏感的提權操作也會有所不同,對于攻擊者的攻擊的程度也不同。為確定是否為SA權限,可以使用下列注入語句查詢:IF (system_user = sa) WAITFOR DELAY 0:0:5 -該查詢將轉換為下列URL:http:/*./list.asp?id=12;if+(s
52、ystem_user = sa)+WAITFOR+DELAY+0:0:6 -語句中的System_user在SQL Server中是T-SQL函數,這個函數在數據庫中執行完成后會返回數據為當前登錄的用戶名。該Payload的執行,是根據system_user函數執行的值來判定是否執行WAITFOR函數(等待6秒)。攻擊者可以通過Web應用查詢后返回的結果加載HTML數據所花費的時間來判定是否為SA用戶。該Payload的SQL查詢語句尾部的兩條橫線是注釋作用,可以注釋掉所有可能影響原查詢結果的除偽造拼接的SQL攻擊查詢代碼。上面基于時間的判定的技巧很靈活,但是基于時間判定的的方法不適合提取大量
53、信息。可以利用基于錯誤的判定的方法,如:http:/*./list.asp?id=12/is_srvrolemember(webdmin)is_srvrolemember()也是SQL Server中的T-SQL函數,當它被執行,可以返回下列值:1:用戶屬于該組。0:用戶不屬于該組。NULL:該組不存在。我們假設用戶屬于webadmin組,那么URL中的id的參數應該等于12/1,因此,Web應用就會正常返回數據頁面。如果當前的用戶并不是webadmin組中的成員,那么此時URL中的id值就是12/0;這樣的話將會導致SQL語句查詢失敗,Web應用返回的結果是一個錯誤。對于返回的錯誤來說,錯誤
54、的具體消息內容肯定會各有千秋:錯誤可能只是由Web服務器相應錯誤返回的500 internal server error,錯誤信息也有可能包含了完整的SQL Server錯誤消息,甚至由于管理員的限制,錯誤的信息是管理員主動設置的自定義的404錯誤頁面。對于WAITFOR的基于時間的方法來說,基于錯誤來判定的方法有個很大的優點就是效率,基于時間的方法涉及查詢延遲的問題,基于錯誤的判定的方法的請求可以馬上返回注入利用的結果。當然基于錯誤的方法缺點就是將會觸發很多錯誤,這些錯誤將會被記入到服務器的日志當中,這對于攻擊者來說是不愿意見到的。不過,可以稍作修改優化,例:http:/*./list.as
55、p?id=24%2B(case+when+(system_user=sa)+then+1+else+0+end)%2B是“+”的URL編碼。最終將按照下列式子為id參數賦值:id=24+ ( case when (system_user = sa) then 1 else 0 end)如果執行的不是sa,那么id=24,請求等價于:http:/*./list.asp?id=24而如果執行查詢的用戶是sa,那么id=25,請求就等價于:http:/*./list.asp?id=25所以,攻擊者就可以可以根據Web服務器查詢后返回的結果中加載的HTML中包含的字符串的不同來判斷當前用戶是否為sa。
56、3.3 提升權限所有的數據庫系統管理員都可以對數據庫用戶的權限進行很詳細的很細微的設置和控制。管理員可以為每個用戶賦予一定量的操作執行權限來實現用戶對數據存儲信息的訪問。通常一個數據庫系統都可能包含了很多個數據庫,但是攻擊者利用的數據庫的用戶權限只能訪問其中某一個數據庫,在正常的情況下,其他的數據庫都不能進行任何操作,但是攻擊者目前掌控的數據庫中并沒有想要的信息。或者是當前數據庫的用戶權限可以讀取所有數據庫的內容,但是只有對于當前數據庫有寫權限,對于其他數據庫不能執行修改操作。攻擊者若想獲取其他數據庫的操作或者對于系統的其他地方進行操作,就需要更高的權限。這個過程就是提升權限。3.3.1 SQ
57、L Server數據庫的提權在Microsoft SQL Server中,使用命令OPENROWSET是一個很好也比較典型的的數據庫攻擊方法。OPENROWSET是可以實現SQL Server對遠程的OLE DB數據源進行一次性連接,而DBA則可以用來檢索和查詢遠程數據庫上的數據,這樣就可以作為連接數據庫的一種方法。下面是典型調用OPENROWSET的方法,例:SELECT * FROM OPENROWSET (SQLOOLEDB,Network=DMSSOCN;Address=0;uid=dllk;pwd=password,SELECT columnA FROM tableB)上述語句中以用
58、戶dllk密碼為password連接到地址為0的SQL Server數據庫并執行select columnA from tableB查詢,并返回查詢結果。SQL Server的OPENROWSET在SQL注入攻擊中有多種攻擊方式和技巧。例如在SQL Server 2000上,攻擊者可以使用OPENROWSET來進行暴力猜解SA密碼并提升權限。例如:SELECT * FROM OPENROWSET (SQLOOLEDB,Network=DMSSOCN;Address=xx.xx.x.x;uid=sa;pwd=dllktest,SELECT A)若dllktest是正確的密碼,那么執行該查詢并會返
59、回結果A;但若密碼不正確,那么將收到下面的返回信息:Login Failed for user sa.這樣就可以構造一種暴力猜解SA密碼的方法。如果找到正確的密碼,接著就可以使用sp_addsrolemember存儲過程來將用戶添加到sysadmin管理員組,這樣就可以很容易地提升權限。命令OPENROWSET同時也可以用于掃描SQL Server存在的弱口令,如:SELECT * FROM OPENROWSET (SQLOOLEDB,Network=DMSSOCN;Address=1;uid=sa;pwd=123456,SELECT A)該語句查詢嘗試以sa帳號、密碼為123456、地址為1
60、的SQL Server發出登錄驗證請求。若想實現在某一個網段內掃描所有IP地址上的SQL Server弱口令就很容易。執行完查詢語句完成后會將結果保存到一個臨時表中,然后可以使用前面提到的一些方法都可以獲取這些數據。3.3.2 Oracle數據庫的提權對于Oracle數據庫,通常通過Web應用的來進行SQL注入利用提升權限的很困難。因為在Oracle數據庫中,大多數的提權攻擊方法都需要前提是PL/SQL注入,而PL/SQL這種注入漏洞通常都很少見。若碰到PL/SQL注入漏洞,則可以通過注入PL/SQL代碼來提升權限,以及在數據庫服務器上操作系統命令。在非PL/SQL注入漏洞中,存在有一個方法,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年企業管理人員安全培訓考試試題黃金題型
- 2024-2025新員工崗前安全培訓考試試題含答案【黃金題型】
- 2025年廠級員工安全培訓考試試題答案
- 2025管理人員崗前安全培訓考試試題附答案【基礎題】
- 2025年崗位安全培訓考試試題典型題
- 2025安全培訓考試試題及答案考試直接用
- 2025公司員工安全培訓考試試題1套
- 2025年新入職員工安全培訓考試試題附答案【綜合題】
- 2025年安全管理人員安全培訓考試試題一套
- 2025-2030年中國PVC糊樹脂市場需求動態及未來發展趨勢研究報告
- 企業品牌部管理制度
- 2025至2030年中國生物質能利用產業深度分析及發展規劃咨詢建議報告
- 水利水電工程基建資料
- 2024年美容師考試相關法律法規知識試題及答案
- 學校財務人員聘任合同書
- 《健康服務與管理導論》期末復習筆記
- 預防近視控肥胖
- 高爾夫球場澆灌施工方案
- 出納員工考核試題及答案
- 河南省鄭州市2024-2025學年高三上學期1月第一次質量預測地理試題2
- 船舶碰撞培訓課件
評論
0/150
提交評論