将任意代码注入Python SimpleXMLRPC服务器
python的python文档中提到: 警告:启用allow_dotterd_names选项允许入侵者访问模块的全局变量,并可能允许入侵者在您的计算机上执行任意代码。仅在安全、封闭的网络上使用此选项 现在,我有了一个具有以下代码的服务器:将任意代码注入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(("
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
的装饰来定义应该可见的内容