陳 悅 蔡滿春 李璟瑩
(中國人民公安大學(xué)網(wǎng)絡(luò)安全保衛(wèi)學(xué)院 北京 102600)
隨著Web應(yīng)用技術(shù)的不斷成熟,動態(tài)網(wǎng)站以其豐富的內(nèi)容和強(qiáng)大的功能在人們的生活中備受親睞,各大高校院系、公司企業(yè)、政府部門、事業(yè)單位等都構(gòu)建起了自己的動態(tài)網(wǎng)站。但由于網(wǎng)站開發(fā)人員缺乏安全保護(hù)意識,這些網(wǎng)站的安全措施并不是很完善,因此給該類網(wǎng)站造成了很多的安全威脅。從之前的CSDN社區(qū)用戶信息泄露,到攜程網(wǎng)信息安全門事件,再到2015年上半年多省市衛(wèi)生社保系統(tǒng)出現(xiàn)大量高危漏洞,導(dǎo)致數(shù)千萬社保用戶敏感信息泄露的安全事件,都表明互聯(lián)網(wǎng)的安全問題愈發(fā)嚴(yán)峻,其中SQL注入就是一種日益增長安全威脅。尤其互聯(lián)網(wǎng)+時(shí)代到來,物聯(lián)網(wǎng)、云計(jì)算和大數(shù)據(jù)應(yīng)用不斷深入,攻擊者利用 SQL注入點(diǎn)對網(wǎng)站發(fā)起攻擊后可以操作網(wǎng)站后臺的數(shù)據(jù)庫,拖庫攻擊導(dǎo)致數(shù)據(jù)庫存儲的用戶敏感信息泄露,修改甚至破壞數(shù)據(jù)庫內(nèi)容和結(jié)構(gòu),對用戶生命財(cái)產(chǎn)安全造成嚴(yán)重侵害。
攻擊者通過構(gòu)建特定長度、類型的字符串動態(tài)SQL語句來執(zhí)行數(shù)據(jù)庫操作,將容易觸發(fā)SQL異常的代碼寫入SQL查詢語句中,造成SQL所支持?jǐn)?shù)據(jù)庫異常,然后使用一系列的技術(shù)手段實(shí)現(xiàn)數(shù)據(jù)庫拖庫。
(1)“加引號”法
單引號作為SQL數(shù)據(jù)庫中的轉(zhuǎn)義字符,其使用不當(dāng)會造成查詢異常。攻擊者通常在URL的尾部插入一個(gè)單獨(dú)的引號,造成SQL語句異常而令數(shù)據(jù)庫拋出一個(gè)錯(cuò)誤信息。例如圖1所示。
圖1 “加引號”法
(2)邏輯語句判斷法
“加引號”法直接了當(dāng),操作也很方便,但有經(jīng)驗(yàn)的網(wǎng)站編寫者通常對其進(jìn)行過濾。這樣用單引號就無法檢測到注入點(diǎn),此時(shí)可以使用邏輯語句判斷檢測是否存在SQL注入點(diǎn)。常用的邏輯語句有‘a(chǎn)nd 1=1’、‘a(chǎn)nd 1=2’等。
在網(wǎng)頁原地址后加入‘a(chǎn)nd 1=1’語句后,網(wǎng)頁會正常顯示;在網(wǎng)頁原地址后加入‘a(chǎn)nd 1=2’語句后,網(wǎng)頁會顯示異常。例如圖2所示。
圖2 邏輯語句判斷法
相比于其他工具,sq1map不僅能利用已經(jīng)發(fā)現(xiàn)的漏洞進(jìn)行SQL注入,還能通過基于啟發(fā)式的檢測來尋找漏洞。它還能獲得不同數(shù)據(jù)庫的指紋信息,并且通過帶外連接從數(shù)據(jù)庫中抓取數(shù)據(jù),訪問底層文件系統(tǒng)和在操作系統(tǒng)上執(zhí)行命令。
當(dāng)我們利用之前提到的方法找到一個(gè)網(wǎng)站的 SQL注入點(diǎn)后,接下來我們將使用一些命令進(jìn)行SQL注入攻擊,來提取網(wǎng)站的數(shù)據(jù)庫內(nèi)容信息。sq1map的拖庫步驟如下:
第一步:建立連接并列出數(shù)據(jù)庫,如圖3所示:
圖3 建立連接并列出數(shù)據(jù)庫
發(fā)現(xiàn)該網(wǎng)站數(shù)據(jù)庫共有2個(gè)。如圖4所示:
圖4 發(fā)現(xiàn)該網(wǎng)站數(shù)據(jù)庫個(gè)數(shù)
這里我們只需要注意第一個(gè)數(shù)據(jù)庫就行了,因?yàn)閕nformation_schema是MySQL默認(rèn)的數(shù)據(jù)庫,它包含了MySQL系統(tǒng)用的所有字典信息,以及數(shù)據(jù)庫系統(tǒng)中所有對象信息和進(jìn)程訪問、狀態(tài)信息。而我們需要的網(wǎng)站數(shù)據(jù)信息保存在第一個(gè)數(shù)據(jù)庫中。
第二步:列出目標(biāo)數(shù)據(jù)庫的表,如圖5所示:
圖5 列出目標(biāo)數(shù)據(jù)庫的表
我們發(fā)現(xiàn)該數(shù)據(jù)庫中共有13個(gè)表,其中表名為admininfo的表引起了我們的興趣,因?yàn)檫@張表中可能存放了數(shù)據(jù)庫的用戶名和密碼。如圖6所示。
圖6 存放了數(shù)據(jù)庫的用戶名和密碼
第三步:列出指定表的列,如圖7所示:
圖7 列出指定表的列
這里我們得到了存放用戶信息的passwd和usernamed列信息,如圖8所示:
圖8 存放用戶信息的passwd和usernamed列信息
第四步:導(dǎo)出passwd和username的內(nèi)容信息,導(dǎo)出結(jié)果如圖9、10所示:
圖9 導(dǎo)出passwd的內(nèi)容信息
圖10 導(dǎo)出username的內(nèi)容信息
我們發(fā)現(xiàn)這個(gè)數(shù)據(jù)庫的用戶名為 admin,但密碼字段經(jīng)過加密算法加密,得到的是密碼的HASH值。這里我們不對如何解密做介紹。
通過上述方法,我們成功地利用 sq1map對網(wǎng)站進(jìn)行 SQL注入攻擊,并得到了網(wǎng)站的數(shù)據(jù)庫信息。
絕大多數(shù)的SQL漏洞是由于Web開發(fā)者在開發(fā)代碼時(shí)沒有徹底理解Web與其數(shù)據(jù)庫之間的交互關(guān)系而產(chǎn)生的。下面給出一些常見的預(yù)防措施:
(1)使用參數(shù)化語句
在構(gòu)造SQL指令時(shí),采用參數(shù)來代替需要寫入的數(shù)值。在語句傳輸過程中,數(shù)據(jù)庫不會對參數(shù)進(jìn)行處理,而是在完成解析編譯后,才對參數(shù)進(jìn)行操作。就算參數(shù)中含有惡意的語句,數(shù)據(jù)庫也能正常查詢。所以,相比起動態(tài)SQL,參數(shù)化語句更加安全。
(2)驗(yàn)證輸入
惡意攻擊者往往會通過網(wǎng)站的報(bào)錯(cuò)信息來確定服務(wù)器、數(shù)據(jù)庫的平臺信息等。因此,我們需要檢查用戶定義的參數(shù)并加以過濾,驗(yàn)證輸入?yún)?shù)的長度、類型等信息;使用白名單測試用戶輸入,只接收數(shù)據(jù)庫期望的已知的良好輸入。
(3)應(yīng)用安全策略
例如安裝Web應(yīng)用防火墻來檢測及預(yù)防SQL注入,并且通過加固數(shù)據(jù)庫來確保數(shù)據(jù)庫安全;對重要的數(shù)據(jù)庫對象實(shí)施訪問控制,同時(shí)對敏感用戶數(shù)據(jù)信息進(jìn)行加密。
另外,我們在上述方案基礎(chǔ)上提出了兩點(diǎn)新的預(yù)防措施:(1)使用存儲程序代替SQL語句
我們可以將SQL語句從Web應(yīng)用程序上脫離出來,并把它編寫到一個(gè)由我們自己定義的存儲程序上,該存儲程序位于數(shù)據(jù)庫服務(wù)器端。通過調(diào)用定義的存儲程序來代替用戶輸入字符串構(gòu)建的SQL語句。
(2)建立異常檢測評分機(jī)制
對SELECT、DELETE等關(guān)鍵的數(shù)據(jù)庫查詢語句進(jìn)行數(shù)值評分,通過計(jì)算每個(gè)語句的異常值并與設(shè)定的異常值做比較,一旦這個(gè)語句的異常值超過設(shè)定的最大異常值,那么這個(gè)查詢語句被視為是異常的,并觸發(fā)警報(bào)。
網(wǎng)站被SQL注入攻擊后,管理者應(yīng)當(dāng)要盡快關(guān)閉站點(diǎn),以免受到二次攻擊;調(diào)查可疑的SQL注入攻擊,分析數(shù)字化痕跡,識別攻擊活動;通過取證確定攻擊者在系統(tǒng)上執(zhí)行的操作,檢查并理解攻擊者惡意查詢邏輯,掌握其攻擊企圖;聯(lián)系相關(guān)的技術(shù)人員,對漏洞進(jìn)行修補(bǔ),并做好數(shù)據(jù)恢復(fù)工作,將損失減少至最小。
SQL注入形式是對互聯(lián)網(wǎng)上的數(shù)據(jù)庫進(jìn)行拖庫攻擊的主要方式,本文基于sq1map工具對目標(biāo)網(wǎng)站實(shí)現(xiàn)了SQL注入攻擊,獲得了其數(shù)據(jù)庫內(nèi)容。并且,通過對SQL注入攻擊的分析,總結(jié)相關(guān)研究成果,提出了用存儲程序代替SQL語句及建立異常檢測評分機(jī)制的新型防范概念。本文對網(wǎng)站進(jìn)行SQL注入攻擊的方式是基于網(wǎng)頁錯(cuò)誤信息報(bào)告的,未對盲SQL注入做詳細(xì)介紹。今后對盲SQL注入攻擊進(jìn)行分析將是進(jìn)一步研究的內(nèi)容。
[1]徐陋,姚國祥.SQL注入攻擊全面預(yù)防辦法及其應(yīng)用[J].現(xiàn)場總線技術(shù)應(yīng)用.200例.2005.
[2]張耀輝.CSDN“拖庫”事件后對密碼保護(hù)的反思[J].長沙通信職業(yè)技術(shù)學(xué)院學(xué)報(bào).2012.
[3]孫義,胡雨霽,黃皓.基于序列比對的 SQL注入攻擊檢測方法[J].計(jì)算機(jī)應(yīng)用研究.2010.
[4]彭賡,范明鈺.基于改進(jìn)網(wǎng)絡(luò)爬蟲技術(shù)的SQL注入漏洞檢測[J].計(jì)算機(jī)應(yīng)用研究.2010.
[5]雷燕瑞.基于SQL注入的Web應(yīng)用程序安全性研究[J].信息安全與技術(shù).2014.
[6]黃少勇.SQL注入攻擊和防范措施[J].計(jì)算機(jī)安全.2012.