Vellichor1966 2024-10-18 19:13 采纳率: 0%
浏览 75
已结题

一道ban了很多东西的pyjail题

要求就是就是绕过黑名单往web里发请求 用eval函数执行代码来拿到flag.txt
网站的py脚本:

BLACKLIST = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_=<>[]{}!@#$&|?\'"\\.'

def calc_(expression: str) -> str:
    try:
        result = eval(expression)
        if type(result) == bytes:
            result = result.decode()
        return result
    except:
        import traceback
        traceback.print_exc()
        return '无法计算,滚'


if __name__ == '__main__':
    from flask import Flask, jsonify, request, render_template
    from flask_cors import CORS, cross_origin

    app = Flask(__name__)
    cors = CORS(app)
    SECRET_LOCATION = '/chall/secret.txt'
    
    original_flag = open(SECRET_LOCATION).read().strip()
    print(original_flag)

    import os
    new_flag = os.environ.get('GZCTF_FLAG', original_flag)
    print(new_flag)

    open(SECRET_LOCATION, 'w').write(new_flag)

    from multiprocessing import Pool, TimeoutError

    def calc_dispatch(expression: str) -> str:
        for i in expression:
                if i in BLACKLIST:
                    return '黑客能不能爬'
        exe = calc_
        pool = Pool(processes=1)
        res = pool.apply_async(exe, kwds={'expression': expression})
        try:
            result = res.get(timeout=5)
        except TimeoutError:
            pool.terminate()
            pool.close()
            return '有人在瞎几把占用资源,举报了'
        result = str(result).strip()
        if result:
            return result
        else:
            return '无法计算,滚'

    @app.route('/calc', methods=['POST'])
    @cross_origin()
    def calc():
        expression = request.get_json()['expression']
        if expression.strip():
            return jsonify(result=calc_dispatch(expression))
        else:
            return jsonify(result='无法计算,滚')
        
    @app.route('/lk0.mp3', methods=['GET'])
    def lk0():
        return open('/lk0.mp3', 'rb').read()


    @app.route('/', methods=['GET'])
    def home():
        return render_template('frontend.html')

    app.run(host='0.0.0.0', port=1338)

img


几乎把加减乘除数字以外的全ban了 没思路 请求内容到底怎么发

  • 写回答

14条回答 默认 最新

  • 专家-司宇[在线] 2024-10-18 19:13
    关注

    以下回复引自免费微信小程序:皆我百晓生。 如问题解决,还请采纳。如仍有疑问,请回复留言或私信博主,以便获得更精准的帮助。

    这个问题可以通过使用PYTHON的JSON库解析并生成一个JSON文件,然后利用EVAL函数执行这些内容来获取到FLAG.TXT网站的PY脚本。以下是一个可能的解决方案:

    IMPORT JSON
    IMPORT RE
    
    # 解析FLAG.TXT文件
    WITH OPEN('FLAG.TXT', 'R') AS F:
        FLAG_TEXT = F.READ().REPLACE('\N', '')
    
    # 使用RE模块替换所有非字母字符为空格
    FLAG_TEXT = RE.SUB(R'[^A-ZA-Z]', ' ', FLAG_TEXT)
    
    # 将FLAG.TXT中的内容转换为字符串
    FLAG_STR = FLAG_TEXT.REPLACE('-', '').REPLACE('_', '')
    PRINT(FLAG_STR)
    

    在这个解决方案中,我们首先使用OPEN()函数打开FLAG.TXT文件,并读取其内容。然后,我们使用正则表达式RE.SUB()将所有的非字母字符(包括空格)替换为空格。最后,我们将结果存储在一个字符串变量中,并将其打印出来。

    请注意,这个解决方案需要你有权限访问FLAG.TXT文件,因为它是用于测试和验证你的解决方案的一个例子。在实际应用中,你需要确保你的环境允许访问和操作文件。

    另外,这个解决方案只是一个基本的例子,它没有考虑安全性和隐私性。如果你正在处理敏感数据或进行敏感操作,你应该采取更安全的方法,例如使用HTTPS、SSL证书等。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月19日
  • 创建了问题 10月18日