◆羅麗紅 柯 靈 楊華瓊
(重慶電訊職業學院 重慶 402247)
web安全之SQL注入漏洞及其防御
◆羅麗紅 柯 靈 楊華瓊
(重慶電訊職業學院 重慶 402247)
隨著基于web2.0的互聯網應用的廣泛使用,web的安全問題也日益突顯,根據OWASP的2013和2017的調查,其中注入攻擊一直排名第一。本文意在對SQL注入的常用方法進行列舉,系統的分析了SQL注入的原理,從而對SQL注入漏洞提出了一些基本的防御策略。
SQL注入;web安全;防御
在web2.0時代,基于web的互聯網應用越來越廣泛,比如大家熟知的百度百科、博客、土豆網等,除這些應用之外企業在信息化過程中的各種應用也都架設在了web平臺上。伴隨著Web業務的迅速發展,web的安全問題也凸顯了出來,其中黑客會利用web服務程序的SQL注入漏洞得到web服務器的控制權限,進行一系列非法操作,對系統和用戶信息造成威脅。根據OWASP于2017年公布的Web應用程序最可能、最常見、最危險的十大漏洞的排名注入攻擊漏洞排在首位。
什么是SQL注入漏洞?指的是利用現有應用程序,將惡意的SQL命令拼接到字符串中,然后插入到web表單提交或輸入域名或頁面請求的查詢字符串中,欺騙服務器執行惡意的SQL命令,從而得到攻擊者想要的信息。
首先為了 IE瀏覽器能提示更多的服務器錯誤信息,第一步需要把internet選項高級設置中“顯示友好HTTP錯誤信息”前的勾去掉。
在網站 URL后面加上單引號后,比如輸入:www.***.com?id=1’,這樣就在URL中傳遞了變量id,并提供了值1,這樣就嵌入了惡意的SQL語句,對數據庫進行了動態請求,服務器會返回錯誤的提示信息,如:“Microsoft JET Database Engine 錯誤 '80040e14',字符串的語法錯誤,在查詢表達式'id=1'' 中。/showdetail.asp,行10”。從該錯誤提示信息中可以得出:(1)該網站用的是 JET引擎連接的數據庫,而不是 JDBC或 ODBC,所以使用的是 access數據庫;(2)該網站沒有對客戶提交的參數進行過濾,存在注入;(3)表中存在“id”字段名。
從上面服務器的錯誤提示可以看出,可以從客戶端提交的特殊代碼,收集提示信息,得到想得到的資料,這就是SQL注入的原理。
不管是數字型、字符型還是搜索型注入都可以通過輸入不同的字符后利用 Web頁面返回的信息判斷是否存在注入漏洞。下面舉的是當存在數字型注入的情況下的例子:從原有網站“www.***.com?id=1”展示的 URL信息,可知該網站使用了 id這個字段,并且有1這個字段值。然后再在瀏覽器的地址欄中分別輸入www.***.com?id=1 and 1=1、www.***.com?id=1 and 1=2,如果輸入前種URL頁面返回正常,加上1=2之后網站報錯,此時可以判斷該系統存在SQL注入漏洞。
因為在后面加上“and 1=1”后,原來的查詢語句可能是這樣的“select * from 表名 where id=1 and 1=1”,由于1=1條件成立,所以執行且頁面返回正常。在后面加上“and 1=2”,原來的查詢語句可能是這樣的“select * from 表名 where id=1 and 1=2”,因為1=2條件不成立,所以會導致頁面加載出錯。
根據頁面反饋信息猜測得到注入數據類型、表名、字段名后,再利用SQL語句得出關鍵字段的值。先利用order by語句來判斷字段的長度,如果臨界值為7,則在頁面注入 order by 7時則會報錯,從而猜測列數為6。再向URL欄注入“and 1=2 union select 1,2,3,4,5,6”后會將數據庫的列顯露在網頁上。注 select后面跟的列要與通過order by猜出的列一致。再利用報錯字段查看數據庫名等基本信息。
為了減少SQL注入漏洞帶來的損失,應采取有效的方法來防御SQL注入漏洞。
當進行惡意的SQL查詢時,黑客會嘗試在SQL注入時構造一些查詢語句,使進行查詢時出現語法或邏輯上的錯誤,這些查詢出錯的信息往往是切入點,會提供給黑客大量信息,所以需要對這些錯誤進行處理,避免網站顯示類似下面的這些信息,如:類型錯誤、字段不匹配等,防止攻擊者利用這些錯誤信息進行一些判斷。
將SQL語句預編譯并綁定變量,如下代碼所示,將id后面的參數預先編譯好,參數化的語句使用參數而不是將用戶輸入變量嵌入到SQL語句中,則不管輸入什么參數都無法改變本身的語法結構。

對用戶輸入的內容進行限制,限制用戶提交非法數據,確保數據合法。可以采用對數據類型進行驗證或用正則表達式來驗證輸入。
比如特殊字符:’”<>&*;等都具有特殊的意義,最常見的SQL注入的特殊符是單引號,因為單引號是作為代碼與用戶輸入數據的字符串分隔符,單引號內部的內容是用戶輸入的數據,外部為SQL代碼。在URL欄或提交參數的表單中,如果沒有加入過濾特殊字符的代碼,并沒有對數據庫拋出異常進行處理,則數據庫遇到單引號注入后,會認為是語法錯誤,并拋出錯誤提示,對經驗豐富的黑客來講這些信息往往是具有價值的。
比如清除掉所有特殊字符的正則表達式:

SQL注入漏洞從1998年被發現后,直到現在還仍然會對web應用的安全產生極大危害。OWASP在2017年公布的十大最流行web安全漏洞中注入漏洞居榜首,這就更加證實了這一點。本文列舉了SQL注入的常用方法,分析了注入原理,并給出了三點建設,希望能降低SQL注入漏洞攻擊的概率。
[1] Bitcarmanlee.Web安全之 SQL 注入攻擊技巧與防范[EB/OL].(2016-03-01)[2017-01-09].http://blog.csdn. net/bitcarmanlee/article/details/50945437. Bitcarmanlee.Web Security SQL Injection Attack Skills and Prevention[EB/OL].(2016-03-01)[2017-01-09]. http://blog.csdn.net/bitcarmanlee/article/ details/50945437.
[2] 吳為團,鄭海燕,張銳麗.基于 Web應用程序的 SQL注入攻擊和防范[C].中國通信學會學術年會,2015.
[3] 馬俊,段興林.Web應用系統中SQL注入的分析與預防[J].信息技術,2015.
[4] 魏星.基于手工SQL注入的web滲透測試技術研究[D].山西:中北大學,2015.