• xss绕过:prompt(1)


    本次练习网站:http://prompt.ml/
    练习网站
    要求:弹窗成功出现you win

    0x0:闭合引号

    在这里插入图片描述

    输出在value内,首先闭合再进行prompt(1)的弹窗。

    1"><script> prompt(1)script>
    
    • 1

    在这里插入图片描述

    0x1:html不严谨性,单标签自动补全功能

    在这里插入图片描述

    它过滤了一个完整的标签,当<…/> 存在便过滤为空。为此利用html的自动补全,单标签的>符号功能。

    • 1

    在这里插入图片描述

    0x02:call函数

    在这里插入图片描述

    因为这里=与( 都被过滤了。因此我们可以使用Unicode编码,不使用html实体编码是因为它不能在JavaScript中使用回无效的。

    关于call函数:	call把eval绑定在绑定,直接用eval执行字符串,即等价于eval(`prompt(1)`)的执行
    eval() 函数会将传入的字符串当做 JavaScript 代码进行执行
    
    • 1
    • 2

    call传两个值:eval的指向,与eval执行的值
    第一个传值为空时指向Windows的全局变量,后返回字符串prompt(1)。
    因为指向全局变量,在全局中有prompt(1)函数,如此就执行这个函数
    在这里插入图片描述
    字符串是eval来执行的,最后返回的是给eval这个返回值
    call收到一个值为空于是指向Windows的全局
    在这里插入图片描述
    aaaaa在Windows全局没有这个函数
    在这里插入图片描述
    这里直接将eval执行相当于别名调用,这里就想到与call方法强行指向prompt(1),但是js官网为了安全指向了全局,但是目前第二个参数没有传值,所有undefind。
    call的传给指向与执行值
    eval的别名:call在这传的值不是空,而是具体的值时就是他的别名。 JavaScript中默认别名指向全局

    <script>eval.call`${`prompt\u00281)`}`script>
    
    • 1

    在这里插入图片描述

    0x03:闭合注释

    在这里插入图片描述

    题目中我们将在注释中输入内容,为此考虑闭合注释。但是它过滤了–>的注释方法。为此我们可以使用–!>来闭合第一个注释。后面的注释可以不闭合不影响。

    html注释:
    1、
    2、
    
    JavaScript的注释
    1、//
    2、 开头使用 --> 
    
    解题:
    	--!><script>prompt(1)script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    0x04:@的分割作用

    在这里插入图片描述

    题目要求有http://prompt.ml/,为此使用@来使用test.js文件来应用。

    在这里插入图片描述

    http://prompt.ml/@127.0.0.1/test.js
    
    • 1

    在这里插入图片描述

    0x05:html的不严谨性,换行连续

    在这里插入图片描述

    题目过滤了on.*=即一定程度上禁用了事假。但是对于html里的事件=换行使用仍然是有效的。

    1"  type="image" src=1 onerror
    ="prompt(1)
    
    • 1
    • 2

    在这里插入图片描述

    0x06:# 分割作用

    在这里插入图片描述

    var segments = input.split(‘#’);
    #其分割作用,即把http://httpbin.org/post分为组1,把{“name”:“Matt”}分为组2
    在这里插入图片描述
    var formURL = segments[0]; url取第一个组,就如http://httpbin.org/post
    var formData = JSON.parse(segments[1]);:data取第二个组,即如{“name”:“Matt”}
    在这里插入图片描述
    form.action = formURL; form.method = ‘post’;
    即:把URL给了action;模式设置为POST模式
    在这里插入图片描述

    在这里插入图片描述
    随后进入循环var i in formData,把 formData的值赋值给i。
    而后input.name=i,这个i就是fromdata对象里的key值,也就是name,
    然后给value赋值为fromData的值,也就是Matt。
    以上这些步骤就相当于创建了一个from表单。

    在这里插入图片描述>i:ignor 忽略大小写
    创建form后进入下一个if的判断,条件上说明如果没有script或data数据的就无法进入下一步,而是直接判断结果。还有一点就是它要求了为action。
    因为这个action会干扰我们直接使用JavaScript:prompt(1)后面{“name”:“Matt”}的输出。
    不然因为这个action我们#后的{“name”:“Matt”}是无法显示的。但是我们可以重新定义这个action,将其覆盖之前它的action。也就是如果action的值相同的时候,后一个会把前一个给覆盖掉。
    综上:
    要有使用prompt与#的分割。
    依照if的条件!/script:|data:/i.test(document.forms[0].action,使用#。
    在这里插入图片描述

    因此填写JavaScript:prompt(1)#{“action”:“Matt”}

    JavaScript:prompt(1)#{"action":"Matt"}
    
    • 1

    在这里插入图片描述

    0x07:注释绕过让长度限制

    在这里插入图片描述

    题目获取到信息
    1、title最多12个字符
    2、连接符号是换行符,#分割开
    3、join字符转字符串并且用换行符连接

    其中#分割开,但是为了绕过0-12的slice限制。利用注释把这个分为一段又一段,每段都在范围内。

    "><script>/*#*/prompt(/*#*/1)/*#*/script>
    
    • 1

    在这里插入图片描述

    /*">p>

    • 1

    注意标签得完整不能分开

    标签不完整会失去意义
    1、不完整
    在这里插入图片描述
    2、不完整
    在这里插入图片描述

    0x08:Unicode的\u2028与\u2029

    在这里插入图片描述
    Windows的\r\n联用,是换号并开头.
    js接受unciode编码的2028行分隔符,2029段分隔符

    avascript字符串允许直接输入字符,以及字符的转义形式。但是javascript中有5个字符规定了不能在字符串中直接使用,只能使用他们的转义形式

    1、u005c:反斜杠
    2、u000D:回车
    3、u0028:行分隔符
    4、u0029:段分隔符
    5、u000A:换行符

    题目将<,/ 和‘"’ 给过滤掉了,为此我们利用Unicode换行。

    我们想输入的效果
    
    		prompt(1)
    		-->
    为此通过Unicode换行在控制器转换再复制:
    	\u2028:行换行符
    	即: \u2028prompt(1)\u2028
    
    	输入转换的复制一下:
    		'prompt(1)-->
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    在这里插入图片描述

    0X09:转编码,与ſ符号使用

    在这里插入图片描述

    题目把字母全替换为大写了。为此可以使用svg,或者引用文件

    <ſvg/οnlοad=prompt(1)>
    <ſcript src="http://127.0.0.1/test.js">ſcript>
    
    • 1
    • 2

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    0xA:字母插入符号,字母替换空,字母无影响

    在这里插入图片描述

    题目将prompt替换为了alert;'换为了空。利用这个’卡bug,就是出入到prompt中就变成pro’mpt。因为替换为了空,就变成了prompt。

    pro'mpt(1)
    
    • 1

    在这里插入图片描述

    0xb

    在这里插入图片描述

    这里就是一个技巧"(prompt(1))in"会弹窗

    "(prompt(1))in"
    
    • 1

    在这里插入图片描述

    0x0c:parseInt函数

    在这里插入图片描述
    '替换为空,导致你如果用之前的方法prom‘’pt依然输入prompt,然后转为alertl了。

    利用parseInt,是Javascript内置函数,原型为parseInt ( String s , [ int radix ]),用于解析一个字符串,并返回一个整数。

    tostring()方法可把一个Number对象转换为一个字符串,并返回结果。
    官方文档:
    parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数,radix 是 2-36 之间的整数,表示被解析字符串的基数。
    这个范围2-36是数字加上字母的,
    相关文档:parseInt
    在这里插入图片描述

    eval(630038579..toString(30))(1)
    
    • 1

    在这里插入图片描述

    0x0f:

    在这里插入图片描述

    这个题与之前的0x07相似不同是限制反而与过滤了*符号为空。为此不能使用/* . . */的多行注释,可以使用实现多行注释。
    字符数从#后面开始算

    不可行:
    1"><script> prompt(1)script>
    
    • 1
    • 2

    在这里插入图片描述

    这个如同显示已经注释了,但是没有成功。为此更改了模块字符串形式。

    "><script>`${prompt(1)}`script>
    
    • 1

    在这里插入图片描述

    解释第一次尝试出错原因:

    1"><script> prompt(1)script>
    
    • 1

    关于上面的注释,我们最终想输入的效果是下图

     <script>prompt(1)script>
    
    • 1

    在这里插入图片描述

    但是当我们使用注释符号的时候
    在这里插入图片描述

    可见script标签内的 的注释没有生效。其实原因很简单。其中一个是因为script只能容纳文本,另一个原因是script标签内是js格式,而这个是html的注释是无法识别的。

    在js中的注释
    // 注释单行
    /**/ 注释块和注释多行

    此外我还在网上发现利用命名空间的转换,可以使用script内的html标签生效。

    1"><svg><script> prompt(1)script>
    
    • 1

    在这里插入图片描述

    HTML 解析器可以创建一个包含三个命名空间元素的 DOM 树:

    • HTML 命名空间 ( http://www.w3.org/1999/xhtml)
    • SVG 命名空间 ( http://www.w3.org/2000/svg)
    • MathML 命名空间 (http://www.w3.org/1998/Math/MathML)
      默认情况下,所有元素都在 HTML 命名空间中;但是,如果解析器遇到or元素,则它分别“切换”到 SVG 和 MathML 命名空间。并且这两个命名空间都会产生外部内容。

    其中svg如同xml格式,因此接受xml语法。xml的注释符与html一样的,xml接受编码。

    xml文件 注释
    第一种(单行):

       
    
    • 1

    第二种(多行):

    
    
    • 1
    • 2
    • 3

    第三种(多行):

    
    
    • 1
    • 2
    • 3

    由上发现xml的注释含有html的所有注释,为此xml文件是支持html注释的。为此转换为svg可以使生效

  • 相关阅读:
    appsecmonkey.com应用安全
    五分钟Win11安装安卓(Android)子系统
    python计算脚长 青少年电子学会等级考试 中小学生python编程等级考试一级真题答案解析2022年9月
    计算机毕业设计Python+django网上求职招聘系统(源码+系统+mysql数据库+Lw文档)
    C语言:求最大数不用数组
    git使用
    21年6月阿里巴巴Java暑期实习面经回顾(已上岸)
    尤雨溪:Vue 3 将成为新的默认版本
    ES线程池设置
    图论篇--代码随想录算法训练营第五十八天打卡|拓扑排序,dijkstra(朴素版),dijkstra(堆优化版)精讲
  • 原文地址:https://blog.csdn.net/Miracle_ze/article/details/126062776