XSS Challenges靶场练习1~10
靶场:https://xss-quiz.int21h.jp/
1.stage #1 无过滤的XSS注入
1.1 使用闭合标签方式进行反射型 XSS 注入
2.Stage #2 属性中的 XSS 注入
2.1 使用闭合的input标签方式进行注入
2.2 在input标签属性中注入事件
3.Stage #3 选择列表中的 XSS 注入
4.Stage #4 在隐藏域中注入 XSS
4.1 查看隐藏域传递数值的效果
5.Stage #5 限制输入长度的解决方法
6.Stage #6 限制输入 <> XSS的注入
7.Stage #7 限制输入引号的 XSS 注入
8.Stage #8 JavaScript伪协议
9.Stage #9 UTF-7编码注入(跳过,不常用)
10.Stage #10 绕过关键字domain
stage 1(无过滤)
探测xss过程:
1、构造一个独一无二且不会被识别为恶意代码的字符串用来提交
例如:qwe123
2、使用浏览器F12进行审查代码,寻找构造的字符串是否在页面中显示
可以看到是由双引号以及b标签闭合的,
构造payload:
使用双引号和b标签让我们的js脚本可以被浏览器解析
"</b><script>alert(document.domain)</script>
如果我们不闭合标签,即使在双引号内,文本依然会被作为js脚本执行!
<script>alert(document.domain)</script>
stage 2(属性中的XSS注入)
分析源码,payload是包裹在input中的value属性中,也就是在input标签属性中进行注入:
payload:
"><script>alert(document.domain)</script>
input标签被闭合了,执行了我们的js代码
stage 3(选择列表中的 XSS 注入)
测试发现代码被b标签包裹
尝试用"</b>
进行闭合,失败
看来并不是在此处,再看题会发现自己可以选择国家,猜测注入点会不会在此处,
使用burpsuite抓包:
p2
处构建payload:
<script>alert(document.domain)</script>
成功出现弹窗!!
4.Stage #4 在隐藏域中注入 XSS
抓包可以发现比较上一关多出了个p3
payload:
<script>alert(document.domain)</script>
并没有弹窗,再查看源代码发现我们的js代码在input中的value属性,这就好办了,闭合value的双引号和input的单括号即可!
构建payload:
"><script>alert(document.domain)</script>
成功!
5.Stage 5 (限制输入长度的解决方法)
可输入字符最大长度是15,发现可以直接修改,直接置空即可
我们的payload还是在value中,直接上payload:
"><script>alert(document.domain)</script>
6.Stage 6 (限制输入 <> XSS的注入)
发现<>
被转换为实体符号了,那就要用引号来构建payload了
HTML 时间中常见的鼠标事件参考:
https://www.runoob.com/tags/ref-eventattributes.html
这里需要用到onmouasemove
构建payload,这里只需要闭合value的双引号即可:
" οnmοusemοve="alert(document.domain)"
7.Stage 7 (限制输入引号的 XSS 注入)
经过测试发现引号也被限制了,用空格代替即可
payload:
123 οnmοusemοve=alert(document.domain)
8.Stage 8 (JavaScript伪协议)
我们输入的字符都会转换为一个链接
看来突破口就在这里了,需要用到JSP伪协议:
就是使用a标签的href来运行javascript的方法
javascript:alert(document.domain)
点击链接即可弹框
9.Stage 9 (UTF-7编码注入)
这种编码可以使其绕过很多过滤规则,不常用,目前浏览器貌似只有IE支持UTF-7编码了
不做总结。
10.Stage 10 (绕过关键字domain)
domain被过滤了,尝试双写绕过
payload:
"><script>alert(document.dodomainmain)</script>
另一种方式采用编码绕过:
Payload:
"><script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='));</script>
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
atob() 方法用于解码使用 base-64 编码的字符串,base-64 编码使用方法是 btoa() 。