引言
这几天有个 GACTF,本来这几天有点事情没打算来看的,结果队里师傅突然扔来个代码,还以为是帮 debug,后来才发现是个 CTF 题目。。(坏耶
于是随意来看看题目了,就佛系做了几个题嘤嘤嘤,顺便来学点东西就是了。
Misc
crymisc
8.25 is Chinese Valentine’s Day.Yesterday my brother told me he was refused by a beautiful girl.He was sooooooooooooo sad and bursted into tears.
链接:https://pan.baidu.com/s/1EZzhnAa5Q4OD8y-YEAcjzQ
提取码:866h
https://drive.google.com/drive/folders/1gDfMBrtqwvi7f9BaB1ixjogeLDascjED?usp=sharing
下载下来一个 crymisc.docx
,一看打不开果然改成 zip,发现有伪加密。
1.txt
内容为:
I'm going to tell her how i feel.DO YOU WANT TO KNOW WHAT I TOLD HER?
另外是一张图片,发现结尾有东西,至少有个压缩包。
提取出来。
SSB3YXMgcmVqZWN0ZWQuLi4uLi5USElTIElTIFRIRSBQQVNTV09SRDpJIFdhbm5hIENyeXl5ISEh
首先对上面这段 base64,得到压缩包密码。
I was rejected......THIS IS THE PASSWORD:I Wanna Cryyy!!!
压缩包需要先补上文件头,即变成 504B0304…
拿密码去解压,文件内容如下。
🔭💙🐰✊🌻🐧💙😘🌻🍶💐🍌🏊🍩🚁🏊👹🐶😀🐶😀😘👹💙🍂💇😀😀😩🌻🍟👂🍶💐🍌🏊🍩👆🏠🙇🍂🍂👼😱🚔🐶👉✊😱🏠🙇🍂🍂👼😱🚊😧💨💙💕
That is what i told her↑↑↑
什么,您就是抽象带师?
想起来在 BJD3rd 里 TaQini 师傅就出过一题,就是 Manual 这题的一部分。
参考那题的思路,盲猜就是 Codemoji 了!根据提示key应该就是个哭的表情吧,就😭这个了。
P.S.: codemoji GitHub repo (Mozilla Public License 2.0)
好耶,咱也部署一个!
就在这里了!-> https://codemoji.miaotony.xyz
欢迎来玩呀(
于是构造 payload 如下:
{"message":"🔭💙🐰✊🌻🐧💙😘🌻🍶💐🍌🏊🍩🚁🏊👹🐶😀🐶😀😘👹💙🍂💇😀😀😩🌻🍟👂🍶💐🍌🏊🍩👆🏠🙇🍂🍂👼😱🚔🐶👉✊😱🏠🙇🍂🍂👼😱🚊😧💨💙💕","key":"😭"}
base64encode + URLencode:
eyJtZXNzYWdlIjoi8J%2BUrfCfkpnwn5Cw4pyK8J%2BMu%2FCfkKfwn5KZ8J%2BYmPCfjLvwn4228J%2BSkPCfjYzwn4%2BK8J%2BNqfCfmoHwn4%2BK8J%2BRufCfkLbwn5iA8J%2BQtvCfmIDwn5iY8J%2BRufCfkpnwn42C8J%2BSh%2FCfmIDwn5iA8J%2BYqfCfjLvwn42f8J%2BRgvCfjbbwn5KQ8J%2BNjPCfj4rwn42p8J%2BRhvCfj6Dwn5mH8J%2BNgvCfjYLwn5G88J%2BYsfCfmpTwn5C28J%2BRieKcivCfmLHwn4%2Bg8J%2BZh%2FCfjYLwn42C8J%2BRvPCfmLHwn5qK8J%2BYp%2FCfkqjwn5KZ8J%2BSlSIsImtleSI6IvCfmK0ifQ%3D%3D
而后丢去解密。
得到flag。
WelcometoGACTF!ThisisthepasswordGACTF{H4ppy_Mi5c_H4ppy_L1fe}
Web
simpleflask
题目每10分钟重启,如遇到无法连接,请稍等片刻10秒左右会全部重启完毕
This topic restart every 10 minitues. If you can’t connect, please wait for a while and the restart will be completed. Do not panicChina:
124.70.153.63 80-89
Overseas:
149.28.80.82 80-89
POST 访问,提示 request.form["name"]
。
带上参数 name
,尝试 SSTI,发现有戏。
某次利用报错看到了部分源码。
除了过滤了flag
,在这个check
函数里还过滤了许多,尝试发现,包括但不限于 os, system, pwd, popen, eval, import, request, mro, '
, %
, +
, ,
,
(空格), |
, \x
等等关键字或符号都被滤掉了……
单引号不行,但双引号可行,发现利用 "op""en"
的形式拼接字符串可行。
本来想找 PIN 的,但试了试所需的信息整不来(好菜啊),可以参考 Flask debug pin安全问题 这一篇文章。
于是又整了半天绕过……
首先拿到 object
。
一顿操作拿到 __builtins__
。
发现chr
之类的函数并没有,然而并不能用 {% xxx %}
来设置就很难受。
本来想用 os.popen
这一模块来执行命令读取信息的,但不知道为啥read()
就被拦了。
最后问了队里大师傅,发现换成open
就完事了,太草了!
Payload:
name={{[].__class__.__bases__[0].__subclasses__()[127].__init__.__globals__.__builtins__["op""en"]("/fl""ag").read()}}
GACTF{fac9165b6a2b5ac8bd3b99fad0619366}
后面再整理一下 flask 的 SSTI 常用 payload 及绕过技巧吧(
大概率会咕咕咕(
EZFLASK
flask&flask
China:
124.70.206.91 10000-10009
Overseas:
149.28.226.175 10000-10009
# -*- coding: utf-8 -*-
from flask import Flask, request
import requests
from waf import *
import time
app = Flask(__name__)
@app.route('/ctfhint')
def ctf():
hint =xxxx # hints
trick = xxxx # trick
return trick
@app.route('/')
def index():
# app.txt
@app.route('/eval', methods=["POST"])
def my_eval():
# post eval
@app.route(xxxxxx, methods=["POST"]) # Secret
def admin():
# admin requests
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8080)
他这个 flask 服务器为 Werkzeug/1.0.1 Python/2.7.18。
访问 /ctfhint
,得到
too young too simple
POST /eval
post eval
没找到哪里能用?
admin
没找到 route 在哪,并不知道怎么用 emmm。
(等复现嘤嘤嘤
大概就这么多,开学了喵呜~
(溜了溜了