零基础玩转bWAPP靶场(十二):Mail Header Injection(SMTP邮件头注入)
摘要邮件头注入Mail Header Injection又称为CRLF注入SMTP场景属于经典的输入安全漏洞。当Web程序直接将用户可控输入拼接至SMTP邮件头部且未过滤换行符\r\n/\n时攻击者可注入自定义邮件头Bcc、Cc、Reply-To实现批量钓鱼邮件、伪造发件人等攻击。本文以bWAPP靶场Mail Header Injection (SMTP)关卡为载体由浅入深讲解漏洞历史背景、底层原理、危害分Low/Medium/High三个安全等级完成源码审计、实战复现针对公网靶机无法向外发送邮件痛点提供openEuler欧拉系统小皮面板Postfix纯内网无公网复现方案同时梳理完整防御手段。一、前言很多新手学习Web漏洞时最先接触SQL注入、XSS但经常忽略一类和邮件系统相关的漏洞邮件头注入。日常网站的「联系我们」「留言反馈」「找回密码邮件」功能底层大多调用邮件接口发送通知。如果开发者忽略输入过滤看似普通的邮箱输入框就能成为黑客发起钓鱼攻击的入口。bWAPP作为经典漏洞教学靶场内置了Mail Header Injection关卡通过三个安全等级展示不同防护力度下漏洞表现。 网上绝大多数教程直接使用公网mailinator临时邮箱复现但是存在两个巨大痛点云服务器25端口常被运营商封禁虚拟机内网环境无法访问外网邮箱邮件投递直接被拒收。本文配套实战环境openEuler欧拉Linux虚拟机小皮面板phpStudybWAPPPostfix本地邮件服务全程内网闭环不依赖任何外网资源。二、漏洞基础知识科普2.1 什么是SMTP协议、邮件头部结构SMTP简单邮件传输协议是互联网发送电子邮件标准协议。一封标准电子邮件分为邮件头部Header和邮件正文Body头部由多行键值对组成换行符CRLF(\r\n)是区分不同头部字段的分隔标志。标准邮件头部示例From: servicedemo.com To: usertest.com Subject: 网站留言通知 ​ 这里是邮件正文内容From发件人To收件人Subject邮件标题Cc抄送Bcc密送当程序允许攻击者插入换行就能跳出原有的From字段新增任意头部。2.2 CRLF与URL编码常识\r 回车CRURL编码%0D\n 换行LFURL编码%0A HTTP传输时浏览器不会自动解析明文换行必须通过URL编码传递PHP接收参数后自动解码还原为换行符号。重点很多新手踩坑直接在表单填写%0A只会被当成普通字符串必须抓包构造请求。2.3 邮件头注入Mail Header Injection定义Web应用获取用户输入直接拼接进mail()函数邮件头部攻击者通过插入换行字符截断原有头部字段新增自定义邮件头操控邮件投递行为。 该漏洞本质属于CRLF注入在SMTP邮件场景下的分支。2.4 漏洞历史背景与真实经典案例邮件头注入漏洞最早在2000年前后被安全研究员披露伴随着PHPmail()函数大规模普及而大量出现。在2005~2015年大量论坛、企业官网留言系统存在该漏洞。真实历史案例1大量企业官网留言系统批量漏洞2012年国内大量中小企业建站模板织梦、PHPCMS早期版本的「在线留言通知管理员」模块存在邮件头注入。黑客批量扫描站点利用漏洞向企业内部员工群发仿冒官方钓鱼邮件窃取员工账号。真实历史案例2开源商城找回密码模块漏洞某开源电商系统早期版本找回密码页面接收用户邮箱未过滤换行。攻击者注入Bcc头部批量向平台注册用户投递伪造「账号异常」钓鱼邮件诱导用户输入账号密码。真实攻击场景推演最常见利用方式某企业官网联系表单留言会发送邮件给管理员admincompany.com。 黑客构造Payload新增Bcc密送所有员工邮箱contacthacker.com%0ABcc:staff1company.com,staff2company.com网站发送邮件时不仅通知管理员同时秘密抄送给所有员工。黑客在留言正文嵌入钓鱼链接实现批量钓鱼。2.5 漏洞会造成哪些危害批量钓鱼攻击新增Bcc密送大量目标邮箱批量投递钓鱼邮件伪造发件人身份覆盖From头部伪装成企业管理员、官方客服发送虚假通知邮件炸弹构造大量收件人消耗邮件服务器资源泄露业务信息结合其他漏洞配合邮件向外转发内部信息。注意邮件头注入不能直接执行系统命令主要风险集中在钓鱼、邮件滥用属于业务逻辑类安全漏洞。三、实验环境搭建3.1 环境清单虚拟机系统openEuler 24.03Web环境小皮面板phpStudy for LinuxPHP7.x靶场程序bWAPP邮件服务Postfix替代bee-box内置sendmail访问方式物理机浏览器访问虚拟机地址http://10.0.0.149:4096环境特点纯内网不访问外网邮件服务器避免mailinator滥用拦截、25端口封禁问题3.2 Postfix部署与配置步骤# 1. 安装服务 dnf install postfix mailx -y # 2. 设置开机自启、启动 systemctl enable postfix systemctl start postfix编辑配置文件/etc/postfix/main.cfmyhostname localhost.localdomain mydomain localdomain myorigin localhost inet_interfaces all mydestination $myhostname, localhost.$mydomain, localhost smtputf8_enable no重启服务systemctl restart postfix3.3 PHP适配打开对应PHP版本php.ini找到sendmail_pathsendmail_path /usr/sbin/sendmail -t -i去掉注释保存重启PHP服务。3.4 创建本地内网收件用户useradd mailrecv passwd mailrecv本地有效邮箱地址mailrecvlocalhost邮件最终保存在/var/spool/mail/mailrecv直接读取文件查看原始邮件头部。3.5 解决bWAPP默认收件人外网问题靶场源码默认收件地址$recipient $smtp_recipient;配置文件内为bwappmailinator.com会尝试向外网投递导致退信。 两种方案直接修改源码将$recipient mailrecvlocalhost;邮件全程内网投递不修改源码利用退信文件/var/spool/mail/root查看原始注入报文。3.6 测试PHP mail()可用性新建mailtest.php放入网站根目录?php $to mailrecvlocalhost; $subject 本地内网测试; $msg 内网邮件测试内容; mail($to,$subject,$msg); echo 发送完成; ?访问页面后执行命令查看邮件cat /var/spool/mail/mailrecv出现完整邮件报文 邮件环境搭建成功。四、源码完整审计4.1 核心代码片段提取// 接收POST提交的邮箱 $email $_POST[email]; // 拼接邮件头部 $status mail($recipient, $subject, $content, From: $email);mail()第四个参数为自定义邮件头部直接拼接用户可控变量$email无过滤时存在注入风险。安全等级分支逻辑if($_COOKIE[security_level] 2) { // HIGH级别调用maili_check_2过滤 $email maili_check_2($_POST[email]); } elseif($_COOKIE[security_level] 1) { // MEDIUM提交时使用email_check_2校验邮箱格式 } else { // LOW级别无任何过滤直接使用输入 $email $_POST[email]; }4.2 过滤函数源码解析// Medium级别邮箱格式校验 function email_check_2($data) { return filter_var($data, FILTER_VALIDATE_EMAIL); } ​ // High级别过滤函数 function maili_check_2($data) { $input urldecode($data); $input filter_var($input, FILTER_SANITIZE_EMAIL); return $input; }FILTER_VALIDATE_EMAIL严格校验标准邮箱格式输入包含换行直接判定邮箱非法FILTER_SANITIZE_EMAIL自动移除换行、空格等非法字符彻底阻断CRLF注入。4.3 页面表单细节差异Low级别表单E-mail输入框为textarea文本域Medium/High为单行input仅仅是前端限制前端限制可被Burp抓包绕过真正防护依靠后端过滤。五、Low安全等级漏洞完全开放5.1 环境准备bWAPP登录账号bee/bug安全等级设置Low访问地址http://10.0.0.149:4096/maili.php5.2 攻击原理推演原始拼接代码From: . $_POST[email]传入Payloadtestlocalhost%0D%0ACc:mailrecvlocalhost拼接后邮件头部变为From: testlocalhost Cc:mailrecvlocalhost%0D%0A就是\r\n解码为回车换行成功新增独立Cc抄送头部。5.3 实战通关步骤重要说明必须Burp抓包禁止浏览器直接提交。由于SMTP协议特性Bcc密送头部会被Postfix等MTA自动清理无法在邮件原始报文中直观观察。 实验优先选用自定义扩展头部X-Hacked作为验证载荷无协议干扰结果一目了然Cc抄送载荷可作为拓展攻击演示。推荐基础验证Payload首选用于判断漏洞是否生效nametestemailtestlocalhost%0D%0AX-Hacked:Injection_Successremarkstestformsubmit拓展载荷1实现抄送Cc头部可在报文内直接查看nametestemailtestlocalhost%0D%0ACc:mailrecvlocalhostremarkstestformsubmit拓展载荷2实现密送Bcc仅原理演示报文无法直接看到Bcc字段nametestemailtestlocalhost%0D%0ABcc:mailrecvlocalhostremarkstestformsubmit操作流程1. 页面随意填写内容点击SendBurp Suite拦截POST请求2. 将数据包内email参数替换为上方任意载荷3. Forward放行请求页面提示Your message has been sent to our master bee!5.4 结果验证cat /var/spool/mail/mailrecv使用X-Hacked载荷邮件头部Header 区域头部与正文空分界线之上独立出现一行X-Hacked:Injection_Success使用Cc载荷邮件头部独立出现一行Cc:mailrecvlocalhost。实验高频迷惑现象Bcc 载荷特殊说明使用 Bcc 载荷进行测试时邮件原始报文内找不到Bcc:mailrecvlocalhost不代表注入失败原理根据 SMTP 协议设计规范MTAPostfix 邮件服务器收到包含 Bcc 密送头部的邮件后会正常向密送地址投递邮件但自动删除邮件报文内部的 Bcc 头部防止收件人查看完整密送名单。 因此教学验证漏洞是否存在不推荐直接使用 Bcc 载荷优先选择X-Hacked自定义头部消除协议干扰。5.5 新手高频踩坑说明很多同学直接在表单输入%0A注入失败 原因浏览器传递原始字符串%0APHP不会自动转义换行只有HTTP传输URL编码服务端自动解码才能生成\n换行。错误示例注入失败From: testlocalhost%0ABcc:mailrecvlocalhost载荷推荐使用标准 CRLF%0D%0A单一%0A仅 LF 换行在部分 Postfix 环境存在不稳定现象。六、Medium安全等级基础防护6.1 防护逻辑Medium级别在表单提交时执行email_check_2()调用filter_var(FILTER_VALIDATE_EMAIL)校验邮箱格式。 如果email参数包含换行字符直接判定邮箱非法页面提示Enter a valid e-mail address!。6.2 能否绕过标准情况下无法绕过。校验发生在后端任何包含换行的输入都会被拦截。 部分老旧PHP版本存在过滤器边界漏洞但当前稳定PHP版本不存在可行绕过Payload。6.3 安全总结仅校验邮箱格式属于基础防护如果开发者代码书写不规范、条件判断出错依然存在风险不能作为最终防御方案。七、High安全等级完整输入净化7.1 防护逻辑High级别启用maili_check_2()执行FILTER_SANITIZE_EMAIL过滤器自动删除所有换行、特殊控制字符。 无论传入%0A、%0D%0A所有换行符号都会被直接清除。且同样如果email参数包含换行字符直接判定邮箱非法页面提示Enter a valid e-mail address!。7.2 对比思考Medium是「校验合法性非法直接拒绝」 High是「主动净化输入移除危险字符」净化类防御稳定性高于格式校验。八、邮件头注入通用防御方案结合bWAPP三个等级的防护效果整理生产环境可用多层防御策略。首选方案禁止用户可控变量直接拼接邮件头部最优方案不要将用户输入直接拼入邮件Header。 区分两种场景仅需要收集用户邮箱展示在正文邮箱只放在邮件Body不参与头部拼接需要回复功能预定义固定头部用户输入仅填充正文。输入过滤与净化代码层面强制移除所有换行字符\r、\n使用成熟过滤函数不要自己手写正则正则极易出现绕过漏洞 PHP示例$email str_replace(array(\r,\n),,$_POST[email]);使用现代邮件类库替代原生mail()函数PHP原生mail()非常容易触发邮件头注入推荐使用PHPMailer、SwiftMailer。 主流邮件类库内置邮件头部净化逻辑自动拦截非法换行从底层规避漏洞。WAF层面防护WAF规则匹配请求参数中%0A、%0D换行编码字符拦截恶意Payload。最小权限原则邮件服务器限制向外批量发送邮件配置发送频率限制降低漏洞被滥用后的危害。九、总结本文从邮件头注入漏洞基础知识入手结合 bWAPP 靶场分等级完成原理剖析与实战复现。该漏洞本质是用户可控输入未过滤换行字符直接拼接至 SMTP 邮件头部攻击者利用 CRLF 换行实现邮件头部篡改。在 bWAPP 三种安全等级下防护效果差异明显Low 等级不存在任何过滤漏洞可直接利用Medium 等级采用邮箱格式校验拦截标准载荷但防护手段单一High 等级主动净化输入、清除换行危险字符能够有效抵御攻击。本次搭建的 openEulerPostfix 内网闭环实验环境避开了公网 25 端口封禁、外网邮箱拦截等常见学习阻碍非常适合虚拟机线下练习。同时实验也给出重要开发安全启示永远不能信任用户输入尽量避免使用 PHP 原生mail()函数切勿将可控参数直接拼接邮件头部、SQL 语句、系统命令等底层指令。最后厘清漏洞攻击边界邮件头注入主要用于批量钓鱼、邮件服务器滥用无法直接获取服务器权限属于典型业务安全漏洞但是在真实互联网业务场景中威胁极高需要开发者重点防范。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。

相关新闻

Tiva C系列μDMA通道控制与映射寄存器实战解析

Tiva C系列μDMA通道控制与映射寄存器实战解析

1. 项目概述与μDMA核心价值在嵌入式系统开发中,尤其是面对Tiva C系列这类高性能ARM Cortex-M微控制器时,如何高效、可靠地处理大量数据搬运任务,是决定系统整体性能与实时性的关键。CPU亲自上阵,通过软件循环来搬运每一个字节&am…

2026/10/17 7:09:48 阅读更多 →
从OneNote到GitHub Flavored Markdown:ConvertOneNote2MarkDown实战案例

从OneNote到GitHub Flavored Markdown:ConvertOneNote2MarkDown实战案例

从OneNote到GitHub Flavored Markdown:ConvertOneNote2MarkDown实战案例 【免费下载链接】ConvertOneNote2MarkDown Ready to make the step to Markdown and saying farewell to your OneNote, EverNote or whatever proprietary note taking tool you are using?…

2026/10/18 0:39:21 阅读更多 →
ASMR下载神器:一键获取asmr.one海量音频资源,打造专属助眠宝库

ASMR下载神器:一键获取asmr.one海量音频资源,打造专属助眠宝库

ASMR下载神器:一键获取asmr.one海量音频资源,打造专属助眠宝库 每天被生活压力困扰的你,是否渴望找到一种简单有效的方式来放松身心?现在,有了这款智能下载工具,你只需动动手指就能拥有asmr.one平台的全部…

2026/10/17 7:13:47 阅读更多 →

最新新闻

folium地图资源本地化指南:彻底解决离线/内网JS/CSS加载失败

folium地图资源本地化指南:彻底解决离线/内网JS/CSS加载失败

简介:面向使用地图可视化组件、希望摆脱远程加载缓慢问题的开发者,这份打包内容包含前端依赖的完整静态文件,包括核心地图库、交互脚本、界面框架、图表字体等资源,以及配套的样式源文件和地图标记图片,共77个文件&…

2026/10/18 1:22:43 阅读更多 →
EmulatorJS 版本选择指南:Stable、Latest、Nightly 三个渠道怎么选对

EmulatorJS 版本选择指南:Stable、Latest、Nightly 三个渠道怎么选对

EmulatorJS 版本选择指南:Stable、Latest、Nightly 三个渠道怎么选对 【免费下载链接】EmulatorJS A web-based frontend for RetroArch 项目地址: https://gitcode.com/GitHub_Trending/em/EmulatorJS 选 EmulatorJS 版本(一个基于网页的 RetroA…

2026/10/18 1:22:43 阅读更多 →
AI接管终端:架构师为何把命令行当成主战场?

AI接管终端:架构师为何把命令行当成主战场?

1. 一个反直觉的现象:越资深,越把终端当主战场1.1 我观察到的"倒挂"最近一段时间,AI编辑器几乎是所有技术社区里最热的话题。智能补全、对话式生成、自动重构,听起来每一招都能把生产力拉满。可我在观察周围团队之后发现…

2026/10/18 1:22:43 阅读更多 →
ComfyUI-LTXVideo 实战上手:用 LTX-2 从文字和图片生成带声音的视频

ComfyUI-LTXVideo 实战上手:用 LTX-2 从文字和图片生成带声音的视频

ComfyUI-LTXVideo 实战上手:用 LTX-2 从文字和图片生成带声音的视频 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo ComfyUI-LTXVideo 是 ComfyUI(节点式…

2026/10/18 1:22:43 阅读更多 →
GLM-4.7-W8A8C8推理调优实战:KV Cache int8量化、202K长上下文与专家路由性能优化技巧

GLM-4.7-W8A8C8推理调优实战:KV Cache int8量化、202K长上下文与专家路由性能优化技巧

【免费下载链接】GLM-4.7-W8A8C8 项目地址: https://ai.gitcode.com/hf_mirrors/vllm-ascend/GLM-4.7-W8A8C8 点击查看 免费下载 GLM-4.7-W8A8C8 是面向 vLLM-Ascend(昇腾 NPU 推理框架)发布的 GLM-4.7 MoE 大模型 int8 量化推理版本&#x…

2026/10/18 1:22:43 阅读更多 →
贴片式组合导航模块:智能汽车高精度定位的量产新范式

贴片式组合导航模块:智能汽车高精度定位的量产新范式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 1:21:43 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →