11.28 限定某个目录禁止解析php


禁止php解析:防止被上传有害php文件,而被执行,php中可能有危险的函数,如果开放了上传权限,肯定会被上传恶意木马文件,会被拿到服务器权限,root权限,非常危险。

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_禁止

更可以在加上FilesMatch访问限制

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_user_02

检查并重新加载配置文件 -t,graceful


[root@localhost ~]# cd /data/wwwroot/111.com/
[root@localhost 111.com]# mkdir upload
[root@localhost 111.com]# cp 123.php upload/
[root@localhost 111.com]# curl -x127.0.0.1:80 111.com/upload/123.php -I
HTTP/1.1 403 Forbidden
Date: Mon, 05 Mar 2018 14:00:22 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

(已经403了)

先把FilesMatch去除,看下禁止解析php是什么效果

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_user_03

[root@localhost 111.com]# curl -x127.0.0.1:80 111.com/upload/123.php
<?php
echo "123.php";
?>

(根本无法解析,直接返回了php的源代码,并未解析)


而在浏览器中输入111.com/upload/123.php时,文件准备开始下载,说明无法解析

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_user_04


在将配置文件,进一步限制

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_agent_05

再访问111.com/upload/123.php时,被禁止访问

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_禁止 _06





11.29 限制user_agent


user_agent 访问控制的需求背景:网站会受到CC攻击,原理为攻击者通过手段(软件,肉机)让成千上万肉机同时去访问某个站点,站点可能挂掉


CC攻击非常有规律,他们的user_agent非常有规律

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_禁止 _07



上方为条件,下方位规则

OR为或,user_agent匹配上面条件的或下方的条件,比价OR则为并且,但是不可能同时匹配curl和baidu.com

NC 表示忽略大小写   (user_agent中类似于Mozilla就有大小写)

F为forbidden


curl一下111.com/123.php,被禁止

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_agent_08


查看日志,被限制

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_agent_09


为了证明是user_agent限制的,模拟user_agent,可以直接被访问

[root@localhost 111.com]# curl -A "A4L" -x127.0.0.1:80 111.com/123.php
123.php[root@localhost 111.com]# curl -A "A4L" -x127.0.0.1:80 111.com/123.php -I
HTTP/1.1 200 OK
Date: Mon, 05 Mar 2018 14:36:14 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Length: 7
Content-Type: text/html; charset=UTF-8


查看日志信息,可以看到user_agent就是我们指定的

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_禁止 _10


·curl常用配置选项:

-e 指定referer (必须 http:// 开头)

-A 指定user_agent

-x 指定ip,相当于省略了hosts

-I 查看状态码


扩展:CC攻击 https://baike.baidu.com/item/cc%E6%94%BB%E5%87%BB/10959545?fr=aladdin





11.30/11.31 php相关配置


·查看php配置文件位置

方法1:用命令 /usr/local/php/bin/php -i | grep -i "loaded configuration file"


方法2:用phpinfo来查看

编辑index.php,内容为phpinfo

[root@localhost 111.com]# vim index.php

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_user_11

浏览器可访问111.com/index.php,为phpinfo

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_user_12


我们可以看到php配置目录在/usr/local/php7/etc下,但是并没有加载

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_agent_13

既然没有加载,那么可以去源码包中复制

[root@localhost 111.com]# cd /usr/local/src/php-
php-5.6.30/ php-7.1.6/
[root@localhost 111.com]# cd /usr/local/src/php-7.1.6/
[root@localhost php-7.1.6]# cp php.ini-
php.ini-development  php.ini-production
[root@localhost php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini
[root@localhost php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful


重新加载配置后,可以看到php.ini被加载

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_禁止 _14


·配置php.ini:

1,限定disable_fuctions(危险函数)

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_禁止 _15

危险函数:eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close,phpinfo

有些公司也会将phpinfo给禁掉,因为phpinfo会将系统的一些目录暴露给他人,很危险。


配置完成后,查看111.com/index.php,已经被禁掉

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_禁止 _16


2,定义date.timezone(时区)

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_agent_17

时区定为Asia/Shanghai 或者 Asia/Chongqing


3,日志相关

display_errors

display_errors 显示错误信息,如果on,打开的话,那么会把错误信息显示在浏览器上,很可能会暴露目录

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_禁止 _18

那么,设置为off之后,再访问,则会显示白页,那么一切都是未知,不太好找问题所在。

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_user_19

因此,再讲display_errors改为off之后,需要编辑错误日志log_errors


log_errors

1)log_errors:错误日志打开

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_禁止 _20


2)错误日志记录到一个目录去,自行更改

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_agent_21


3)还要定义一个error_log的级别,非常严谨的话,那么只会记录一些严重的错误,一些不太严重的错误则不记录,忽被略掉,我么可以放松一些,级别低一点

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_user_22

生产环境中,一般使用E_ALL & ~E_NOTICE


再次访问,会新生成错误日志

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_user_23

(php errors.log的属主和属组是deamon,而demon是httpd的属主,php errors.log是以httpd进程的身份生成的。)

[root@localhost php-7.1.6]# cat /tmp/php_errors.log
[06-Mar-2018 11:56:52 UTC] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2


我们再模拟一个错误,再/data/wwwroot/111.com/目录下创建2.php,内容如下

[root@localhost php-7.1.6]# vim /data/wwwroot/111.com/2.php

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_agent_24

[root@localhost php-7.1.6]# curl -A "A4L" -x127.0.0.1:80 111.com/2.php
[root@localhost php-7.1.6]# curl -A "A4L" -x127.0.0.1:80 111.com/2.php -I
HTTP/1.0 500 Internal Server Error
Date: Tue, 06 Mar 2018 12:09:39 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Connection: close
Content-Type: text/html; charset=UTF-8
[root@localhost php-7.1.6]# cat /tmp/php_errors.log
[06-Mar-2018 11:56:52 UTC] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[06-Mar-2018 12:09:35 UTC] PHP Parse error:  syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[06-Mar-2018 12:09:39 UTC] PHP Parse error:  syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4

查看日志可以发现,Parse error比之前Warning更严重


4、open_basedir

        比如一个服务器上跑了很多站点,其中一个站点写的漏洞比较多,被人黑了,被人拿到了权限,那么可定会被进一步渗透,进到另一个站点。

        但是如果增加了open_basedir,那么就有可能黑不了

        A网站在A目录,B网站在B目录,即使被黑,那也是黑一个目录,不会连带其他目录被黑

        修改 /usr/local/php7/etc/php.ini  ( : 为分隔符,分割需要限制的多个目录,默认的临时文件在tmp下,所以要带上tmp目录)

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_user_25

        php.ini是针对站所有点做限制,但如果有多个网站运行,多个网站运行在同一个文件夹下,那么等于是没有分开限制。

        

        只有针对站点去做open_basedir才行,php.ini做不到,只有在apache的虚拟主机中定义才行

php_admin_value可以定义php.ini中的参数,如error_log,error_reporting,可以针对不同虚拟主机限制不同的open_basedir


·针对不同虚拟主机限制不同的open_basedir

用php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/“限定目录,而针对多个不同的虚拟主机限制不同的open_basedir,可以用上方第一个虚拟主机来限制

2018-3-7 11周2次课 限定某个目录禁止解析php、限制user_agent、php相关配置_user_26

(为什么要带临时文件?因为默认的临时文件在/tmp/下,这样连临时文件都不给写)



[root@localhost php-7.1.6]# curl -A "A4L" -x127.0.0.1:80 111.com/2.php
123[root@localhost php-7.1.6]#



如有错误,欢迎指正,互相学习,共同进步!