李博文
(遼寧職業(yè)學院信息安全與管理專業(yè),遼寧 鐵嶺 112099)
隨著信息技術的發(fā)展,Web服務以通用性、獨立性、集成性等特點被各大行業(yè)所應用,與此同時Web服務安全問題也嚴重影響著Web服務的正常運行。SQL注入漏洞屬于OWASP發(fā)布Web應用程序安全10大嚴重風險漏洞之一,它會造成Web網站用戶的賬號、密碼等信息泄露,黑客利用高權限賬戶寫入木馬,利用木馬獲得Web應用服務器權限。在設計Web網站時,開發(fā)人員技術能力和開發(fā)經驗的參差不齊,使得開發(fā)出的Web網站可能存在未被發(fā)現的SQL注入漏洞,而隨著thinkphp等框架在開發(fā)中的應用,針對框架暴露出的漏洞危害著Web應用程序。
在Web交互時,攻擊者將惡意SQL語句帶入到原程序中,由于原程序對輸入內容沒有進行嚴格驗證,使惡意SQL語句改變了原 SQL語句預計的執(zhí)行結果,導致查詢或猜解出數據庫名、表名、字段名等信息,甚至寫入一句話木馬,拿到網站的WebShell權限。SQL注入漏洞的產生就是由于開發(fā)者過度追求開發(fā)速度忽視代碼質量和系統(tǒng)整體安全,片面的追求用戶需求,使項目出現“過度設計”,從而犧牲了系統(tǒng)的安全性。如①對用戶輸入沒有進行過濾和驗證。②給用戶權限過大,數據庫操作權限過大。③不當的錯誤處理。④轉移字符處理不合適。⑤使用字符串聯結組合多條SQL指令,導致數據和控制結構使用同一傳輸通道[1]。
在收集目標Web網站相關信息后,滲透人員在判斷網站是否存在SQL注入漏洞,主要可以采用以下3個方法。
2.1.1 手工驗證
驗證SQL注入漏洞需要根據實際環(huán)境情況采取不同的驗證方法,這里以基于回顯注入為例進行簡述。
回顯注入是指數據庫在執(zhí)行SQL語后,Web服務器將各種結果回顯到頁面中,滲透人員根據回顯信息拼接惡意SQL語句,從而獲取到想要的數據。在手工驗證回顯注入漏洞常用布爾型、報錯型、時間延遲、聯合查詢、多語句查詢的方法,通過回顯結果發(fā)現是否存在SQL注入漏洞,以DoraBox靶場為例,運用布爾型和時間延遲兩個方法驗證SQL注入。布爾型:/num.php?id=1 and 1=1#回顯信息正常,/num.php?id=1 and 1=2#無任何回顯信息,由此可得出存在SQL注入漏洞的結論。時間延遲:/num.php?id=1 and sleep(5)#回顯時出現5秒鐘的延遲,同樣可知存在SQL注入漏洞。如果目標網絡存在黑名過濾、正則表達式等,可通過Fuzz對SQL語句中的關鍵字進行驗證,發(fā)現未被過濾的關鍵字或運用編碼進行繞過,實現注入。
2.1.2 工具驗證
SQL注入工具以簡單、高效、快速等特點被滲透人員所青睞。AWVS是一款知名的網站漏洞掃描工具,它通過網絡爬蟲測試網站安全,檢測是否存在安全漏洞。SQL Poizon掃描器能夠利用搜索引擎收集互聯網上有SQL注入漏洞的網站。
2.1.3 編寫注入工具
Python以簡單、易學、開源等特點被很多滲透人員所應用,他們運用爬蟲庫來編寫自定義的SQL注入驗證工具測試目標網站是否存在漏洞,為下一步漏洞利用提供條件。
在確定存在SQL注入漏洞后,根據漏洞的類型統(tǒng)構造payload,進而獲得數據庫版本、數據庫名稱等相關信息。以MySQL數據庫為例,運用手工和工具2種滲透方式。
2.2.1 手工滲透
手工滲透是從猜解字段數開始,到確定數據顯示位,猜解數據庫名、表名、字段名,最終拖庫,每一個步驟都需要構造相應的payload。手工滲透是運用數據庫中的函數和SQL語句來構造不同的payload,數據庫會將執(zhí)行結果通過Web服務器響應給用戶。以布爾盲注為例,猜數據庫名長度時,構造/num.php?id=1 and (select length(database()))=1#返回錯誤,/num.php?id=1 and (select length(database()))=7#返回正確,說明數據庫長度是7。逐位猜解數據庫名時,構造/num.php?id=1 and (select mid(database(),1,1))=′a′#返回錯誤,說明數據庫名稱第一位字母不是a,/num.php?id=1 and (select mid(database(),1,1))=′p′#返回正確,說明第一位是字母p,當然運用ASCII碼比較同樣可以猜解第一個字母。布爾盲注可對表名、字段名和記錄進行逐一猜解,最終獲得到全部數據。手工滲透雖然比較慢,但它可以很好地控制payload繞過過濾和發(fā)送請求數量,不易被WAF等安全工具所發(fā)現。
2.2.2 工具滲透
工具滲透是高效、自動化的攻擊手段,它使?jié)B透過程更加快速和準確。如注入神器SQLMap,它是Python編寫的自動化SQL注入開源工具,可對MySQL、Oracle等多種數據庫管理系統(tǒng)進行滲透,支持5種注入模式,即基于布爾的盲注、基于時間的盲注、基于報錯注入、聯合查詢注入和堆查詢注入,并結合編碼、字典、枚舉等多種方法,自動滲透目標網站實現拖庫。由于工具滲透并發(fā)請求數量大,會觸發(fā)網站的安全機制,容易被防火墻阻攔。
從SQL注入漏洞成因角度出發(fā),防范漏洞應從編碼開始防范,即安全編碼。[2]同時對Web服務器進行安全設置、安全管理和WAF的應用。
在編寫Web應用程序時,要對用戶輸入信息進行嚴格的過濾,運用正則表達式、白名單過濾、安全函數等方法提升代碼安全,避免使用危險函數,在對Web應用程序發(fā)布前,要對其測試期間用到的報錯函數進行注釋或刪除,防止遺漏出現報錯信息回顯,降低出現SQL注入漏洞風險。
加強服務器系統(tǒng)安全,減少系統(tǒng)端口開放數量,加強日志審計,及時打補丁,限制用戶權限,提高系統(tǒng)安全等級。
WAF(Web Application Firewall)[3]是一種Web應用防火墻,它監(jiān)控網站上的HTTP/HTTPS訪問請求,通過定義過濾規(guī)則、啟用Web攻擊防護等功能,它可以有效地過濾用戶輸入內容,發(fā)現關鍵字信息,將其阻隔在網站之外,實現對網站訪問的有效控制。
SQL注入漏洞是Web網站十分危險的漏洞,它的存在主要是由于程序開發(fā)人員安全意識不強,安全編碼能力弱,為防范此漏洞的產生需要開發(fā)人員對編寫代碼進行嚴格審核,將此類漏洞消滅在部署Web網站之前,實現網站的安全運行。