环境搭建
配置方法
安装docker
yum -y install docker
启动docker
systemctl start docker
使用docker拉取ubuntu:14.04.5镜像
docker pull ubuntu:14.04.5
使用docker启动镜像 ubuntu:14.04.5
docker run -d -it -p 本机端口:80 ubuntu:14.04.5
查看已开启的镜像
docker ps
进入Ubuntu镜像
docker exec -it 【镜像名称】 /bin/bash
安装相关环境
apt-get update # 更新源
apt-get install vim # 安装vim
apt-get install nginx # 安装nginx
service nginx start # 启动nginx服务
apt-get install php5-fpm # 安装php5-fp
配置方法
刚装好的Nginx是不能解析php的,需要修改配置文件:
/etc/nginx/sites-available/default
Nginx的两种启动方式
- 第五行如果打开,就是使用tcp方式启动,php-fpm将会本地监听9000端口。
- 如果倒数第三行打开,则是使用套接字方式启动
启动web服务
/etc/init.d/php5-fpm start
然后到web目录中写一个测试的php文件,重启nginx服务。
尝试访问,如果可以解析,则环境配置成功。
相关目录
/usr/share/nginx/html # 默认web目录
/etc/nginx/ # 配置文件目录
/etc/php5/fpm #php配置文件目录
/var/log/nginx/access.log #访问日志
/var/log/nginx/error.log# 错误日志
原理
- 对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php 进行解析攻击。
- 对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。
- Nginx下,请求文件/shell.gif时在后面加个*.php,即/shell.gif/1.php,可能会被当作PHP代码执行。
- 和Apache一样,Nginx也是通过mime.types识别文件。
- 文件在/etc/nginx/mime.types
创建一个1.jpg,然后访问1.jpg/1.php.
显示:"Access denied.“
Nginx拿到文件路径/1.jpg/1.php后,一看后缀是.php,便认为该文件是php文件,转交给php去处理。php一看/1.jpg/1.php不存在,便删去最后的/1.php,又看/1.jpg存在,便把/1.jpg当成要执行的文件了,又因为后缀为.jpg,php认为这不是php文件,于是返回“Access denied.”
cgi.fix_pathinfo,该值默认为1,表示开启。
用途:对文件路径进行“修理”
当php遇到文件路径“/aaa.xxx/bbb.yyy/ccc.zzz" 时,若"/aaa.xxx/bbb.yyy/ccc.zzz" 不存在,则会去掉最后的“/ccc.zzz”,然后判断"/aaa.xxx/bbb.yyy”是否存在,若存在,则把“/aaa.xxx/bbb.yyy”当做文件“/aaa.xxx/bbb.yyy/ccc.zzz”,若“/aaa.xxx/bbb.yyy”仍不存在,则继续去掉“/bbb.yyy”,以此类推
配置
cgi.fixpathinfo这个配置在php.ini 中可以修改,默认是开启的
/etc/php5/fpm/php.ini
默认是1,不需要修改
配置/etc/php5/fpm/pool.d/www.conf中的limit_extensions允许解析其他的格式文件
再次访问1.jpg/1.php
文件解析漏洞修复方法
- 将php.ini文件中的cgi.fix_pathinfo的值设为0。这样php在解析1.jpg/1.php这样的目录时,只要1.php不存在就会显示404。
- 将/etc/php5/fpm/pool.d/www.conf中security.limit_extensions后面的值设为.php。