靶场地址:https://buuoj.cn/challenges
XSS基础知识:https://blog.csdn.net/ghsau/article/details/17027893
这个题有六关,全部通过后即可看到flag。
第一关
进入题目也没有什么输入框一片空白,所以直接尝试在url上进行xss注入
这一关比较简单,直接用最基本的XSS语句即可
payload: <script>alert(1)</script>
第二关
进入题目与第一关一样,继续尝试使用最简单的语句,发现使用过后页面上的welcome消失了,没有回显。网页上也没有其他信息,所以就查看一下源代码
这里可以发现,出题者用JS写了一个escape加密函数来过滤username,绕过即可。下面的第一个script是为了闭合这段代码让网页读取到攻击语句。
payload: );</script><script>alert(1)</script>
第三关
进来之后还是与之前一样的页面,还是继续使用最基本的语句没有其他反应,这里我们就直接查看源代码
这里跟上一关一样,这两个地方都可以用来过滤,我们可以选择'xss';来进行闭合,从而插入攻击语句如下
payload: ';</script><script>alert(1)</script>
第四关
进入后页面有所改变,是一个动态然后每隔10秒自动重定向的页面。
还是尝试基本语句,发现对<>=这些符号都进行了过滤
还是查看源代码
因为符号被过滤了,所以基本的XSS语句用不了,涉及到一个知识点,
伪链接:浏览器会把javascript后面的那一段内容当做代码,直接在当前页面执行。
所以直接设置仅有的变量jumpUrl即可。要记住这个语句,并不是所有的浏览器都支持javascript伪协议,并不是所有的标记的属性都可以产生XSS,通常只有引用文件的属性才能触发XSS。
格式: javascipt:[code]
payload: jumpUrl=javascript:alert(1)
等待10秒过后即可回显进入下一关。
第五关
看到一个输入框,直接尝试输入最简单的语句,然后随便一些字符数字字母,都是返回这个页面cannot post
经过尝试,在url上写语句也是没有反应,所以查看源代码
这里考察了一些代码功底,写得不是很难,可以看出是两个判断:首先接受参数autosubmit,判断autosubmit是否等于false。不是的话,继续执行。接下来判断variable。用=作为分隔。现在就可以构造语句绕过这两个变量。
payload:autosubmit=&action=javascript:alert(1)
尝试得知符号仍被过滤了,所以这里也是用到了伪链接语句。
第六关
终于到了最后一关,进入后又是第一关的样子welcomexss,还是尝试基本语句
瞬间就懵逼了,这个语句完整的回显在了页面上。说明是被读取了也没有过滤,但是未执行。我们查看源码
还是看不太懂,这里涉及到两个深入一点的知识:模板注入和沙箱逃逸
于是看了答案才知道漏洞就在代码中的angular.js/1.4.6
有兴趣的同学可以看这个:https://juejin.cn/post/6891628594725847047
我们学习一下如何判断是否有模板注入,因为不同的模板引擎所对应的语法都不同,所以我们就看这个Angular.js模板怎么判断注入
可以看到输入的{{3*7}}页面上回显了21,也就是说我们的赋值是成功的,这也就代表了这里确实有模板注入。然后通过搜索查询Angular JS客户端模板注入的Payload进行xss注入。
payload:{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}
然后过关成功拿到flag
XSS的题目类型基本就这些,我认为更难的题目也就是在这些结构的语句中加入更复杂的对象以及不同类型相互融汇贯通。解题思路很简单就是不断的尝试和构造语句来进行攻击,不太熟练的同学(包括我自己)可以从易到难,从简入繁。
欢迎讨论和指正。
furuarua
前排学习观摩,感谢大佬的投稿

高德魏来恶心人了,受不了了 😭