“SQL注入”的前世今生和防御思路
“SQL1注入”流行之前,緩沖區(qū)溢出2是最有效的黑客滲透方法,但經(jīng)歷了一些嚴(yán)重事件后(如:Code Red、Nimda、SQL Slammer),現(xiàn)在很多網(wǎng)絡(luò)管理員的安全意識(shí)增強(qiáng)了,一般都能及時(shí)安裝系統(tǒng)補(bǔ)丁,而且軟、硬件廠商都針對(duì)溢出問(wèn)題做了很多解決方案,可以說(shuō):緩沖區(qū)溢出在黑客攻擊中的路越來(lái)越窄。這時(shí)候,針對(duì)CGI3程序的滲透被黑客發(fā)現(xiàn)是更有效的辦法,因?yàn)镃GI程序作為Web應(yīng)用程序的一部分,通常開發(fā)周期很短,相應(yīng)的測(cè)試環(huán)節(jié)很少,普遍存在缺陷,那么這些CGI程序就有可能成為突破點(diǎn)。下面我們就將介紹CGI攻擊的一大分支:SQL注入。
1、SQL即結(jié)構(gòu)查詢語(yǔ)言(Structured Query Language),一種ANSI (美國(guó)國(guó)家標(biāo)準(zhǔn)學(xué)會(huì)) 標(biāo)準(zhǔn)語(yǔ)言,用于訪問(wèn)、操作關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)(Relational database systems)。
2、緩沖區(qū)溢出是指當(dāng)計(jì)算機(jī)向緩沖區(qū)內(nèi)填充數(shù)據(jù)位數(shù)時(shí)超過(guò)了緩沖區(qū)本身的容量溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上。理想的情況是:程序檢查數(shù)據(jù)長(zhǎng)度并不允許輸入超過(guò)緩沖區(qū)長(zhǎng)度的字符,但是絕大多數(shù)程序都會(huì)假設(shè)數(shù)據(jù)長(zhǎng)度總是與所分配的儲(chǔ)存空間相匹配,這就為緩沖區(qū)溢出埋下隱患.操作系統(tǒng)所使用的緩沖區(qū)又被稱為"堆棧". 在各個(gè)操作進(jìn)程之間,指令會(huì)被臨時(shí)儲(chǔ)存在"堆棧"當(dāng)中,"堆棧"也會(huì)出現(xiàn)緩沖區(qū)溢出。
3、Common Gate Interface,簡(jiǎn)稱CGI。在物理上是一段程序,運(yùn)行在服務(wù)器上,提供同客戶端 Html頁(yè)面的接口。舉個(gè)例子:現(xiàn)在的個(gè)人主頁(yè)上大部分都有一個(gè)留言本。留言本的工作是這樣的:先由用戶在客戶端輸入一些信息,如名字之類的東西。接著用戶按一下“留言”(到目前為止工作都在客戶端),瀏覽器把這些信息傳送到服務(wù)器的CGI目錄下特定的CGI程序中,于是CGI程序在服務(wù)器上按照預(yù)定的方法進(jìn)行處理。在本例中就是把用戶提交的信息存入指定的文件中。然后CGI程序給客戶端發(fā)送一個(gè)信息,表示請(qǐng)求的任務(wù)已經(jīng)結(jié)束。此時(shí)用戶在瀏覽器里將看到“留言結(jié)束”的字樣。整個(gè)過(guò)程結(jié)束。
“SQL注入”現(xiàn)在已經(jīng)成為互聯(lián)網(wǎng)上最通用的攻擊方式,通過(guò)Google、百度等搜索引擎,可以發(fā)現(xiàn)很多相關(guān)說(shuō)明文章和攻擊軟件。這類攻擊的流行,一方面是由于Web應(yīng)用的迅速普及和Web后臺(tái)數(shù)據(jù)價(jià)值上升,攻擊者受經(jīng)濟(jì)利益驅(qū)使;另一方面,攻擊軟件的泛濫降低了技術(shù)門檻,如SQL注入自動(dòng)化攻擊工具實(shí)現(xiàn)了“目標(biāo)鎖定、發(fā)現(xiàn)注入點(diǎn)及注入攻擊”全過(guò)程自動(dòng)化,尤其是自動(dòng)完成“發(fā)現(xiàn)注入點(diǎn)”這一關(guān)鍵步驟,極大地方便了攻擊者,提高了攻擊成功率。
1、“SQL注入”的定義
很多Web應(yīng)用程序都使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)信息。SQL命令就是前端Web和后端數(shù)據(jù)庫(kù)之間的接口,使得數(shù)據(jù)可以傳遞至Web應(yīng)用程序。很多Web站點(diǎn)都會(huì)利用用戶輸入的參數(shù)動(dòng)態(tài)地生成SQL查詢要求,攻擊者通過(guò)在URL、表單域,或者其他的輸入域中輸入自己的SQL命令,以此改變查詢屬性,騙過(guò)應(yīng)用程序,從而可以對(duì)數(shù)據(jù)進(jìn)行不受限的訪問(wèn)。
SQL注入漏洞成因在于Web應(yīng)用程序?qū)τ脩籼峤籆GI參數(shù)數(shù)據(jù)未做充分檢查過(guò)濾。用戶提交的數(shù)據(jù)可能會(huì)被用來(lái)構(gòu)造訪問(wèn)后臺(tái)數(shù)據(jù)庫(kù)的SQL指令,如果這些數(shù)據(jù)過(guò)濾不嚴(yán)格就有可能被插入惡意的SQL代碼,從而非授權(quán)操作后臺(tái)的數(shù)據(jù)庫(kù),導(dǎo)致從敏感信息泄露、破壞數(shù)據(jù)庫(kù)內(nèi)容和結(jié)構(gòu)、甚至利用數(shù)據(jù)庫(kù)本身的擴(kuò)展功能控制服務(wù)器操作系統(tǒng)。利用SQL注入漏洞可以構(gòu)成對(duì)Web服務(wù)器的直接攻擊,還可能利用服務(wù)器攻擊第三方的瀏覽網(wǎng)站的其他用戶。
2、“SQL注入”的歷史
我們簡(jiǎn)單回顧一下SQL注入的相關(guān)歷史。
1998年12月, Rain Forest Puppy(RFP) 在Phrack 54上發(fā)表文章“NT Web Technology Vulnerabilities”,首次提到SQL注入;
1999年2月,Allaire發(fā)出警告 “Multiple SQL Statements in Dynamic Queries”;
1999年5月, RFP與Matthew Astley發(fā)出警告 “NT ODBC Remote Compromise”;
2000年2月,RFP發(fā)表文章 “How I hacked Packetstorm – A look at hacking wwthreads via SQL”,披露如何利用SQL注入攻擊滲透Packetstorm網(wǎng)站;
2000年9月,David Litchfield在Blackhat會(huì)議上發(fā)表主題演講“Application Assessments on IIS” ;
2000年10月,Chip Andrews在SQLSecurity.com 上發(fā)表“SQL Injection FAQ ”,首次公開使用“SQL注入”這個(gè)術(shù)語(yǔ) ;
2001年4月,David Litchfield 在Blackhat會(huì)議上發(fā)表主題演講 “Remote Web Application Disassembly with ODBC Error Messages”;
2002年1月,Chris Anley發(fā)表論文“Advanced SQL Injection in SQL Server”,首次深度探討該類攻擊。
2002年6月,Chris Anley發(fā)表論文 “(more) Advanced SQL” ,補(bǔ)充同年1月發(fā)表的論文缺少的細(xì)節(jié)。
2004年Blackhat會(huì)議上, 0x90.org發(fā)布了SQL注入工具SQeaL ( Absinthe的前身)。
3、“SQL注入”的演進(jìn)
SQL注入攻擊技術(shù)出現(xiàn)已有10多年歷史,該種攻擊技術(shù)被廣為利用。2007年,出現(xiàn)了新型的攻擊方法。之前,SQL注入攻擊針對(duì)特定的Web應(yīng)用程序,攻擊者事先已經(jīng)了解到了底層數(shù)據(jù)庫(kù)的架構(gòu)以及應(yīng)用程序注入點(diǎn)。而新型攻擊與以往有很大不同。它將可能攻擊任何存在SQL注入漏洞的動(dòng)態(tài)ASP頁(yè)面。
根據(jù)網(wǎng)絡(luò)世界(Network World)的報(bào)導(dǎo),2008年5月13日,在中國(guó)大陸、香港及臺(tái)灣地區(qū)有數(shù)萬(wàn)個(gè)網(wǎng)站遭遇一輪 SQL注入攻擊,并引發(fā)大規(guī)模掛馬。同期,根據(jù)微軟的報(bào)導(dǎo),在4個(gè)月時(shí)間內(nèi),發(fā)生了3次大規(guī)模攻擊,受害者包括某知名防病毒軟件廠商網(wǎng)站、歐洲某政府網(wǎng)站和某國(guó)際機(jī)構(gòu)網(wǎng)站在內(nèi)的多家互聯(lián)網(wǎng)網(wǎng)站,感染頁(yè)面數(shù)最多超過(guò)10,000頁(yè)面/天。
具體攻擊方式,如下圖1所示。黑客首先使用Google搜索引擎定位網(wǎng)頁(yè)中包含的動(dòng)態(tài)ASP腳本,測(cè)試腳本是否存在SQL注入漏洞并確定注入點(diǎn),最終試圖遍歷目標(biāo)網(wǎng)站后臺(tái)SQL Server數(shù)據(jù)庫(kù)的所有文本字段,插入指向惡意內(nèi)容(即黑客控制的服務(wù)器)的鏈接。攻擊的整個(gè)過(guò)程完全自動(dòng)化,一旦攻擊得逞,這些自動(dòng)插入的數(shù)據(jù)將嚴(yán)重破壞后臺(tái)數(shù)據(jù)庫(kù)所存儲(chǔ)的數(shù)據(jù),動(dòng)態(tài)腳本在處理數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí)可能出錯(cuò),各級(jí)頁(yè)面不再具有正常的觀感。被攻擊站點(diǎn)也可能成為惡意軟件的分發(fā)點(diǎn),訪問(wèn)這些網(wǎng)站的網(wǎng)民可能遭受惡意代碼的侵襲,用戶的系統(tǒng)被植入木馬程序從而完全為攻擊者控制。
圖1:SQL注入攻擊示意圖
4、防御“SQL注入”的思路
盡管由于攻擊的泛濫,人們防護(hù)SQL注入的安全意識(shí)已大為提升,但仍然有眾多的人缺乏系統(tǒng)、具體的防護(hù)概念。下面將簡(jiǎn)要介紹如何以一種綜合的方法來(lái)正確防護(hù)SQL注入。如下圖2所示,理想的解決思路是在Web應(yīng)用生命周期的各個(gè)階段做相應(yīng)的努力。
圖2:基于Web生命周期的SQL注入防護(hù)方法
1)開發(fā)階段
在編碼階段需要對(duì)輸入進(jìn)行細(xì)致的驗(yàn)證,使用靜態(tài)查詢,如使用參數(shù)化聲明。且遵循“最小權(quán)限準(zhǔn)則”,即只賦予應(yīng)用程序完成其功能的最基本權(quán)限。以下是關(guān)于最小權(quán)限的一些建議:
不要使用root權(quán)限訪問(wèn)數(shù)據(jù)庫(kù)
為數(shù)據(jù)表設(shè)定限制的可讀/可寫權(quán)限
慎用數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程
2)測(cè)試階段
在測(cè)試階段采用以下兩種方式確保Web應(yīng)用程序代碼的安全性:第一,采用源代碼審核方式,從編程者角度審視代碼是否存在漏洞;第二,執(zhí)行滲透測(cè)試,從攻擊者角度檢查代碼的安全性。需要注意的是,盡管完成以上兩步,仍不能確保100%的安全,但這兩種方法對(duì)于確保應(yīng)用程序質(zhì)量是必須的。
3)產(chǎn)品化階段
在產(chǎn)品化階段,Web應(yīng)用程序已經(jīng)正常上線,并對(duì)外提供服務(wù)。但還是會(huì)發(fā)現(xiàn)Web應(yīng)用存在安全隱患,此時(shí)整改代碼對(duì)各類組織來(lái)說(shuō)已經(jīng)不現(xiàn)實(shí)了,因?yàn)樾枰冻鲚^大代價(jià)。這時(shí),可以部署專用的Web應(yīng)用防火墻(Web Application Firewall,簡(jiǎn)稱WAF),以大幅提升Web應(yīng)用的安全等級(jí)。
【編輯推薦】