Task 1: Experimenting with Bash Function( 二 )


2,从Web访问此CGI程序,可以使用浏览器通过键入以下URL:,或使用以下命令行程序curl做同样的事情:
$ curl http://localhost/cgi-bin/myprog.cgi
我们从同一台计算机上运行Web服务器和攻击 。
我们使用curl程序来从攻击者的机器上访问该cgi程序,curl程序用来发送http请求到服务器端的cgi程序 。如结果所示,我们利用漏洞成功从攻击者的机器上访问了服务器中的cgi程序 。
Task 3:Data to Bash via
要在基于Bash的CGI程序中利用漏洞,攻击者需要将其数据传递给易受攻击的Bash程序,并且数据需要通过环境变量进行传递 。在这项任务中,我们需要看看我们如何实现这个目标 。您可以使用以下CGI程序来证明您可以发送任意字符串到CGI程序,该字符串将显示在环境变量 。
在上面的代码中,第①行打印出当前进程中所有环境变量的内容 。如果实验成功,您应该可以在从中返回的页面中看到数据字符串服务器 。在您的报告中,请说明远程用户的数据如何进入这些环境变量 。
实验步骤如下:
1,利用root权限修改文件.cgi(只有root权限下才能修改这个文件夹的内容) 。将下面的内容放在程序中,最后一行的指令
“/proc/$$/”能打印出一个进程的所有环境变量 。
2,现在通过curl来访问该CGI程序,使用“-v”选项,curl会打印出HTTP请求和来自服务器的响应:
上面标记的HTTP请求头中的User -Agent字段中,该字段的目的是向服务器提供一些客户端浏览器的信息、它可以帮助服务器根据不同浏览器类型对网页内容的显示方式进行优化 。从上面的例子中可以看出,该字段表明客户端是curl 。如果通过浏览器访问同样的URL,该字段会包含一个不同的值,说明客户端是.显然,该字段是由客户端设置的 。
在Web服务器的响应中,CGI 程序将打印出CGI进程的所有环境变量 。其中一个环境变量是,它的值和User-Agent字段一模一样 。可知服务器从HTTP请求头中获得User-Agent信息,并将它赋值给一个名为的环境变量 。
因此可以知道远程用户的数据如何进入这些环境变量:当服务器创建一个子进程执行Bash(使用exec()函数)时,它会为Bash进程提供环境变量 。父进程(网络服务进程)将环境变量传递给子进程(bash进程) 。将该环境变量转化为自己的shell变量,而如果发现一个以一对圆括号开始的环境变量时,将其转化为shell函数 。服务器创建一个子进程执行CGI程序时,它会传递该变量以及其他一些环境变量给CGI程序 。
Task 4:the
设置完上述CGI程序之后,我们现在可以启动攻击 。攻击不取决于CGI程序中的内容,因为它针对的是Bash程序,该程序在CGI之前先被调用脚本已执行 。您的目标是通过URL http:///cgi-bin/发起攻击.cgi,这样您就可以实现远程用户无法完成的任务 。在此任务中,您应证明以下内容:
① 使用攻击从服务器窃取机密文件的内容 。
1,例如可以从下面这个文件获得密码:/var/www/CSRF/Elgg/elgg- /.php 。一旦获得了密码,就可以直接登录数据库,盗取或者改动信息 。使用命令行工具curl,该命令的“-A”的选项可以用来设置请求的User-Agent字段 。下面的命令演示了如何通过攻击读取服务器的机密文件 。
当一个Web应用连接后台数据库(例如MySQL)时,它需要提供登录密码,这些密码通常是直接写在程序中的,或者存储在配置文件中,远程用户无法读取这些密码,但是如果让服务器运行指令,就可以获得这些密码 。虚拟机中的Web服务器运行了几个Web应用,它们中的大多数都是使用数据库的 。