仇善梁
(江蘇省揚(yáng)州商務(wù)高等職業(yè)學(xué)校,江蘇揚(yáng)州 225000)
開發(fā)者視角下網(wǎng)站SQL注入漏洞及防范
仇善梁
(江蘇省揚(yáng)州商務(wù)高等職業(yè)學(xué)校,江蘇揚(yáng)州 225000)
通過對(duì)網(wǎng)站SQL注入漏洞的成因和常見類型進(jìn)行分析,在代碼編寫層面提出六點(diǎn)防范措施,幫助開發(fā)者盡量從源頭上杜絕此類安全漏洞,避免重復(fù)勞動(dòng),提高網(wǎng)站運(yùn)行的安全性。
SQL注入;漏洞;攻擊
隨著計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)技術(shù)的高速發(fā)展,信息化給人們的工作、生活和學(xué)習(xí)帶來了極大的便利,與此同時(shí),網(wǎng)絡(luò)信息安全也成為信息社會(huì)的重要話題。網(wǎng)絡(luò)信息安全包含很多領(lǐng)域,其中網(wǎng)站的安全是其重要內(nèi)容之一。根據(jù)國家互聯(lián)網(wǎng)應(yīng)急中心發(fā)布的《2015年中國互聯(lián)網(wǎng)網(wǎng)絡(luò)安全報(bào)告》顯示,2015年我國境內(nèi)被篡改的網(wǎng)站數(shù)量為24 550個(gè),其中政府網(wǎng)站有898個(gè);被植入后門的網(wǎng)站數(shù)量為75 028個(gè),其中政府網(wǎng)站有3 514個(gè)[1]。SQL注入漏洞是網(wǎng)站漏洞的重要形式之一,也是危害性比較大的漏洞之一,2015年某市人才網(wǎng)因存在SQL注入漏洞,導(dǎo)致240萬條個(gè)人信息被泄露,這充分說明當(dāng)前網(wǎng)站的信息安全形勢(shì)比較嚴(yán)峻。
軟件漏洞是指軟件生命周期中涉及安全的設(shè)計(jì)錯(cuò)誤、編碼缺陷和運(yùn)行故障等[2]。SQL語言是目前數(shù)據(jù)庫使用的主流操作語言,SQL注入攻擊也是最常見的Web攻擊手段之一。所謂SQL注入漏洞,是指應(yīng)用程序未對(duì)用戶輸入的內(nèi)容進(jìn)行充分的有效性和合法性驗(yàn)證,導(dǎo)致非法用戶在URL查詢字符串或表單提交的數(shù)據(jù)字段中插入特殊字符,從而可以動(dòng)態(tài)構(gòu)造出非法的SQL語句,在數(shù)據(jù)庫正常執(zhí)行后,實(shí)現(xiàn)SQL注入[3],從而達(dá)到竊取數(shù)據(jù)、繞過驗(yàn)證或破壞數(shù)據(jù)等目的。常見的SQL注入方式有重言式注入、錯(cuò)誤邏輯式注入、破壞式注入、附加命令式注入等。
1.1 重言式注入
重言式通常稱為永真式,這種方式通過和不等式配合使用,使SQL語句變成永真式或永假式,據(jù)此來判斷請(qǐng)求的字段是否存在漏洞,實(shí)現(xiàn)繞過會(huì)話驗(yàn)證的注入方式。用戶登錄是開發(fā)網(wǎng)站程序最常用的功能模塊,本文就以驗(yàn)證用戶登錄為例,雖然我們相信一般程序員不會(huì)使用這種寫法,但這是SQL注入的典型演示案例:
上述語句下劃線部分為用戶輸入內(nèi)容,如果用戶正常輸入賬號(hào)和密碼,此語句沒有問題,但是如果攻擊者將賬號(hào)和密碼都輸入'or''=',那么語句就變成:
很顯然,如按上述語句執(zhí)行,攻擊者用單引號(hào)的方式即可改變SQL語句原來的邏輯結(jié)構(gòu),使用SQL內(nèi)置關(guān)鍵詞“or”,使原來的判斷語句變成永遠(yuǎn)為真,這樣可以繞過用戶驗(yàn)證,成功獲取相關(guān)權(quán)限。類似語句還有多種其他寫法,甚至可以自己插入一個(gè)新用戶,方便地繞過驗(yàn)證,進(jìn)入系統(tǒng)。
1.2 錯(cuò)誤邏輯式注入
此類注入是攻擊者故意構(gòu)造錯(cuò)誤的SQL語句,系統(tǒng)執(zhí)行后一般會(huì)報(bào)錯(cuò),只要在IE選項(xiàng)設(shè)置里去掉“將顯示友好HTTP錯(cuò)誤信息”的勾選項(xiàng),客戶端瀏覽器一般會(huì)顯示詳細(xì)的報(bào)錯(cuò)信息,以便攻擊者窺探想要得到的相關(guān)信息。我們通過SQL的convert函數(shù)來實(shí)現(xiàn)數(shù)據(jù)類型的轉(zhuǎn)換,使系統(tǒng)強(qiáng)制將用戶名轉(zhuǎn)換成整數(shù),導(dǎo)致系統(tǒng)報(bào)錯(cuò)。舉例如下:
毫無疑問,在上述SQL語句的執(zhí)行過程中,只要用戶名不是數(shù)字格式,執(zhí)行后肯定會(huì)報(bào)錯(cuò),如果系統(tǒng)沒有對(duì)相關(guān)錯(cuò)誤信息進(jìn)行有效地處理或屏蔽,系統(tǒng)就會(huì)如實(shí)地顯示相關(guān)錯(cuò)誤信息。攻擊者手中一般都有常規(guī)對(duì)照表,針對(duì)不同數(shù)據(jù)庫類型收錄了不同的關(guān)鍵詞和命令方式等,即可以通過不斷改變注入操作,窺探想要得到的信息。
1.3 破壞式注入
此類注入是通過附加命令實(shí)現(xiàn)數(shù)據(jù)破壞或數(shù)據(jù)竊取,導(dǎo)致網(wǎng)站系統(tǒng)拒絕服務(wù)等,舉例如下:
執(zhí)行上述語句后,select語句執(zhí)行后沒有數(shù)據(jù)受影響,而由于單引號(hào)被“--”注釋了,直接執(zhí)行了drop語句,即可刪除整個(gè)用戶表,因此這種注入方式的危害性非常大。依照drop語句的執(zhí)行方法,還可以執(zhí)行其他類似SQL語句。
1.4 附加命令式注入
若手動(dòng)提交http://www.xxx.com/readnews.aspx? id=668 and(select count(*)from admintable)>=0,如果仍然正常顯示原來頁面,則說明數(shù)據(jù)庫中存在admintable表,繼續(xù)修改count(*)部分內(nèi)容,可以進(jìn)一步判斷數(shù)據(jù)表中的字段情況。
最后面的單引號(hào)同樣被屏蔽,select語句執(zhí)行后,insert語句就直接新增了一個(gè)管理員用戶,那么后果可想而知了。實(shí)施SQL注入的方法還有很多,它們都是利用了開發(fā)者沒有對(duì)用戶輸入內(nèi)容進(jìn)行嚴(yán)格過濾和限制這一共同特征。
SQL注入漏洞與網(wǎng)站開發(fā)人員的開發(fā)習(xí)慣和安全意識(shí)有著十分密切的關(guān)系,SQL注入漏洞的本質(zhì)是程序員對(duì)用戶輸入的內(nèi)容驗(yàn)證不足而導(dǎo)致的,要解決此漏洞問題,還得圍繞驗(yàn)證用戶輸入和提交的內(nèi)容,從幾個(gè)方面綜合考慮,統(tǒng)籌應(yīng)對(duì)。下文案例代碼以ASP.NET為例。
2.1 嚴(yán)格過濾
強(qiáng)化對(duì)用戶輸入內(nèi)容的驗(yàn)證,過濾非法字符,是防范SQL注入的主要工作。國內(nèi)外研究的主要措施是編碼或過濾,一般建議在安全問題上遵循最小化原則,直接進(jìn)行過濾,可將敏感字符集保存在web.config網(wǎng)站配置文件中,具體如下:
獲取用戶提交的數(shù)據(jù)后使用循環(huán)語句逐個(gè)與特殊符號(hào)進(jìn)行比對(duì),如果發(fā)現(xiàn)則進(jìn)行replace()處理,當(dāng)然也可以替換為相關(guān)轉(zhuǎn)義字符。因web.config配置文件遵循xml編碼格式,其本質(zhì)就是txt文件,在網(wǎng)站發(fā)布后仍然可以方便地修改,便于后期及時(shí)更新維護(hù)。
圖1 部分特殊符號(hào)說明表
圖1僅列出了部分危險(xiǎn)系數(shù)比較高的特殊符號(hào),實(shí)際上還有更多需要注意的符號(hào)。在項(xiàng)目開發(fā)中,開發(fā)人員可以編寫專門的工具類(如Tools類),使用正則表達(dá)式設(shè)計(jì)一些專門匹配方法,如匹配手機(jī)號(hào)碼,匹配數(shù)值范圍內(nèi)的數(shù)字,匹配長度范圍內(nèi)的字母和數(shù)字等。只要平時(shí)注意收集與整理,可在不同項(xiàng)目中重復(fù)使用,提高開發(fā)效率。
2.2 參數(shù)化查詢
要防范SQL注入攻擊,首先必須對(duì)用戶提交的數(shù)據(jù)進(jìn)行過濾,該步驟一般能過濾掉大部分攻擊,但由于字符集的覆蓋性關(guān)系,所以也不是萬能的;其次是要改變傳統(tǒng)拼接SQL的寫法,使用參數(shù)化查詢,我們還以經(jīng)典的登錄案例進(jìn)行說明,具體如下:
上述是SQL拼接寫法,也是SQL注入攻擊的重要目標(biāo),具體攻擊方法上文已作討論,而參數(shù)化查詢被視為防范注入攻擊的有效手段,寫法如下:
上述寫法之所以能有效屏蔽攻擊,是因?yàn)樵谑褂脜?shù)化查詢的情況下,數(shù)據(jù)庫服務(wù)器不會(huì)將參數(shù)的內(nèi)容視為SQL指令的一部分來處理,而是在數(shù)據(jù)庫完成SQL指令的編譯后,才套用參數(shù)運(yùn)行,因此就算參數(shù)中含有指令,也不會(huì)被數(shù)據(jù)庫運(yùn)行。
此外,有人誤以為存儲(chǔ)過程也是防范SQL注入的重要手段,可是需要特別聲明的是,存儲(chǔ)過程本身并不能防范SQL注入,即如果存儲(chǔ)過程使用動(dòng)態(tài)SQL語句,它也有可能被SQL注入[4]。因此,存儲(chǔ)過程中的寫法也必須是參數(shù)化的,不能出現(xiàn)字符串拼接。
2.3 二次驗(yàn)證
動(dòng)態(tài)網(wǎng)頁都離不開客戶端與服務(wù)器端的數(shù)據(jù)交互,實(shí)現(xiàn)這種正向交互一般是使用表單。為了提高提交的安全性與成功率,開發(fā)者往往都很重視在前臺(tái)使用JavaScript進(jìn)行數(shù)據(jù)合法性的驗(yàn)證,即通過驗(yàn)證后方可提交,否則不允許提交。正因?yàn)檫@樣,往往導(dǎo)致一些開發(fā)者忽略了后臺(tái)的再次驗(yàn)證,因?yàn)檎5脑L問者與攻擊者的訪問方式可能存在如下差別,如圖2所示。
圖2 不同用戶表單提交驗(yàn)證流程圖
正常用戶在通過客戶端的JS驗(yàn)證后完成表單提交,否則提示錯(cuò)誤,不能提交;而攻擊者可以利用技術(shù)手段自行模擬提交,如果沒有后臺(tái)的二次驗(yàn)證,將直接接觸到數(shù)據(jù)庫,這是非常危險(xiǎn)的。因此,當(dāng)數(shù)據(jù)通過嚴(yán)格的前臺(tái)驗(yàn)證后,必須在后臺(tái)進(jìn)行二次驗(yàn)證,過濾后方可寫入數(shù)據(jù)庫,切勿完全相信前臺(tái)獲取過來的數(shù)據(jù)。
2.4 出錯(cuò)控制
常規(guī)注入方式是攻擊者故意摻入惡意字符或構(gòu)造出畸形的SQL語句,造成數(shù)據(jù)提交后系統(tǒng)報(bào)錯(cuò),然后從這些錯(cuò)誤信息中獲取攻擊者想要得知的信息。而程序開發(fā)百密一疏,難免在運(yùn)行中有意外情況發(fā)生,所以如何有效屏蔽出錯(cuò)信息也是防范SQL注入的重要內(nèi)容。首先,在程序編碼過程中,針對(duì)一些如查詢搜索、數(shù)據(jù)提交等重要節(jié)點(diǎn),除了進(jìn)行合法性過濾外,還要善于使用異常處理語句;其次,ASP.NET的web.config網(wǎng)站配置文件還自帶了針對(duì)全站的出錯(cuò)控制方法,代碼如下:
通過此功能,可以詳細(xì)定義不同出錯(cuò)方式跳轉(zhuǎn)至不同的自定義頁面,defaultRedirect屬性指向出錯(cuò)轉(zhuǎn)向頁面,mode屬性有三個(gè)值,分別是On、Off和RemoteOnly。顧名思議,On是打開,即如果出錯(cuò)顯示報(bào)錯(cuò)頁面;Off是關(guān)閉,即如果出錯(cuò)顯示詳細(xì)信息;RemoteOnly是遠(yuǎn)程打開,本地關(guān)閉,即如果出錯(cuò)遠(yuǎn)程訪問者顯示報(bào)錯(cuò)頁面,本地用戶顯示詳細(xì)信息,以方便調(diào)試。Error節(jié)點(diǎn)是自定義具體錯(cuò)誤類型的跳轉(zhuǎn)頁面,但是建議網(wǎng)站開發(fā)者在發(fā)布時(shí)進(jìn)行籠統(tǒng)處理,因?yàn)榘彦e(cuò)誤類型定義得太細(xì),雖然對(duì)開發(fā)調(diào)試有幫助,但是發(fā)布后,對(duì)攻擊者可能更有幫助。
2.5 特殊保護(hù)
通常Web系統(tǒng)注冊(cè)用戶只能訪問前臺(tái),管理后臺(tái)是不對(duì)外開放的,而SQL注入攻擊的最終目的多是尋找管理員登錄頁面實(shí)施攻擊,因此管理員登錄等重要頁面是重點(diǎn)保護(hù)對(duì)象。具體保護(hù)方法可以借鑒防火墻思路,對(duì)訪問這些特殊頁面的IP地址進(jìn)行匹配過濾,如果匹配通過即可訪問,否則直接跳轉(zhuǎn)至報(bào)錯(cuò)頁面或首頁,代碼具體如下:
上述代碼首先讀取網(wǎng)站配置文件,列出允許的IP地址白名單列表,然后通過自定義類的get_ip()方法獲取訪問者的IP,與之進(jìn)行匹配,如果訪問者的IP包含在允許列表內(nèi)則可以訪問,否則直接跳轉(zhuǎn)至事先定義的頁面,達(dá)到過濾保護(hù)的目的。如果是擁有固定IP的單位只需要授權(quán)一個(gè)IP即可,如果是自動(dòng)獲取IP的單位則需要授權(quán)多個(gè)IP和修改匹配段,但不管是哪種方式,如此過濾還是比開放式訪問安全得多。
2.6 自我檢測(cè)
軟件開發(fā)難免存在某些BUG,網(wǎng)站開發(fā)也是如此。根據(jù)知己知彼、百戰(zhàn)不殆的理念,建議開發(fā)者在網(wǎng)站開發(fā)完成后,選取2~3款SQL注入漏洞檢測(cè)工具進(jìn)行自我檢測(cè),如發(fā)現(xiàn)問題,及時(shí)進(jìn)行修正。網(wǎng)絡(luò)上SQL注入漏洞檢測(cè)工具有很多,如:SSQLInjection、BSQL Hacker、The Mole和Pangolin等,具體可根據(jù)相關(guān)介紹自行選擇。
因SQL注入漏洞的危害性非常大,所以它也是網(wǎng)絡(luò)攻擊者的重要攻擊方式之一。在了解SQL注入漏洞的成因和基本類型后,開發(fā)者應(yīng)注意養(yǎng)成良好的開發(fā)習(xí)慣加以防范。此外,根據(jù)開發(fā)技術(shù)和開發(fā)模型的更新,也可能出現(xiàn)一些新的注入形式和防范方式,需要我們不斷加強(qiáng)學(xué)習(xí)和研究,共同致力于營造更加安全的網(wǎng)絡(luò)環(huán)境。
[1]國家計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)急技術(shù)處理協(xié)調(diào)中心.2015年中國互聯(lián)網(wǎng)網(wǎng)絡(luò)安全報(bào)告[R].北京:國家互聯(lián)網(wǎng)應(yīng)急中心,2015.
[2]吳世忠,郭濤,董國偉,等.軟件漏洞分析技術(shù)進(jìn)展[J].清華大學(xué)學(xué)報(bào):自然科學(xué)版,2012(10).
[3]隋亮.基于滲透測(cè)試的SQL注入漏洞檢測(cè)與防范[D].上海:東華大學(xué),2014(5):20.
[4]王云,郭外萍,陳承歡.WEB項(xiàng)目中的SQL注入問題研究與防范方法[J].計(jì)算機(jī)工程與設(shè)計(jì),2010(5).
Vulnerability and Prevention of SQL Injection in Website from the Perspective of Developer
QIU Shan-liang
(Yangzhou Commerce Higher Vocational School,Jiangsu Yangzhou 225000,China)
By analyzing the causes and common types of SQL injection vulnerabilities,this paper puts forward six precautions at the level of code writing to help developers avoid safe vulnerabilities and work duplications so as to improve the security of website operation.
SQL injection;Vulnerability;Attack
TP393.08
A
1673-2022(2016)04-0052-04
2016-10-06
仇善梁(1983-),男,江蘇射陽人,講師,碩士,主要研究方向?yàn)榻逃畔⒒蚖EB應(yīng)用開發(fā)。