将任意代码注入Python SimpleXMLRPC服务器

将任意代码注入Python SimpleXMLRPC服务器,python,security,simplexmlrpcserver,Python,Security,Simplexmlrpcserver,python的python文档中提到: 警告:启用allow_dotterd_names选项允许入侵者访问模块的全局变量,并可能允许入侵者在您的计算机上执行任意代码。仅在安全、封闭的网络上使用此选项 现在,我有了一个具有以下代码的服务器: from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCRequestHandler server = SimpleXMLRPCServer(("

python的python文档中提到:

警告:启用allow_dotterd_names选项允许入侵者访问模块的全局变量,并可能允许入侵者在您的计算机上执行任意代码。仅在安全、封闭的网络上使用此选项

现在,我有了一个具有以下代码的服务器:

from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler


server = SimpleXMLRPCServer(("localhost", 8000),
                            requestHandler=RequestHandler)
server.register_introspection_functions()

server.register_function(pow)

def adder_function(x,y):
    return x + y
server.register_function(adder_function, 'add')

class MyFuncs:
    def mul(self, x, y):
        return x * y

server.register_instance(MyFuncs(), allow_dotted_names=True)

server.serve_forever()
请解释如何利用该漏洞将任意代码注入服务器?如果我上面的代码不易受攻击,那么请给出一个可以利用的示例以及执行此操作的客户端代码。

MyFuncs().mul
不仅仅是一个可调用函数,它(与所有Python函数一样)是一个具有自己属性的一流对象

除了大量的
\uuuuxxx\uuuuuuuuuuuu
魔术方法(由于SimpleXMLRPCServer阻止对任何以
\uuuuuu
开头的对象的访问,因此无法访问这些方法),还有内部方法成员
im\u class
(指向类对象),
im self
(指向
MyFuncs()
实例)和
im_func
(指向
mul
的函数定义)。该函数对象本身有许多可访问的属性,其中最显著的是
func_globals
,这些属性允许访问包含文件的变量范围字典

因此,通过调用
mul.im\u func.func\u globals.get
,攻击者将能够读取您在脚本中设置的任意全局变量,或者使用字典上的
update()
来更改它们。在上面的示例中,这是不可利用的,因为您在全局变量中没有任何敏感信息。但这可能不是你想要一直保持真实的东西

完整的“执行任意代码”是不太可能的,但您可能会想象一个可写的全局
codeToExecute
变量,该变量稍后会得到
eval
ed,或者有人用
register\u instance
注册整个模块,从而允许访问它导入的所有模块(典型示例:
os
os.system

在Python 3中,由于函数/方法的内部属性被重命名为双下划线版本,因此无法再访问此特定攻击。但通常,“默认打开”并仅基于名称允许外部访问实例上的任何属性似乎不是一个好主意-不能保证没有其他n在下划线上的名称将永远存在于将来,或者属性将不会被添加到这些属性的可访问内置类型(tuple、dict)中,这些属性可能会以某种方式被利用

如果您确实需要嵌套属性访问,那么更安全的做法是开发一个SimpleXMLRPCServer版本,它需要类似于
@rpc\u accessible
的装饰来定义应该可见的内容