章节大纲

  • 要利用 Shellshock 漏洞,攻击者需要将数据传递给有漏洞的 bash 程序,而且这些数据必须要通过 环境变量传递。在这个任务中,我们看看如何实现这一目标。我们在服务器上提供了另一个 CGI 程序(getenv.cgi)来帮助你识别哪些用户数据可以进入 CGI 程序的环境变量。该 CGI 程序会打印出它的所有环境变量。

    #!/bin/bash_shellshock             
    
    echo "Content-type: text/plain"
    echo
    echo "****** Environment Variables ******"
    strings /proc/$$/environ               ①
      • 在上面的代码中,① 打印出当前进程中所有环境变量的内容。通常,如果你使用浏览器访问 CGI 程序,你会看到类似以下的内容。请识别哪些环境变量的值是由浏览器设置的。你可以开启浏览器的 HTTP Header Live 扩展来捕获 HTTP 请求,并将请求与服务器打印出的环境变量进行对比。请将你的调查结果写在实验报告中。
        ****** Environment Variables ******
        HTTP_HOST=www.seed-server.com
        HTTP_USER_AGENT=Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0) ...
        HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9, ...
        HTTP_ACCEPT_LANGUAGE=en-US,en;q=0.5
        HTTP_ACCEPT_ENCODING=gzip, deflate
        ...
      • 如果我们想将环境变量数据设置为任意值,就必须修改浏览器的行为,这样做会很复杂。幸运的是,有一个命令行工具叫做 curl,它允许用户控制 HTTP 请求中的大部分字段。这里是一些有用的选项:

        1. -v 选项可以打印出 HTTP 请求的头部;
        2. -A、-e 和 -H 选项可以设置 HTTP 请求头部中的一些字段

        你需要弄清楚每个字段的作用。请在实验报告中记录你的发现。以下是如何使用这些字段的示例:

        $ curl -v www.seed-server.com/cgi-bin/getenv.cgi
        $ curl -A "my data" -v www.seed-server.com/cgi-bin/getenv.cgi
        $ curl -e "my data" -v www.seed-server.com/cgi-bin/getenv.cgi
        $ curl -H "AAAAAA: BBBBBB" -v www.seed-server.com/cgi-bin/getenv.cgi
        根据本实验,请描述 curl 的哪些选项可以用于将数据注入到目标 CGI 程序的环境变量中。