访问控制 – 禁止php解析目录概要
<Directory /data/wwwroot/www.123.com/upload>
php_admin_flag engine off
</Directory>
案例
- 假设有一个目录是可以上传图片,但是可能被有心之人上传php上去,因为httpd开放了php模块,所以如果被人上传了木马文件(php类型),httpd就有可能会进行执行,一旦执行,就会让对方获得我们服务器的root权限,或者是被恶意删除或修改一些参数,导致服务器瘫痪或者是被攻击
- 案例:
- 一台服务器,网站被入侵,但不知道是什么原因,不知道怎么入侵的,也不知道入侵到什么程度,只知道他们公司的数据库泄露了,数据是一些电话号码,黑客并没有去删除数据,因为他知道这个服务器的数据库里,电话号码每天都在增长,它就可以源源不断的获得新的电话号码,获得的电话号码可以卖给第三方;
- 分析:
- 把一个没有在这个服务器提交过的电话号码,在这个服务器的网站上提交一次,结果,马上就有人打电话过来,证明,黑客获得电话号码,到打电话给新的用户,这套体系,已经完全自动化了(每天都会去抓取一个新的电话号码来队列,然后马上卖给第三方,第三方马上打电话给这个用户),所以就猜测,网站的程序(php)存在漏洞,另一种可能就是sql注入的漏洞(可以把查询的sql通过一些特殊的提交,提交到服务器上,服务器就会把这个sql语句转换成正常的查询,最终获得一些数据回来);但是sql注入漏洞,很容易修复,只要在网站提交的入口,增加一些特殊符号的过滤,就能完全的阻断sql注入的漏洞。
- 解决方法:
- 首先抓包,监控数据的查询,因为电话号码是通过查询了数据来的,写一个死循环的脚本,每隔一分钟抓一次查询数据,抓完以后生成一个日志文件,
- 查看日志以后,发现有一条sql查询,和网站源生的查询不一样,通过日志定位到了时间点,然后就去web服务器上查看时间点的访问日志,通过日志查看到了一个非常特殊的请求,名字是以php结尾的文件,而且这个php文件是在图片的目录下进行访问的,然后去查看这个php 文件,发现这个文件内容,是获取服务器的权限,相当于在服务器开了一个后门;这个问题产生的根本原因,就是因为上传图片目录并没有禁止解析php
sql注入
- 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1] 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击..
访问控制 – 禁止php解析
- 打开虚拟主机主机配置文件
[root@hf-01 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
把代码放入到配置文件中
<Directory /data/wwwroot/111.com/upload>
##把upload目录下所有的php禁止解析
php_admin_flag engine off //禁止解析php
<FilesMatch (.*)\.php(.*)> //现在这里所有访问php都会是403
##这里的 .用\脱义
Order allow,deny //如果不做这个deny,就会直接访问到源代码,这样就不太友好
Deny from all
</FilesMatch>
然后保存退出
- 检查配置文件是否存在语法错误,并重新配置文件
[root@hf-01 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@hf-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@hf-01 111.com]#
- 创建upload目录,新建php文件
[root@hf-01 111.com]# mkdir upload
[root@hf-01 111.com]# ls
123.php admin index.php QQ111.jpg upload
[root@hf-01 111.com]# cp 123.php upload/
[root@hf-01 111.com]#
- curl访问
[root@hf-01 111.com]# curl -x127.0.0.1:80 '111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 26 Dec 2017 16:09:43 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
[root@hf-01 111.com]#
- 这时在去虚拟主机配置文件中注释掉FilesMatch
[root@hf-01 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<Directory /data/wwwroot/111.com/upload>
##把upload目录下所有的php禁止解析
php_admin_flag engine off
#<FilesMatch (.*)\.php(.*)>
##这里的 .用\脱义
#Order allow,deny
#Deny from all
#</FilesMatch>
</Directory>
然后保存退出
- 检查配置文件是否存在语法错误,并重新配置文件
[root@hf-01 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@hf-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@hf-01 111.com]#
- 这时候访问php,会发现无法解析php
[root@hf-01 111.com]# !curl
curl -x127.0.0.1:80 '111.com/upload/123.php'
<?php
echo "123.php";
[root@hf-01 111.com]#
- 在浏览器中访问http://111.com/upload/123.php,会提示直接下载,这是因为无法解析php
- 这时候再打开虚拟主机配置文件,取消FilesMatch注释
<Directory /data/wwwroot/111.com/upload>
##把upload目录下所有的php禁止解析
php_admin_flag engine off
<FilesMatch (.*)\.php(.*)>
##这里的 .用\脱义
Order allow,deny
Deny from all
</FilesMatch>
</Directory>
- 检查配置文件是否存在语法错误,并重新配置文件
[root@hf-01 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@hf-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@hf-01 111.com]#
- 这时再去浏览器访问php,会直接显示Forbidden
- 即使去访问一个不存在的php文件,也会显示显示Forbidden
总结
- 禁止php解析操作,其实就是为了服务器更加安全,特别是针对可以写的目录
- 可写的目录,一般是不需要解析php,这个需要牢记,一般静态文件存放的目录是不允许解析php 的