在用于
JSON序列化和反序列化的
Python的jsonpickle模块的
documentation中,它指出了这一点
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并在使用之前检查输入.