2018-3-7 11周2次课 限定某个目录禁止解析php限制user_agentphp相关配置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018-3-7 11周2次课 限定某个目录禁止解析php限制user_agentphp相关配置相关的知识,希望对你有一定的参考价值。
11.28 限定某个目录禁止解析php
禁止php解析:防止被上传有害php文件,而被执行,php中可能有危险的函数,如果开放了上传权限,肯定会被上传恶意木马文件,会被拿到服务器权限,root权限,非常危险。
更可以在加上FilesMatch访问限制
检查并重新加载配置文件 -t,graceful
[[email protected] ~]# cd /data/wwwroot/111.com/ [[email protected] 111.com]# mkdir upload [[email protected] 111.com]# cp 123.php upload/ [[email protected] 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是什么效果
[[email protected] 111.com]# curl -x127.0.0.1:80 111.com/upload/123.php <?php echo "123.php"; ?>
(根本无法解析,直接返回了php的源代码,并未解析)
而在浏览器中输入111.com/upload/123.php时,文件准备开始下载,说明无法解析
在将配置文件,进一步限制
再访问111.com/upload/123.php时,被禁止访问
11.29 限制user_agent
user_agent 访问控制的需求背景:网站会受到CC攻击,原理为攻击者通过手段(软件,肉机)让成千上万肉机同时去访问某个站点,站点可能挂掉
CC攻击非常有规律,他们的user_agent非常有规律
上方为条件,下方位规则
OR为或,user_agent匹配上面条件的或下方的条件,比价OR则为并且,但是不可能同时匹配curl和baidu.com
NC 表示忽略大小写 (user_agent中类似于Mozilla就有大小写)
F为forbidden
curl一下111.com/123.php,被禁止
查看日志,被限制
为了证明是user_agent限制的,模拟user_agent,可以直接被访问
[[email protected] 111.com]# curl -A "A4L" -x127.0.0.1:80 111.com/123.php 123.php[[email protected] 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就是我们指定的
·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配置文件位置
/usr/local/php/bin/php -i|grep -i "loaded configuration file"
[[email protected] php-7.1.6]# /usr/local/php/bin/php -i|grep -i "loaded configuration file" PHP Warning: Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date. timezone to select your timezone. in Unknown on line 0 Loaded Configuration File => /usr/local/php/etc/php.ini
编辑index.php,内容为phpinfo
[[email protected] 111.com]# vim index.php
浏览器可访问111.com/index.php,为phpinfo
我们可以看到php配置目录在/usr/local/php7/etc下,但是并没有加载
既然没有加载,那么可以去源码包中复制
[[email protected] 111.com]# cd /usr/local/src/php- php-5.6.30/ php-7.1.6/ [[email protected]localhost 111.com]# cd /usr/local/src/php-7.1.6/ [[email protected] php-7.1.6]# cp php.ini- php.ini-development php.ini-production [[email protected] php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini [[email protected] php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
重新加载配置后,可以看到php.ini被加载
·配置php.ini:
1,限定disable_fuctions(危险函数)
危险函数: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,已经被禁掉
2,定义date.timezone(时区)
时区定为Asia/Shanghai 或者 Asia/Chongqing
3,日志相关
display_errors
display_errors 显示错误信息,如果on,打开的话,那么会把错误信息显示在浏览器上,很可能会暴露目录
那么,设置为off之后,再访问,则会显示白页,那么一切都是未知,不太好找问题所在。
因此,再讲display_errors改为off之后,需要编辑错误日志log_errors
log_errors
1)log_errors:错误日志打开
2)错误日志记录到一个目录去,自行更改
3)还要定义一个error_log的级别,非常严谨的话,那么只会记录一些严重的错误,一些不太严重的错误则不记录,忽被略掉,我么可以放松一些,级别低一点
生产环境中,一般使用E_ALL & ~E_NOTICE
再次访问,会新生成错误日志
(php errors.log的属主和属组是deamon,而demon是httpd的属主,php errors.log是以httpd进程的身份生成的。)
[[email protected] 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,内容如下
[[email protected] php-7.1.6]# vim /data/wwwroot/111.com/2.php
[[email protected] php-7.1.6]# curl -A "A4L" -x127.0.0.1:80 111.com/2.php [[email protected] 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 [[email protected] 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目录)
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,可以用上方第一个虚拟主机来限制
(为什么要带临时文件?因为默认的临时文件在/tmp/下,这样连临时文件都不给写)
[[email protected] php-7.1.6]# curl -A "A4L" -x127.0.0.1:80 111.com/2.php 123[[email protected] php-7.1.6]#
如有错误,欢迎指正,互相学习,共同进步!
以上是关于2018-3-7 11周2次课 限定某个目录禁止解析php限制user_agentphp相关配置的主要内容,如果未能解决你的问题,请参考以下文章