在documentation用于 JSON 序列化和反序列化的 Python 的 jsonpickle 模块的说明
Loading a JSON string from an untrusted source represents a potential security vulnerability. jsonpickle makes no attempt to sanitize the input
但我想知道攻击者如何通过 JSON 消息执行任意代码?
此外,按照文档中的建议清理输入的最佳方法是什么?我的应用程序中的 JSON 数据不可信(它来自发送 JSON 消息的客户端)。
最佳答案
jsonpickle
不是 JSON。 jsonpickle
允许创建可能造成有害影响的任意 Python 对象。清理意味着 JSON 对象仅包含可以由 jsonpickle
解释的数据。通常错误的数据会导致异常,但可用于触发不需要的行为。
__reduce__
利用(参见,例如 Into The Jar | Exploitation of jsonpickle)
jsonpickle.decode('{"py/object": "list", "py/reduce":[{"py/type": "subprocess.Popen"}, ["ls"], null, null, null]}')
只是执行任何命令的一种直接方式。更微妙的方式取决于您的实际代码。
所以简短的回答是,不要在不受信任的环境中使用 jsonpickle
。使用普通 JSON 并在使用前检查输入。
关于python - 如何通过 JSON 执行任意代码以及如何清理输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38812106/