V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuzhen
V2EX  ›  信息安全

token 被盗引发的数据安全问题

  •  
  •   liuzhen · 2021-11-18 17:06:19 +08:00 via Android · 10863 次点击
    这是一个创建于 1099 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在过等保,测试人员拿 admin 用户的 token 替换到了 guess 用户的请求头里,得出一个存在越权的结论,给的修复方案是: 对所有用户功能基于 sessionid 判断用户权限。

    但我寻思 sessionid 不也存在浏览器端吗,一样可以被等保测试人员拿到放在其他用户的请求里伪装 admin 用户
    118 条回复    2024-04-28 18:03:10 +08:00
    1  2  
    hhyygg
        1
    hhyygg  
       2021-11-18 17:12:42 +08:00
    如果用了 Token ,那 Token 不就是作为 SessionID 了吗?
    lniwn
        2
    lniwn  
       2021-11-18 17:13:42 +08:00 via iPhone
    那么问题来了,guest 用户使用了 admin 的 token ,拿它还是原来那个 guest 用户么?
    gadfly3173
        3
    gadfly3173  
       2021-11-18 17:14:45 +08:00   ❤️ 1
    这个测试方法不是变成强行 CSRF 了么。。。
    liuzhen
        4
    liuzhen  
    OP
       2021-11-18 17:15:58 +08:00 via Android
    @hhyygg 等保人员就是用大权限的用户的 token 覆盖到小权限的用户 token ,再去请求接口数据,要求识别出这个请求是小权限用户的。这不是脱了裤子放屁嘛,等于是要求你把你家钥匙给张三,要求张三去开门的时候开不了
    liuzhen
        5
    liuzhen  
    OP
       2021-11-18 17:16:40 +08:00 via Android
    @lniwn 就是要求你还能识别出它是原来的 guest 用户
    gadfly3173
        6
    gadfly3173  
       2021-11-18 17:16:44 +08:00
    按照这个说法,这个测试提的想法和传说中的 app 检测手机壳颜色一样了,打破第四面墙去检测屏幕之外的人。。。
    HelloWorld556
        7
    HelloWorld556  
       2021-11-18 17:17:50 +08:00
    加个人脸识别吧
    ReysC
        8
    ReysC  
       2021-11-18 17:18:30 +08:00   ❤️ 4
    token rename to sessionid
    wolfie
        9
    wolfie  
       2021-11-18 17:20:55 +08:00
    这个简单,每次接口请求前,弹窗输入当前用户密码就行了。🐶🐶
    lniwn
        10
    lniwn  
       2021-11-18 17:21:06 +08:00 via iPhone   ❤️ 1
    @liuzhen 明显测试人员没有理解 token 的意义。说个偏门,token 换成 admin 了,那用户就是 admin ,前段显示 guest ,是前端的 bug[🐶]
    darknoll
        11
    darknoll  
       2021-11-18 17:21:07 +08:00
    这帮人啥都不懂啊
    mannixSuo
        12
    mannixSuo  
       2021-11-18 17:22:43 +08:00
    token 里面放个用户的 IP ,判断下请求 IP 和 token 里面的 ip ?
    coosir
        13
    coosir  
       2021-11-18 17:29:12 +08:00   ❤️ 4
    user_name + token 组合判断,他们替换就没用了,哈哈哈
    rockyliang
        14
    rockyliang  
       2021-11-18 17:29:12 +08:00
    @mannixSuo 在使用产品过程中用户的 IP 地址有可能会变的,如果 IP 一变就要求用户重新登录,体验会很不好
    liuzhen
        15
    liuzhen  
    OP
       2021-11-18 17:32:08 +08:00 via Android
    @mannixSuo IP 不行啊,服务器收到的同一个路由器下的不同电脑的 IP 是一样的,而且 WiFi 切到 4g 肯定会变 IP ,就让用户重新登录不够友好
    kiracyan
        16
    kiracyan  
       2021-11-18 17:34:41 +08:00
    token 绑定设备 UA 或者唯一的客户端码 换了就重新登录
    liuzhen
        17
    liuzhen  
    OP
       2021-11-18 17:35:46 +08:00 via Android
    @kiracyan 客户端就是 web 浏览器
    DoraMouse
        18
    DoraMouse  
       2021-11-18 17:35:56 +08:00   ❤️ 1
    token 这里可以理解成打开门的钥匙,如果拿管理员的钥匙能打开管理员才能开的门,那这不是很正常的事,跟门有啥关系。
    sprite82
        19
    sprite82  
       2021-11-18 17:36:30 +08:00
    等保这帮人就这样的,很 sb ,比如拿 admin 用户的页面 抽出部分 html , 给嵌入到 guest 用户的页面中,告诉我,你这个权限越权了
    x86
        20
    x86  
       2021-11-18 17:36:34 +08:00
    人才,token 拉取的是权限...用户信息没变?
    Trim21
        21
    Trim21  
       2021-11-18 17:36:51 +08:00 via Android
    要求使用管理员用户密码无法登录为管理员,彻底解决用户帐号密码泄漏问题。
    Foxii
        22
    Foxii  
       2021-11-18 17:38:32 +08:00 via Android
    利用前端 bug 类似的机制跳转以骗过等保人员
    liuzhen
        23
    liuzhen  
    OP
       2021-11-18 17:39:05 +08:00 via Android
    @sprite82 难搞,你们最后是怎么解决的呢?
    ila
        24
    ila  
       2021-11-18 17:39:43 +08:00 via Android
    用 pc 端吧
    liuzhen
        25
    liuzhen  
    OP
       2021-11-18 17:39:53 +08:00 via Android
    @Foxii 他们是在类似 postman 的工具上 copy token 测的
    cheng6563
        26
    cheng6563  
       2021-11-18 17:41:47 +08:00
    等保的还叫我们关掉 keep-alive ,但我们用的是 HTTP2 。
    deplivesb
        27
    deplivesb  
       2021-11-18 17:43:30 +08:00
    #12 楼这个兄弟是招行出来的吧,我招行 app 每次都会遇到 Face ID 登录之后点个都叫我重新登录一次
    Foxii
        28
    Foxii  
       2021-11-18 17:44:52 +08:00 via Android
    @liuzhen 那个工具它有木有默认的 ua 比如 postman 就有
    sprite82
        29
    sprite82  
       2021-11-18 17:45:55 +08:00
    @liuzhen 没得搞,让项目经理去晓之以情动之以理, 理由:强行修改 html 是没办法控制的,另外虽然加入了不属于 guest 用户的页面,但是用户请求后台也是没用的,有权限控制的。而且,你都同时有 admin 和 guest 的账号了,哪怕 guest 没权限做破坏,admin 也可以继续搞事,无解,这测试方式就不合理
    dzdh
        30
    dzdh  
       2021-11-18 17:46:08 +08:00
    车钥匙被盗引起的汽车被偷问题
    whosesmile
        31
    whosesmile  
       2021-11-18 17:46:33 +08:00
    有个中间办法类似银行的 APP ,如果你切换网络需要重新登陆,也就是检测 IP 之类的信息,但是如果安全员就在同一个设备上双开浏览器,暂时想不到办法。
    defunct9
        32
    defunct9  
       2021-11-18 17:48:12 +08:00   ❤️ 1
    等保的让我们改掉 root 用户的用户名,不能叫 root 。
    Foxii
        33
    Foxii  
       2021-11-18 17:48:20 +08:00 via Android
    token 过期设置为 0.5 秒前端 0.1 秒刷新一次,比的就是等保人员的手速
    whosesmile
        34
    whosesmile  
       2021-11-18 17:50:21 +08:00
    没注意已经有人提了这个思路了,想到了如果只是想骗过等保测试,无非是把门槛拉高,比如你每次请求都加一个 CSRF TOKEN ,但是如果测试人员每次都有办法复制所有的请求头,那就是扯淡的事了,HTTP 没来就无状态,无解的事情。
    marcong95
        35
    marcong95  
       2021-11-18 17:51:14 +08:00
    把 token 放 sessionID 里?
    Foxii
        36
    Foxii  
       2021-11-18 17:52:04 +08:00 via Android
    @whosesmile 确实只能骗,因为本来就没啥问题
    misaka19000
        37
    misaka19000  
       2021-11-18 17:52:40 +08:00
    加设备识别
    liuzhen
        38
    liuzhen  
    OP
       2021-11-18 17:53:03 +08:00 via Android
    @Foxii 上有政策下有对策,这也是没有办法的办法了
    liuidetmks
        39
    liuidetmks  
       2021-11-18 17:59:21 +08:00
    随机 nonce + token + 其他业务参 与 参数校验吧?

    如果他是简单的 Charles 抓包替换 替换能防住

    如果手里有项目源码,写的代码测试.那就~
    eason1874
        40
    eason1874  
       2021-11-18 18:07:45 +08:00
    对浏览器来说 SessionID 和 Token 唯一区别就是字段名不一样。这测试水平不咋滴,搞不好你改个名字就完事了

    如果是前后端分离的,可以在登录时存一个 key 到 localStorage ,每次请求都用它签一个 RequestId 带上,服务端记录 RequestId ,同一 SessionID/Token 在一段时间内使用重复的 RequestId 直接 403 。这样搞,只是复制请求信息就不能成功了
    pengtdyd
        42
    pengtdyd  
       2021-11-18 18:14:17 +08:00   ❤️ 2
    跟一帮废物共事,就是会遇到各种奇葩问题
    DeWjjj
        43
    DeWjjj  
       2021-11-18 18:21:32 +08:00
    主机都被劫持拿到 token 了,你说其他的还有意义嘛?
    这种角度的安防就别做了,用户的手机验证码已经给坏人监听了。
    咋了你这样防只会防到正常用户,最多就是加一个浏览器版本和 ID 。
    其他的做了,会干扰正常用户。
    moreant
        44
    moreant  
       2021-11-18 19:11:10 +08:00
    ≈短信验证码被盗引发的数据安全问题( doge
    karloku
        45
    karloku  
       2021-11-18 19:34:35 +08:00
    管理员被绑架引发的数据安全问题(
    aliveyang
        46
    aliveyang  
       2021-11-18 19:50:10 +08:00
    token:"我" 越权了 "我" ?
    xuxuxu123
        47
    xuxuxu123  
       2021-11-18 19:55:37 +08:00   ❤️ 1
    我们系统是做了 ip 校验,登录时的 ip 和操作 ip 不一样就强制下线
    CloudMx
        48
    CloudMx  
       2021-11-18 20:45:51 +08:00
    这兄弟是想证明垂直越权吧,貌似搞反了,常规操作,要拿也是拿低权限的身份识别信息(SessionID 、JWT 信息)去高权限的账号请求接口去替换,而不是拿高权限的身份去请求低身份请求。
    Jooooooooo
        49
    Jooooooooo  
       2021-11-18 20:54:00 +08:00
    他拿 admin 的账户密码还能登录 admin 账户呢.
    huaxianyan
        50
    huaxianyan  
       2021-11-18 21:04:25 +08:00
    拿没有权限的账号 token 替换 admin 用户的还能请求通过才能说明有垂直越权吧?
    yogogo
        51
    yogogo  
       2021-11-18 21:07:08 +08:00
    是不是对越权理解不正确?
    xiaofan305
        52
    xiaofan305  
       2021-11-18 21:24:02 +08:00
    以前貌似听说过一种叫做“浏览器指纹”的技术,可以用来做广告跟踪,或许可以用 token 和它绑定。不过这只是一种传说中的技术,感觉挺黑科技的,实际上如何不晓得。。。简单的做法就是 token 和用户 id 绑定,请求的时候把用户 id 也传过来。或者,可以设置多个 token 字段,让他们想复制都不知道要复制哪一个。
    twl007
        53
    twl007  
       2021-11-18 21:51:20 +08:00 via iPhone
    这不等同于我拿了 admin 的账号和密码去登陆 admin 账号么……

    或者对 admin 账号做单独限制 用 one-time token 试试看
    xuanbg
        54
    xuanbg  
       2021-11-18 22:04:02 +08:00
    这个是有办法的,只要 token 里面存储客户端指纹就可以解决。验证 token 的时候比对指纹,像这种 geust 的 token 换成 admin 的 token ,指纹比对就过不去。
    vivipure
        55
    vivipure  
       2021-11-18 22:27:41 +08:00
    如果想达到这种测试用例的安全效果的话,必然会牺牲用户的使用体验。安全的意义主要在于加大用户破解成本,而不是保证绝对的安全,因为根本不存在绝对的安全。
    例如,我就见过客户端登陆时把密码直接加密 md5 再发送的情况。这种的确安全一点,但是没多大意义,如果有人通过 HTTPS 能直接获取你的登录密码了,那加个密还有屁用。
    HolaPz
        56
    HolaPz  
       2021-11-18 22:38:16 +08:00
    最近看到一篇文章
    token 给 2 个 一个 token 一个 refreshToken
    token 时间过了 就用 refreshToken 重新获取 token
    token 放 Authentication ,refresh Token 放 cookie
    ajaxfunction
        57
    ajaxfunction  
       2021-11-18 23:02:58 +08:00
    还有脑残人员让我把 waf 关掉,来 xss ,
    最后让我整改,说有高危 xss 漏洞,
    我 tm 上防火墙的目的就是过滤注入 xss 。

    让你把防盗门拆掉,他进去又指责你家不安全,没有防护措施。
    jones2000
        58
    jones2000  
       2021-11-18 23:17:28 +08:00   ❤️ 1
    每个用户单独发证书,token 使用每个用户对应的证书加密。 这样就算替换了用户, 原来的 token 是无法解密的。
    yyysuo
        59
    yyysuo  
       2021-11-18 23:27:55 +08:00
    等保就是瞎搞。
    Ansen
        60
    Ansen  
       2021-11-18 23:56:38 +08:00
    算用户的机器码?
    RuLaiFo
        61
    RuLaiFo  
       2021-11-19 00:31:35 +08:00
    那 guess 用户拿到了 admin 用户的密码去登陆,也需要识别出这个用户的 guess 用户🐶。
    binux
        62
    binux  
       2021-11-19 01:23:25 +08:00 via Android
    如果你们接口有 PII ,用 admin token 读到了 guest 的 PII 也算是越权了。
    FightPig
        63
    FightPig  
       2021-11-19 01:43:39 +08:00
    这个,好奇最后 怎么解决
    veike
        64
    veike  
       2021-11-19 01:51:35 +08:00 via Android
    @jones2000 服务器端怎么知道拿哪个用户密钥解 token ?
    Firxiao
        65
    Firxiao  
       2021-11-19 08:01:14 +08:00 via iPhone
    这得看你们用的是什么类型的 token.
    如果是 Bearer Token ,那测试人员提出的无意义.
    如果 token 中不包含用户信息,是账号+token 认证,那么确实会有安全隐患.
    就好比你大街上捡了把钥匙,你得知道这个钥匙对应哪户人家.
    murmur
        66
    murmur  
       2021-11-19 08:22:05 +08:00
    这测试太 tm sb 了,要说唯一的缺点,就是关键用户没有多因子认证,我如果管理员是密码+手机,然后你还拿 token 去复制

    那只能说 sb
    murmur
        67
    murmur  
       2021-11-19 08:23:19 +08:00
    管理员就是管理员,普通账号的信息都读不到叫什么管理员,现在都是实名制,出现啥问题还要上级汇报,凭啥管理员不能读普通用户的身份信息。。
    mannixSuo
        68
    mannixSuo  
       2021-11-19 08:46:20 +08:00
    @liuzhen 安全性和便利性,看怎么取舍了
    mannixSuo
        69
    mannixSuo  
       2021-11-19 08:48:02 +08:00
    @deplivesb 银行这种强调安全性应用,这样搞我觉得一点问题没有
    maskerTUI
        70
    maskerTUI  
       2021-11-19 08:59:36 +08:00
    教一下那些等保人员,用高权限请求了成功低权限用户的数据不叫越权,用低权限请求成功了高权限用户的数据才叫越权,名叫“垂直越权”;再给他们科普一下还有一个东西叫“平行越权”。
    onionlc
        71
    onionlc  
       2021-11-19 09:19:35 +08:00
    啊,我司也在过二级等保,测评人员没测这种问题;
    大家伙都是过三级等保的吗
    shaojz2005
        72
    shaojz2005  
       2021-11-19 09:32:46 +08:00
    等保要的是分数而已,不代表所有的问题都要整改。
    fengpan567
        73
    fengpan567  
       2021-11-19 09:44:35 +08:00
    你们测试真逗
    Huelse
        74
    Huelse  
       2021-11-19 09:51:51 +08:00
    别提了,之前遇到了银行的测试,说这个请求复制 cookie 就能用工具复现了,不安全
    joyhub2140
        75
    joyhub2140  
       2021-11-19 09:52:41 +08:00
    单 token 也不行的啦,还有个每次请求都生成一个随机校验 id ,服务端校验
    wat4me
        76
    wat4me  
       2021-11-19 09:54:47 +08:00
    是同一台机器不,同一台机器切换浏览器也应该要掉线吧
    Felldeadbird
        77
    Felldeadbird  
       2021-11-19 10:03:31 +08:00
    你家里有一把钥匙。平时你带着,其他人不可能开门。

    有一天,你出门时钥匙掉地上了。被张三捡了了,于是乎你家被张三进去了。

    ---

    所以我认为修复方案就是 token 加上用户设备识别。 例如上面按理,钥匙加一个 NFC 识别。张三捡到,但是没有 NFC 识别是钥匙主人,他还是开不了锁。
    ganbuliao
        78
    ganbuliao  
       2021-11-19 10:11:16 +08:00
    你们就直接给他们 guest 权限就好了 别让他们知道有 admin 权限
    jones2000
        79
    jones2000  
       2021-11-19 10:19:29 +08:00
    @veike 请求数据的时候把账号名也发过去。
    byte10
        80
    byte10  
       2021-11-19 10:20:59 +08:00
    @Felldeadbird 一会儿 测试人员会说,张三又捡到了你的手机 NFC 呢。 那些土鸡是教不了的,脑子的问题,非常的烂。
    @liuzhen 这个社会就是存在很多这样的人,脑子逻辑思维非常的差,脱了裤子放屁的事情经常干。我很难过,为啥教不懂他们呢,稍微正常的脑子就能理解的事情。
    @coosir 你错了,测试人员会把 user_name 也替换成 admin ,然后又来盘你。
    @karloku 是的这个回答最经典,那群土鸡会假设管理员被绑架了,被绑匪盘出密码了,然后他们会得到结论绑匪居然使用密码能正常登录,现实中有太多这样的人了。
    ookkxw
        81
    ookkxw  
       2021-11-19 10:28:45 +08:00
    最简单的方案应是做 2 个门,guest 和 admin 的钥匙只能开对应的门😄
    zliea
        82
    zliea  
       2021-11-19 10:30:19 +08:00
    @defunct9 要用 sudo ,不要 root 登录
    IvanLi127
        83
    IvanLi127  
       2021-11-19 10:30:49 +08:00
    再加一个 token 呗,这样 guest 拿到原先的 token 直接请求,就能因为另一个 token 校验不通过而被拦截了。 如果他再说这问题,就继续加 token ,加到他测哭了就行。
    est
        84
    est  
       2021-11-19 10:34:53 +08:00
    要你加你就加。那么多废话干嘛。反正麻烦的是用户。加完了你在注释里写一句 XXX 傻吊 就完事了。
    clf
        85
    clf  
       2021-11-19 10:36:43 +08:00
    设备-IP-UA 信息二次校验,同个 token 签发的时候记录前面的信息,后续请求不一致的时候就拦截,如果伪装到一致了,那就只能当作一致了呗。

    或者是只记录这样的行为,做好预警,视情况主动踢下线。
    tabris17
        86
    tabris17  
       2021-11-19 10:38:40 +08:00
    伞柄测试不用理它
    defunct9
        87
    defunct9  
       2021-11-19 10:40:00 +08:00
    @ztechstack sudo 有啊,人非让改掉 root 名,说容易被人猜到。
    zliea
        88
    zliea  
       2021-11-19 10:42:48 +08:00
    @defunct9 禁止 root 登录,linux 系统不可能没有 root 。
    conhost
        89
    conhost  
       2021-11-19 10:43:59 +08:00
    @IvanLi127 最简单的难道不是直接用 token 对 body 做个摘要,然后把这个摘要挂在 body 上,这样简单替换 token 就没用了
    defunct9
        90
    defunct9  
       2021-11-19 10:44:46 +08:00
    @ztechstack 禁止 root 登录了啊,人非让改掉。
    gps949
        91
    gps949  
       2021-11-19 11:02:03 +08:00
    讨论具体这个问题前,你先需要区分两个概念:“安全” & “合规”。
    合规不一定安全。安全不一定合规。不安全不一定不合规。不合规不一定不安全。

    所谓合规,就是要按照测评认证机构(的人员)的要求做,假设他们说 C 不行 Java 可以,你就得用 Java ,假设他们说 JS 不行 PHP 可以,你就得用 PHP ,就是这么个事。
    IvanLi127
        92
    IvanLi127  
       2021-11-19 11:15:37 +08:00
    @conhost 有道理,用 token 对 body 签名。不过我感觉把摘要挂在 header 里会简单点,这样就不用关心 body 内容了,直接对 body 文本签名就好了。
    YouKnowIt
        93
    YouKnowIt  
       2021-11-19 11:29:46 +08:00
    请求参数加签 + 绑定设备 id ,后端校验。前端上 jsvmp ,确保加签算法不会被逆向或黑盒调,设备 id 算法同理
    Mark24
        94
    Mark24  
       2021-11-19 11:33:12 +08:00
    这就是古代的兵符。

    只认令牌,不认人。

    自己把令牌拱手让人了。怎么说。反正令牌自己没毛病。


    用户应该用 HTTPS 、用自己的密码、浏览器密码 保护自己的程序不不被复制。
    你为什么要允许别人复制你机器上的东西。

    这里要被修改的不是程序,而是要培训使用者的安全意识。

    就像存折密码,不要随便告诉他人一样的道理。
    cnbattle
        95
    cnbattle  
       2021-11-19 11:43:01 +08:00
    让前端把 token 放内存里 类似 vue vuex 的实现,不要本地存储
    mytsing520
        96
    mytsing520  
       2021-11-19 11:58:21 +08:00
    @ajaxfunction
    分享一下我的想法,仅为个人意见:
    关闭 WAF 测试实际上他们是在帮你测了 WAF 不可用的场景下的问题。某种意义上也算合理,毕竟鸡蛋不能放一个篮子里。
    以后新出现的 XSS 的漏洞暂且不论。
    jetpy
        97
    jetpy  
       2021-11-19 12:01:07 +08:00
    可以考虑使用动态 token
    itechnology
        98
    itechnology  
       2021-11-19 12:05:26 +08:00
    这测试有点逗吧,guest 拿到 admin 的 token ,那这时候 guest 就充当 admin 的用户角色了。我觉得你 3 楼说的有道理:“等于是要求你把你家钥匙给张三,要求张三去开门的时候开不了”
    Lemeng
        99
    Lemeng  
       2021-11-19 12:19:01 +08:00
    动态的靠谱,要不人脸
    conhost
        100
    conhost  
       2021-11-19 12:48:32 +08:00
    @itechnology 这种要求也不能说逗吧,也许跟个人对安全的理念不一样呢?不然现在为什么会出现双因子认证呢?
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   960 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 21:23 · PVG 05:23 · LAX 13:23 · JFK 16:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.