魯先志
【摘要】sql注入漏洞是web系統(tǒng)中常見的一種漏洞,本文利用一個(gè)實(shí)驗(yàn)案例分析了sql注入漏洞的原理,并給出了防范sql注入漏洞方法。
【關(guān)鍵詞】漏洞;web系統(tǒng);結(jié)構(gòu)化查詢語句
結(jié)構(gòu)化查詢語句(Structured Query Language,縮寫:SQL),是一種特殊的編程語言,用于數(shù)據(jù)庫中的標(biāo)準(zhǔn)數(shù)據(jù)查詢語言。SQL注入(SQL Injection)是一種常見的Web安全漏洞,攻擊者利用這個(gè)問題,可以訪問或者修改數(shù)據(jù),或者利用潛在的數(shù)據(jù)庫漏洞進(jìn)行攻擊。
SQL注入攻擊是Web安全史上的一個(gè)重要里程碑,它從1999年首次進(jìn)入人們的視線,至今已經(jīng)有十幾年的歷史了,雖然我們現(xiàn)在已經(jīng)有了很全面的防范對策,但是它的威力仍然不容小覷,SQL注入攻擊至今仍然是Web安全領(lǐng)域中的一個(gè)重要組成部分。
1. sql注入漏洞原理
SQL注入是將SQL代碼插入到網(wǎng)站應(yīng)用的參數(shù)之中,通過執(zhí)行sql查詢語句將插入的參數(shù)傳入到系統(tǒng)后臺數(shù)據(jù)庫服務(wù)器解析執(zhí)行的攻擊。SQL注入的主要方式是直接將SQL代碼插入到參數(shù)中,這些參數(shù)會(huì)被置入到SQL命令中加以執(zhí)行,攻擊者能修改SQL語句時(shí),該進(jìn)程將與執(zhí)行命令的組件(數(shù)據(jù)庫服務(wù)器、web服務(wù)器)擁有相同權(quán)限如果開發(fā)人員直接使用SQL語句對提交的查詢進(jìn)行執(zhí)行,或者過濾不嚴(yán)即會(huì)產(chǎn)生SQL注入漏洞。
1.1 造成sql漏洞的原因
①程序開發(fā)人員在處理程序和數(shù)據(jù)庫交互的時(shí)候,使用字符拼接的方法構(gòu)造SQL語句
②程序開發(fā)人員未對用戶可控參數(shù)進(jìn)行足夠的過濾便將參數(shù)內(nèi)容拼接進(jìn)入到SQL語句中
1.2 sql注入漏洞的危害
惡意攻擊者利用SQL注入漏洞,可以獲取數(shù)據(jù)庫中的用戶敏感信息(例如:管理員后臺密碼),為下一步的系統(tǒng)滲透提供幫助。在某些特定情況下,還可以利用sql注入漏洞修改數(shù)據(jù)庫內(nèi)容,如果數(shù)據(jù)庫權(quán)限分配存在問題,或者數(shù)據(jù)庫本身存在缺陷,那么攻擊者可以通過SQL注入漏洞直接獲取應(yīng)用系統(tǒng)的管理員權(quán)限或者服務(wù)器系統(tǒng)權(quán)限。
2. sql漏洞利用實(shí)踐
本文搭建了一個(gè)具有sql漏洞的web應(yīng)用系統(tǒng),通過構(gòu)造帶有惡意參數(shù)的sql查詢語句來實(shí)現(xiàn)對web應(yīng)用系統(tǒng)的滲透。滲透環(huán)境是安裝了harkbar工具的chrom瀏覽器。首先進(jìn)入具體sql漏洞的web系統(tǒng)的網(wǎng)頁。
將地址欄中的url復(fù)制到hackbar的文本框中點(diǎn)擊hackbar中的“Execute”按鈕。訪問目標(biāo)URL,正常顯示。
在URL后添加單引號,網(wǎng)頁報(bào)錯(cuò),系統(tǒng)開發(fā)者沒有正確處理用戶輸入的參數(shù),存在sql注入漏洞的可能。
利用sql語法中的order by語句猜測當(dāng)前sql語句查詢數(shù)據(jù)庫表中的列的數(shù)量。先猜測該表有10列,發(fā)現(xiàn)系統(tǒng)報(bào)錯(cuò)。
進(jìn)一步縮小猜測范圍,通過二分法,當(dāng)字段為3時(shí)order by剛好顯示正常內(nèi)容
通過sql語法中的“UNION”語句獲取該頁面可顯示查詢內(nèi)容能顯示的的位置(輸入一個(gè)錯(cuò)誤的id),圖中“2,3”的位置即可插入常用函數(shù)。
將“2”的位置插入函數(shù)@@datadir獲取網(wǎng)站的數(shù)據(jù)庫所在的路徑。
將“3”的位置插入函數(shù)version()獲取系統(tǒng)的版本號。
進(jìn)一步猜測,將“2”的位置換成user(),“3”的位置換成database(),系統(tǒng)顯示當(dāng)前數(shù)據(jù)庫用戶為sql1,當(dāng)前數(shù)據(jù)庫lab。
對sql語句進(jìn)行拼接,猜測數(shù)據(jù)庫表名“-1union all select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database(),”可知lab數(shù)據(jù)庫下有兩個(gè)表,分別為“flag_normal”和“news”。
對sql語句進(jìn)行拼接,猜測數(shù)據(jù)庫表“flag_normal”中的列名?!癶ttp://www.aaa.com:1234/pentest/sql/1.php?id=-1 union? all select 1,2,group_concat(column_name) from information_schema.columns? where table_name='flag_normal'”
進(jìn)一步對sql語句進(jìn)行拼接,猜測數(shù)據(jù)庫表“flag_normal”中,“type”和“vale”列中的具體內(nèi)容:
“http://www.aaa.com:1234/pentest/sql/1.php?id=-1 union all select 1,type,value from flag_normal”得到系統(tǒng)的用戶名和密碼。需要說明的是存儲在數(shù)據(jù)庫中的密碼絕大部分都是經(jīng)過MD5加密過的,需要對MD5進(jìn)一步揭秘才能獲取明文。
從上文可以看出,通過構(gòu)造攻擊參數(shù)來執(zhí)行程序的sql查詢語句獲得了web系統(tǒng)的用戶名和密碼,惡意滲透者可以利用獲得的關(guān)鍵信息登錄web系統(tǒng),對系統(tǒng)的敏感數(shù)據(jù)進(jìn)行修改或竊取。
3. sql注入漏洞的安全防范、
sql漏洞是web系統(tǒng)中最為普遍的一類漏洞,廣泛存在于早期開發(fā)的web系統(tǒng)中。防范sql漏洞最有效和最直接的方法是在程序開發(fā)階段杜絕可能存在sql利用攻擊的程序代碼,比如盡量利用參數(shù)化的查詢語句。已經(jīng)存在sql漏洞的web系統(tǒng),如果不能修補(bǔ)源代碼的方式來防范,也可以采用web防火墻的方式來防止常規(guī)的sql注入漏洞攻擊。
參考文獻(xiàn):
[1]王德高等.SQL注入攻擊與防范實(shí)驗(yàn)的設(shè)計(jì)與實(shí)現(xiàn)[J].電子世界,2017.54-55
[2]李文鋒,林天峰.SQL注入攻擊[J].計(jì)算機(jī)與網(wǎng)絡(luò),2004.(24)54-55
[3]劉建臣.追根溯源防范SQL注入攻擊[J].信息安全,2019.(08)135-137
作者簡介:魯先志(1976-),男,河南濮陽人,碩士,副教授,研究方向:職業(yè)教育和網(wǎng)絡(luò)安全。