[ByteCTF2020]WP兼个人笔记总结

前言

这是我第一次参加的比赛,两天时间一道题都没做出来,害有点小难受,希望能够将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截断比较

猜你喜欢

转载自blog.csdn.net/solitudi/article/details/109372670
今日推荐