方自遠
摘要:本文對SQL注入攻擊的原理和方法進行了介紹,對如何檢測和防御SQL注入攻擊進行了研究。網絡系統安全問題是一個持續性問題,SQL注入攻擊作為網絡中最為常見的攻擊手段。了解并掌握如何有效防御SQL注入攻擊對提升Web網絡系統的安全性有著重大的現實指導意義。
關鍵詞: Web安全; SQL注入; 漏洞檢測; 攻擊防御
中圖分類號: TP391
文獻標志碼:A
文章編號: 2095-2163(2016)06-0087-03
0引言
最近十年來,互聯網產業和技術發展蓬勃迅速,社會的各個領域都已經與Web應用建立了密切聯系。使用互聯網已經成為現代生活方式的不二選擇。在全世界,大致可知應有數以億計的網絡服務器都在提供互聯網服務。但與此同時,這些網絡服務器也無時無刻都會遭遇到各類惡意攻擊。
數據庫是Web應用系統的基礎組成部分,存儲著大量關鍵敏感信息,因此,侵入和攻擊數據庫,竊取數據信息是網絡攻擊的主要目的和實施手段。根據相關組織調研數據顯示,Web應用十大關鍵風險排名第一位就是注入攻擊。在全世界發生的Web服務系統攻擊實踐中,大約有60%的行為均可標注為SQL注入攻擊。因此,研究SQL注入攻擊及檢測防御技術對有效控制和降低網絡攻擊事件發生必將具有重大現實意義及作用。
[BT4]1SQL注入攻擊研究
[BT5]1.1SQL注入攻擊原理
SQL注入攻擊(SQL injection)是利用Web 應用程序的設計漏洞來實現Web應用系統、尤其是數據庫的入侵,從而最終達到獲取或破壞數據的一種非法策略及手段。通過SQL注入可能會導致如下后果:入侵者惡意進占了數據庫服務器、獲取數據庫高級操作權限、竊取數據庫中存儲的關鍵數據信息等。
SQL注入攻擊的發起者多是利用Web頁面中存在的漏洞,有針對性地構造SQL語句,并蓄意引導數據庫服務器執行這些SQL語句,通過截取用戶名和密碼等重要信息,從而全面獲取了數據庫控制權限。
SQL注入攻擊的可選研究方式主要有:
1)使用注釋符和恒等式;
2)使用union語句進行聯合查詢;
3)使用insert或update語句對數據庫數據表內數據進行增加或修改;
4)利用一些內置函數輔助進行攻擊等。
在此,將結合前2種方法給出實現過程詳述與闡析。
1.1.1使用注釋符和恒等式
眾所周知,如果要查詢數據庫的user表中所有條目,那么正確的查詢語句為:
SELECT * FROM user WHERE username = 'user' AND password = 'pawd'
利用ASP 實現時,需要連接字符串,而后再加上SQL 命令,最后執行查看返回的結果是否為空。那么SQL 語句嵌套在ASP 代碼中的表現形式可描述如下:
var sql = "SELECT * FROM user WHERE username = '" +loginname + "' AND密碼 = '" +loginpwd + "'";(loginname字段與loginpwd字段分別存儲了用戶在網頁上所填入的用戶名和密碼信息。)
但是當用戶在Web頁面文本框內輸入的內容為:loginname=‘ or 1=1 -- ,而loginpwd 的內容任意輸入時,此時在ASP 中的查詢語句則演變成:
SELECT * FROM user WHERE username=‘or 1=1 --AND password = 'pawd '
顯然,SQL語句中密碼驗證部分被“- -”注釋符當成了注釋語句,同時,由于“1=1”恒等式的存在導致用戶名驗證部分永遠為真。用戶名驗證和密碼驗證均發生了失效,這樣攻擊者就可以登錄進入Web應用系統了。
1.1.2使用union語句進行聯合查詢
利用union關鍵字查詢一些數據庫用戶信息、數據庫版本等信息。還可以用union關鍵字來獲取其他信息。通過頁面錯誤信息提示得到當前數據庫名稱、用戶名等關鍵信息。而且,還可通過多次的報錯測試,逐步獲得多種關鍵數據信息,從而掌握數據庫內部結構、數據庫用戶名等信息,為侵入數據提供實現基礎。
[BT5]1.2SQL注入攻擊流程
SQL注入攻擊的基礎流程可概述為:首先,檢測Web登錄頁面中是否有SQL注入漏洞,從而構建SQL注入點;其次,利用已經構建的SQL注入點將本該基于頁面獲取的驗證參數通過SQL語句的語法組合傳遞給數據庫;然后,經過多次試探,陸續可得到數據庫類型、數據庫結構、數據表信息以及數據庫賬號等;最后,則根據已知信息構造并執行SQL語句,達到侵入數據庫,獲取數據或實施數據更改等目的。研究設計步驟可展示如下:
[HT5”H][ST5”HZ]步驟1[HT5”SS][ST5”BZ]判斷SQL注入點。通常使用的SQL注入點判斷方法可分述為如下2種:
1)把“”添加到Web提交請求的尾部,再根據Web頁面反饋的提示信息來判斷該系統所使用的數據庫類型是否存在SQL注入漏洞。
但是,程序設計者可以進一步通過加入判別規則而將單引號進行過濾,那么將使單引號測試最終失效,從而無法判斷是否存在SQL注入點。
2)將“and 1=1”或“and 1=2”添加到提交請求的末尾,若添加“and 1=1”的提交請求可以正常返回顯示信息、而添加“and 1=2”的提交請求卻返回出錯提示,此時則說明該Web頁面存在注入漏洞;如果上述2個判別式均可返回提示信息,如此該Web頁面即是安全的,也就是不存在SQL注入漏洞。
[HT5”H][ST5”HZ]步驟2[HT5”SS][ST5”BZ]猜測表名和字段名。如果訪問的Web頁面存在注入漏洞,則可以在提交請求語句后加入“and exists (select count(*)from student”,如果頁面執行正常,沒有錯誤提示,則說明student表是存在的,否則student表不存在,可以更換名稱繼續測試,直到猜出表名為止。
如果將Count(*)替換為Count(字段名),則用同樣的方法即可進行字段名的探測。
[HT5”H][ST5”HZ]步驟3[HT5”SS][ST5”BZ]進行注入攻擊。當已經基本了解數據庫的內部結構后,黑客即可侵入后臺數據庫了。那么,這些黑客所需要的并不是DBA(數據庫管理員)賬號,而是DBA權限。當掌控了DBA權限后,據此將可獲得更高級別的權限,這樣便可以在Web系統中留下后門、植入木馬等。如果使用sa 連接數據庫,則能夠調用xp_cmdshell 等存儲過程,此時就可以對應用系統、數據庫乃至操作系統進行修改和控制了。
[BT4]2SQL注入攻擊檢測技術
根據檢測發生的時間和目的差異,SQL注入攻擊檢測可以分成為入侵前檢測和入侵后檢測。具體來說,利用漏洞掃描工具和構造SQL注入語句檢測即是入侵前檢測的主要手段,而入侵后檢測的方法則是檢查服務器日志文件。通常情況下,入侵者在發動SQL注入攻擊后,Web服務器和數據庫服務器的日志文件都會存有相應的登錄和操作記錄?;诖?,研究探討可知,通過使用如下方法即能改善與增進SQL注入漏洞檢測,分析闡釋如下。
1)利用漏洞掃描工具。常用的漏洞掃描工具有:HDSI、NBSI、Domain、Sqlmap、BSQL Hacker、The Mole、Pangolin(穿山甲)。需要指出的是,這些工具既是網站維護者可以善加利用的一些檢測工具,同時卻也是網絡攻擊者用來攻擊Web服務器的首選工具。
2)通過SQL注入點,執行非法SQL語句。將SQL語句的永真式或永假式追加在Web頁面請求后,根據頁面執行后得到反饋信息來判斷是否存在SQL注入點。對已發現的SQL注入點,通過構造and exits(select……)語句進行數據庫結構判斷。
3)日志文件檢查。一般情況下,Web應用系統遭到入侵后都會留下相關操作記錄在日志文件中。通過讀取并分析數據庫和Web服務器的日志文件來判斷系統是否發生了入侵則是一種行之有效的方法。只是,對于經驗老到的黑客來說,在實施入侵后則會進行殘留痕跡的清理。
4)對訪問請求進行檢測。正常的訪問請求不應該包含SQL關鍵字?;谶@一前提,如果在HTTP請求中含有SQL關鍵詞、特殊字符或者SQL語義的句子,即可初步判定為一次攻擊行為。
[JP3]使用頻度通常較高的SQL關鍵字有:select…from、 order by、union、drop table、exp、md5()、case when then、sleep、substring、user()、password()、version()、 substr()、benchmark()、schema()、--等都可以裁斷為SQL注入攻擊行為。 [JP]
[BT4]3SQL注入攻擊防御技術
要做到防御SQL注入攻擊,必須從多個層面設計應對策略:第一,從數據庫設計和數據庫管理方面;第二,從Web系統開發設計方面;第三,從Web系統管理維護方面?,F給出綜合論述如下。
[BT5]3.1數據庫管理防御措施
使用安全的數據庫賬號,嚴格管控數據庫賬號權限,謹慎分配sa權限,用于程序連接數據庫的用戶使用數據庫用戶角色組的成員,同時嚴禁使用服務器角色組成員。
在數據庫服務器上刪除多余的擴展存儲過程,尤其是訪問注冊表的存儲過程。
DBA要將數據庫服務器上的示例腳本最大限度移除,有效減少冗余腳本數據量。
數據庫應設置高強度密碼,提升密碼安全性。
[BT5]3.2Web系統設計防御技術
探尋目前安全問題的現象機理可知,Web系統開發人員應建立全局性的安全意識,在設計過程中充分考慮可能出現的安全漏洞,編寫安全代碼,防患于未然。
在此基礎上,Web程序設計者則應保證后臺研發程序能夠具備對用戶提交的訪問請求參數、pose數據、查詢關鍵字進行嚴格檢測和限制的功能;異常錯誤界面可以跳轉指定界面,在設計上保證不會將錯誤信息暴露給Web系統使用者;而當涉及到數據庫訪問時,應采用加密傳輸,保證絕不使用明文傳遞參數;另外,針對SQL注入攻擊常用方式,應嘗試設立SQL語句的關聯構建規則。
[BT5]3.3系統管理維護防御措施
系統管理員應及時更新可為Web系統運行提供基礎支持的關鍵軟件,確保攻擊者無法通過操作系統漏洞進行入侵。此外,應關閉相關對外連接端口,如TCP 1433/UDP 1434。系統管理員還應定期檢查系統中用戶密碼,提升密碼強度,建立密碼定期更換的長效機制。同時,Web系統管員也要定期對Web系統日志引入安全審核,檢查是否存在異常訪問記錄,確保能夠及時發現系統安全隱患。
[BT4]4結束語
作者在本文中介紹了SQL注入攻擊的原理和方法、如何檢測SQL注入漏洞、怎樣防御SQL注入攻擊方面的內容。通過本文,讀者對SQL注入建立了一個全面清晰的認識,對如何檢測和防御SQL注入攻擊也獲得了基本了解,并掌握了一定的基礎方法及有效防范手段。
當前的時代是一個互聯網時代。網絡安全問題既是互聯網安全問題,也是社會安全問題。作為網絡中最為常見的攻擊手段,SQL注入攻擊給互聯網造成了巨大的破壞,也帶來了難以估量的經濟損失。因而研究實現有效防御SQL注入攻擊,對于提升Web網絡系統的安全性無論從經濟、社會、倫理方面都將具有重要意義。
參考文獻:
楊章瓊,陳效軍,王濤. SQL注入攻擊淺析[J]. 計算機光盤軟件與應用, 2012(16):103-104.
[2] 楊豐嘉. 淺談網站SQL注入攻擊防護[J]. 計算機光盤軟件與應用, 2013(13):144.
[3] 劉秀梅,辛陽,徐勤. SQL注入攻擊及防御方法研究[EB/OL]. [2016-09-21].http://www.paper.edu.cn/releasepaper/content/201609-190.
[4] 龐博,高杰. 基于ASP.NET的SQL注入攻擊與防范[J]. 輕工科技,2009,25(9):86-87.
[5] 齊林,王靜云,蔡凌云,等. SQL注入攻擊檢測與防御研究[J]. 河北科技大學學報, 2012,33(6):530-533.
[6] 鄭斌. 黑客攻防入門與進階[M]. 北京:清華大學出版社,2010.[ZK)]
[FL)]
[CDF61]
[HT5”SS][ST5”BZ][WT5”BZ](上接第86頁)
[FL(2K2]
[HT5”SS]
FETCH ABSOLUTE 3 FROM cur_xg--返回第3行并將其變為當前行
UPDATE xsxx SET rxnf=2012--更新當前行的列值
WHERE CURRENT OF cur_xg--當前游標指針所指的當前行數據
CLOSE cur_xg
DEALLOCATE cur_xg
這里需要注意的是,游標的第二種應用是一種不規范的更新數據的途徑,很容易造成數據的不一致,因此通常狀況下并不選用游標來設計更新數據表中的數據。
另外,還需提及的就是,本文實例所用的數據表均基于xxsf(學校收費數據庫)中的2個表,分別是:
xsxx(rxnf,xh,xm,xb,ksh,sfz,zydm,zsid)
zysf(zydm,zymc,lsyx,pycc,xxnx,xfbz,jcfbz)
[BT4]5結束語
SQL Server中的游標在原理上具有C語言指針一樣的語言結構,相應地則設計提供了一種在服務器內部處理結果集的方法。使用游標可以通過遍歷操作逐一地從結果集中實現數據讀取,也可以對結果集中某些數據重點加設更新或刪除的操作。本文以學校收費數據庫為背景并結合具體的實例來闡述游標的使用,游標可以面向結果集中的每一行進行相同或不同的操作,這不僅提升了SQL語句處理復雜查詢的能力,而且還降低了系統開銷和潛在的阻隔情況,在一定程度上解決了許多應用程序不能把整個結果集作為一個單元來處理的問題。
[HS1*2][HT5H]參考文獻:[HT]
[WTBZ][ST6BZ][HT6SS][1] [ZK(#〗
[HJ*2]
趙慧玲,毛應爽,孟憲穎. 基于SQL游標的研究與應用[J]. 科技創新導報,2012(28):31-32.
[2] 劉志成,寧云智,劉釗,編著. SQL Server實例教程[M]. 北京:電子工業出版社,2013.
[3] 薛麗香,汪東芳. 淺談SQL Server數據庫中游標的使用[J]. 福建電腦,2016(6):157-158.
[4] 陳芳勤. SQL Server 2000中游標的應用[J]. 中國科技信息,2008(13):96,99.
[5] 黃龍軍. 游標在Online Judge中的應用[J]. 紹興文理學院學報(自然科學),2012,32(8):26-29.[ZK)]
[FL)]