102,【2】buuctf web [第二章 web进阶]XSS闯关

进入靶场

点击看看

前情提要

如果只想得到flag时

不想做题时,把level由1不断往下修改就可通过一关又一关

最后在url处修改level为7即可得到flag

通过做题破解每一关的话,就如下 操作

第一关

修改url

<script>alert('xss')</script>

第二关

点击确定之后发现第2关和第1关长得一样

但是提交之后没有通过

查看源代码

escape() 函数会对字符串中的特殊字符进行编码,例如将 < 编码为 %3C,> 编码为 %3E 等

我们需要绕过这个函数

可以看到username部分内容被用单引号括起来了

所以我们提交的时候要将其闭合

1';alert(1);'1

1' '1是为了闭合符合 ;是结束语句 alert(1)是题目要求

第三关

源代码

没有什么函数存在,但有单引号,用第二关的

1';alert(1);'1

查看源代码

发现出现转义符\,破坏了左单引号的闭合,但我们右单引号不受影响,所以试试''

1'';alert(1);'1

第四关

页面每过10秒刷新一次

php 复制代码
 // 调用 getQueryVariable 函数,尝试从当前 URL 的查询字符串中获取名为 'jumpUrl' 的参数值
    // 如果没有找到该参数,getQueryVariable 函数将返回 false
    if (getQueryVariable('jumpUrl') == false) {
        // 若未找到 'jumpUrl' 参数,则将 jumpUrl 设为当前页面的 URL
        jumpUrl = location.href;
    } else {
        // 若找到 'jumpUrl' 参数,则将 jumpUrl 设为该参数的值
        jumpUrl = getQueryVariable('jumpUrl');
    }

    // 使用 setTimeout 函数,在 1 秒(1000 毫秒)后调用 jump 函数,并将 time 作为参数传递给它
    setTimeout(jump, 1000, time);

    // 定义 jump 函数,用于处理倒计时和页面重定向逻辑
    function jump(time) {
        // 检查倒计时时间是否为 0
        if (time == 0) {
            // 若倒计时结束,将当前页面的 URL 重定向到 jumpUrl 所存储的 URL
            location.href = jumpUrl;
        } else {
            // 若倒计时未结束,将时间减 1
            time = time - 1;
            // 获取页面上 id 为 'ccc' 的元素,并更新其内部的 HTML 内容
            // 使用模板字符串显示剩余的倒计时时间和重定向的 URL(URL 经过 escape 函数编码)
            document.getElementById('ccc').innerHTML = `页面${time}秒后将会重定向到${escape(jumpUrl)}`;
            // 再次调用 setTimeout 函数,在 1 秒后继续调用 jump 函数,并传递更新后的 time 参数
            // 从而实现每秒更新一次倒计时显示
            setTimeout(jump, 1000, time);
        }
    }

    // 定义 getQueryVariable 函数,用于从当前 URL 的查询字符串中获取指定参数的值
    function getQueryVariable(variable) {
        // 获取当前 URL 的查询字符串部分(即问号 '?' 后面的部分),并去掉开头的问号
        var query = window.location.search.substring(1);
        // 使用 & 符号将查询字符串分割成多个键值对,存储在 vars 数组中
        var vars = query.split("&");
        // 遍历 vars 数组
        for (var i = 0; i < vars.length; i++) {
            // 使用 = 符号将每个键值对分割成键和值
            var pair = vars[i].split("=");
            // 检查当前键是否与要查找的变量名相同
            if (pair[0] == variable) {
                // 若相同,则返回该键对应的值
                return pair[1];
            }
        }
        // 若未找到指定的变量,返回 false
        return (false);
    }

level4?jumpUrl=javascript:alert(1)

第五关

查看源码

javascript 复制代码
// 检查当前 URL 的查询字符串中是否包含名为 'autosubmit' 的参数
// getQueryVariable 函数用于从 URL 查询字符串中获取指定参数的值
// 如果存在 'autosubmit' 参数,该函数将返回其值;若不存在,则返回 false
if (getQueryVariable('autosubmit')!== false) {
    // 如果 'autosubmit' 参数存在,通过 document.getElementById 方法获取页面上 id 为 'autoForm' 的表单元素
    var autoForm = document.getElementById('autoForm');

    // 设置表单的 action 属性,该属性指定表单数据提交的目标 URL
    // 使用三元运算符进行条件判断:
    // 如果 URL 查询字符串中不存在 'action' 参数(即 getQueryVariable('action') 返回 false)
    // 则将表单的 action 属性设置为当前页面的 URL(location.href)
    // 否则,将表单的 action 属性设置为 'action' 参数的值
    autoForm.action = (getQueryVariable('action') == false)? location.href : getQueryVariable('action');

    // 调用表单元素的 submit 方法,自动提交表单
    // 表单数据将被发送到设置好的 action 属性所指定的 URL
    autoForm.submit();
} else {
    // 如果 URL 查询字符串中不存在 'autosubmit' 参数,这里为空,不执行任何操作
    // 可以根据需求在此处添加其他逻辑
}

// 定义 getQueryVariable 函数,用于从当前页面的 URL 查询字符串中获取指定参数的值
function getQueryVariable(variable) {
    // 获取当前 URL 的查询字符串部分(即问号 '?' 之后的部分),并去掉开头的问号
    var query = window.location.search.substring(1);

    // 使用 '&' 作为分隔符,将查询字符串分割成多个键值对,存储在数组 vars 中
    var vars = query.split("&");

    // 遍历 vars 数组,对每个键值对进行处理
    for (var i = 0; i < vars.length; i++) {
        // 使用 '=' 作为分隔符,将每个键值对分割成键和值两部分,存储在数组 pair 中
        var pair = vars[i].split("=");

        // 检查当前键值对的键是否与要查找的参数名(variable)相同
        if (pair[0] == variable) {
            // 如果相同,则返回该键值对的值
            return pair[1];
        }
    }

    // 如果遍历完整个查询字符串都没有找到指定的参数,则返回 false
    return false;
}

autosubmit=1&action=JavaScript:alert(1);//

第六关

这一关看不懂

{ {'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}

  1. 'a'.constructor.prototype.charAt=[].join;
  • 'a'.constructor 实际上指向的是 String 构造函数,因为字符串 'a'String 类型的实例。

  • 'a'.constructor.prototype 就是 String 构造函数的原型对象,charAtString 原型上的一个方法,用于返回指定索引位置的字符。

  • [].join 是数组对象的 join 方法,它用于将数组元素连接成一个字符串。

  • 这行代码的作用是将 String 原型上的 charAt 方法替换为数组的 join 方法。在 AngularJS 的某些表达式解析过程中,会使用 charAt 方法,通过这样的替换可以干扰解析逻辑,为后续的代码注入创造条件。

  1. $eval('x=1} } };alert(1)//');
  • $eval 是 AngularJS 中的一个方法,用于在 AngularJS 的作用域(scope)内执行表达式。

  • 'x=1} } };alert(1)//' 是要执行的表达式。这里使用了巧妙的构造,x=1 是一个普通的赋值语句,后面的 } } }; 是为了闭合之前可能存在的代码块,而 alert(1) 是要执行的恶意代码,// 是 JavaScript 的单行注释符号,用于注释掉后面可能存在的代码,避免语法错误。

第七关

相关推荐
m0_748248233 分钟前
Go-Gin Web 框架完整教程
前端·golang·gin
苏-言26 分钟前
深入核心:一步步手撕Tomcat搭建自己的Web服务器
服务器·前端·tomcat
16年上任的CTO37 分钟前
vue2-给data动态添加属性
前端·javascript·vue.js·动态添加属性
彭友圈10141 分钟前
利用HTML和css技术编写学校官网页面
前端·css·html
飞舞花下2 小时前
一、0-1搭建springboot+vue3前后端分离-前端项目创建
前端
Z小明2 小时前
JavaScript 对象操作方法详解
前端·javascript
逝水流光2 小时前
Canvas系列(19):实战-五彩纸屑
前端·canvas
茂林QAQ2 小时前
让代码像是打字一样显示在页面上
前端
枫叶丹43 小时前
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)
前端·javascript·华为·华为云·harmonyos