目录
Apache解析漏洞
目前解析漏洞主要存在于三大WEB服务程序,分别是IIS、NGINX和APACHE。
IIS6.0下主要是有两个解析漏洞,一个是目录解析,形如/xx.asp/xx.jpg,另一个就是文件解析,形如xx.asp;.jpg,可通过此漏洞上传shell,对服务器危害较大。
Apache解析漏洞。这个实验也是测试的这个漏洞。环境是php+apache
Apache是从右到左开始判断解析,如果为不可识别解析,就再往左判断。比如xxx.php.rar对apache来说rar是不可解析的,所以就会解析成xxx.php。具体见实验步骤。
通过简单上传页面证明apache解析漏洞
登录客户机,用浏览器打开,这是根目录下的upload目录,也是要上传的文件目录,现在是空的
然后再打开http://10.1.1.31/upload.html,这就是上传页面
现在开始测试。在客户机中新建一个test.php.rar内容是<?php phpinfo();?>然后上传
看看是否上传成功。访问一下试试
Apache并不认识rar后缀名,对它来说会看成test.php。解析成功。其实整个漏洞的关键就是apache的"合法后缀"到底是哪些,不是"合法后缀"的都可以被利用。
通过修改apache配置文件进行防御
由上面可知,在http://10.1.1.31/upload/下已经成功上传了test.php.rar,并且可错误解析成php。
现在对apache的配置文件做适当修改,在文件中添加下面几行代码
禁止*.php.*文件的访问权限
保存并重启apache。现在再来测试
目录下也看不到了
通过修改程序文件来修改漏洞
访问另一個地址,这是经过代码加强过后的上传页面
再次上传test.php.rar
看看后端代码
其实就是增加了这个验证文件类型的代码,这种防御也有缺点,并非不可绕过。就比如bp的抓包就可以改類型還是比較好繞過的。
Fastcgi安全
(Fast Common Gateway Interface/FastCGI)快速通用网关接口是一种让交互程序与Web服务器通信的协议,FastCGI致力于减少网页服务器与CGI程式之间互动的开销,从而使服务器可以同时处理更多的网页请求。
简单的来说下Nginx+FastCGI运行原理,FastCGI默认监听的是127.0.0.1:9000,是Nginx和动态脚本程序的桥梁。用户打开浏览器,发送请求来到了Nginx,Nginx即将请求发送到后端的FastCGI接口,FastCGI接口将请求发给FastCGI,FastCGI再将请求交给脚本解释程序执行,然后原路返回给Nginx,Nginx将结果交给客户端,大致就是这么一个过程。
Nginx是通过套接字文件socket来将动态请求发送给wrapper,使用的是Tcp协议。wrapper通过CGI接口来接受请求。这样web服务器和解释程序之间完全可以独立开发,这样避免了解释程序直接调用服务器的接口而导致的出错和崩溃以及安全性问题。而且可以使Nginx专心处理静态页面请求和转发动态请求,而将脚本解释器安装在另一台服务器,使服务器的压力得到分摊。
实验环境:
Linux01 ip: 10.1.1.76 (Nginx+FastCGI+PHP)
Linux02 ip: 10.1.1.243
登录Linux02机器(ip地址为10.1.1.243),漏洞利用脚本的使用。
对目标机器Linux01进行端口扫描
使用漏洞利用脚本,对目标机器进行测试。(读取passwd文件)
一起来看配置文件
两个关键配置文件的路径:
/u/nginx/conf/nginx.conf
/u/php5/etc/php-fpm.conf
圈起部分为关键,也是我要介绍的,这里其实就是fastcgi监听的ip和端口。
我这里配置的是本地,也可以是远程,也可以有多个用来做负载均衡。
再来看下php-fpm.conf这个文件吧,这个文件,我只介绍两个参数:
listen = 127.0.0.1:9000
; List of ipv4 addresses of FastCGI clients which are allowed to connect.
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
; must be separated by a comma. If this value is left blank, connections will be
; accepted from any ip address.
; Default Value: any
; listen.allowed_clients = 127.0.0.1
上面我截取了两段配置文件,第一个“listen = 127.0.0.1:9000”,表示的是监听的ip和端口,第二个其实很重要的,它fastcgi的安全机制,默认是允许所有的ip连接。其实我们这个只要设置nginx的ip就好了,只让nginx过来的请求接入就安全了。