CVE-2021-20873-MovableType XMLRPC 遠程命令執行漏洞分析
漏洞信息
近日看到MovableType爆出多個版本存在遠程命令執行漏洞CVE-2021-20873,影響版本如下:
- Movable Type <= 7 r.5002(V7.8.1)
- Movable Type <= 6.8.2
- Movable Type Advanced 7 <= r.5002
- Movable Type Advanced <= 6.8.2
- Movable Type Premium Advanced <= 1.46
- Movable Type Premium <= 1.46
MovableType分為開源版本和商業版本,開源版本代碼托管在Github中。可以直接下載開源版本進行部署安裝。安裝完畢后訪問登錄頁面為`http://localhost/cgi-bin/mt/mt.cgi`。

也可以通過官方注冊后,下載商業試用版本。
漏洞分析
MovableType基于`PERL+PHP`混合開發,使用PERL調用部分php代碼。首先查看cgi-bin目錄下的CGI文件,不同CGI返回結果,其中mt-xmlrpc.cgi返回411錯誤。

在`mt-xmlprc.cgi`中引用`MT::XMLRPCServer`包。

發送POST請求顯示參數錯誤。

在`XMLRPC.pm->ping_update`方法中找到XML請求類似的報文,返回`testfunc`函數訪問錯誤,說明XML格式初步正常。


跟蹤到`extlib/SOAP/Lite.pm`第2750行,使用`class`和`method_name`定位代碼,成功后執行`eval`調用。在`testfunc`前加上一個`test`類名,提示`Failed to access class test`。


perl的INC變量包含了所有perl module的查找路徑,@INC則為從模塊路徑中查找模塊,通過打印得到@INC列表。
- /var/www/cgi-bin/mt/extlib
- /var/www/cgi-bin/mt/lib
- /usr/local/lib64/perl5
- /usr/local/share/perl5
- /usr/lib64/perl5/vendor_perl
- /usr/share/perl5/vendor_perl
- /usr/lib64/perl5/usr/share/perl5
以`/var/www/cgi-bin/mt/lib/MT.pm`為例,打印出`$VERSION`變量。


繼續搜索 `MT.pm`源代碼,發現`handelr_to_codefef`可調用`eval`執行命令。

執行PERL代碼,但沒有回顯,執行CURL語句示例如下。

最后通過bash命令返回回顯結果。

漏洞修復
在新版本(6.8.3)中,刪除了`XMLRPC`的調用。


最后記得更新`MovableType`到最新版本。