2013-03-17 29 views
3

在蟒蛇SimpleXMLRPC Server的python文檔,它提到:注入任意代碼轉換爲Python SimpleXMLRPC服務器

警告啓用allow_dotted_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() 

請解釋漏洞如何被利用來注入任意代碼到服務器上?如果我的上面的代碼不易受到攻擊,那麼請舉例說明可以被利用的代碼和客戶端代碼。

回答

0

MyFuncs().mul不僅僅是一個可調用的函數,它是(像所有的Python函數一樣)具有自己屬性的第一類對象。

除此之外的__xxx__魔術方法(你不能訪問,因爲SimpleXMLRPCServer阻止訪問與_開始任何東西)的負載,也有內部的成員方法im_class(指向類對象),im_self(指着MyFuncs()實例)和im_func(指向mul的函數定義)。該函數對象本身具有許多可訪問的屬性 - 最值得注意的包括func_globals,它允許訪問包含文件的變量範圍字典。

因此,通過調用mul.im_func.func_globals.get攻擊者將能夠讀取您在腳本中設置的任意全局變量,或使用字典上的update()來更改它們。在上面的例子中,這是不可利用的,因爲你對全局變量沒有任何敏感。但這可能不是你想要依賴的東西,而是始終保持真實。

全部「執行任意代碼」是件不可思議的事,但你可能想象寫的全局codeToExecute變量得到eval ED後,例如,或者是有人註冊一個整體模塊register_instance,允許所有進口了可訪問模塊(典型示例:osos.system)。

在Python 3中,這種特定的攻擊不再可達,因爲函數/方法的內部屬性被重命名爲雙下劃線版本,在那裏它們被阻塞。但總的來說,'默認打開'並允許外部訪問基於名稱的實例上的任何屬性似乎是個不錯的主意 - 不能保證將來不會存在其他非下劃線名稱,或者該屬性將不會被添加到可以以某種方式利用的那些屬性的可訪問內置類型(元組,字典)中。

如果你確實需要嵌套的屬性訪問,那麼想出一個SimpleXMLRPCServer的版本似乎更安全,它需要類似@rpc_accessible修飾來定義應該看到的內容。