一些提供用户上传的文件下有可能被不正常放入可运行的文件,因此咱们要作的就是提早设置禁止解析这些目录下的可执行php或其余文件,避免损失。php
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<Directory /data/wwwroot/111.com/upload> php_admin_flag engine off //指的是将/data/wwwroot/111.com/upload目录下的php禁止解析 </Directory>
<Directory /data/wwwroot/111.com/upload> php_admin_flag engine off //指的是将/data/wwwroot/111.com/upload目录下的php禁止解析 <FilesMatch (.*)\.php(.*)> Order allow,deny Deny from all </FilesMatch> </Directory>
/usr/local/apache2.4/bin/apachectl graceful
[root@yolks2 ~]# mkdir /data/wwwroot/111.com/upload/ [root@yolks2 ~]# cd !$ cd /data/wwwroot/111.com/upload/ [root@yolks2 upload]# ls [root@yolks2 upload]# vim test_uplaod.php [root@yolks2 upload]# ls test_uplaod.php
curl -x127.0.0.1:80 'http://111.com/upload/123.php' -I
[root@yolks2 upload]# curl -x127.0.0.1:80 'http://111.com/upload/test_uplaod.php' -I HTTP/1.1 403 Forbidden Date: Mon, 06 Aug 2018 14:32:03 GMT Server: Apache/2.4.34 (Unix) PHP/5.6.32 Content-Type: text/html; charset=iso-8859-1
能够简单理解为浏览器标识;好比网站受到cc***。***的人经过软件或者肉机,想***某个网站的时候,把全部的肉机发动起来,让它们同时访问一个站点。可是cc***每每有一个特征,就是user_agent一致的,访问地址一致。访问速度快,每秒N次;
解决方法:限制user_agent减轻服务器压力html
编辑虚拟机配置文件shell
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
核心配置文件代码以下:apache
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] //条件1,此处加OR表示条件1或者条件2都使用最后的规则 RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] //条件2,NC 表示忽略大小写 RewriteRule .* - [F] //规则,F为forbidden </IfModule>
从新加载文件vim
/usr/local/apache2.4/bin/apachectl graceful
curl测试:403错误浏览器
curl -x127.0.0.1:80 'http://111.com/index.php' -I HTTP/1.1 403 Forbidden Date: Tue, 07 Aug 2018 14:29:45 GMT Server: Apache/2.4.34 (Unix) PHP/5.6.32 Content-Type: text/html; charset=iso-8859-1
查看日志:显示被限制服务器
[root@yolks2 ~]# tail -f /usr/local/apache2.4/logs/111.com-access_20180807.log 127.0.0.1 - - [07/Aug/2018:22:29:45 +0800] "HEAD http://111.com/index.php HTTP/1.1" 403 - "-" "curl/7.29.0"
为了证实是user_agent限制的,模拟user_agent指定user_agent为“yolks yolks”,能够直接被访问php7
[root@yolks2 ~]# curl -A "yolks yolks" -x127.0.0.1:80 'http://111.com/index.php' -I HTTP/1.1 200 OK Date: Tue, 07 Aug 2018 14:33:28 GMT Server: Apache/2.4.34 (Unix) PHP/5.6.32 X-Powered-By: PHP/5.6.32 Content-Type: text/html; charset=UTF-8
再次查看日志已经正常显示:curl
[root@yolks2 ~]# tail -f /usr/local/apache2.4/logs/111.com-access_20180807.log 127.0.0.1 - - [07/Aug/2018:22:29:45 +0800] "HEAD http://111.com/index.php HTTP/1.1" 403 - "-" "curl/7.29.0" 127.0.0.1 - - [07/Aug/2018:22:33:28 +0800] "HEAD http://111.com/index.php HTTP/1.1" 200 - "-" "yolks yolks"
cc攻击解释socket
查看php配置文件位置
方法1:用命令 /usr/local/php/bin/php -i | grep -i "loaded configuration file"
方法2:用phpinfo来查看
编辑index.php,内容为phpinfo
[root@yolks2 111.com]# cat index.php <?php echo "this is test 111.com"; phpinfo(); ?>
浏览器可访问111.com/index.php,为phpinfo
若是没有加载的话能够去源码包中复制
[root@yolks2 111.com]# cd /usr/local/src/php-7.1.6/ [root@yolks2 php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini
从新加载配置后,能够看到php.ini被加载
配置php.ini
1.限定disable_fuctions(危险函数)
vim/usr/local/php7/etc/php.ini编辑文件搜索/disable_fun
危险函数:
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显示错误信息,若是on,打开的话,那么会把错误信息显示在浏览器上,极可能会暴露目录,例如:
那么,设置为off以后,再访问,则会显示白页,虽然防止别人可是本身也不容易看到报错信息;
所以,再将display_errors改成off以后,须要编辑错误日志log_errors
**log_errors **
1)log_errors:错误日志打开
3)还要定义一个error_log的级别,很是严谨的话,那么只会记录一些严重的错误,一些不太严重的错误则不记录,忽被略掉,咱们能够放松一些,级别低一点
生产环境中通常使用 E_ALL & ~E_NOTICE
再次访问,查看日志:
[root@yolks2 php-7.1.6]# curl -A "yolks" -x127.0.0.1:80 111.com/index.php this is test 111.com[root@yolks2 php-7.1.6]# cat /tmp/php_errors.log [07-Aug-2018 15:46:00 UTC] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 3
咱们再模拟一个错误,再/data/wwwroot/111.com/目录下建立2.php,内容以下
文件2.php内容以下:
cat /data/wwwroot/111.com/2.php <?php shsjshjshj
测试发现日志报错提示500 .
[root@yolks2 php-7.1.6]# curl -A "yolks" -x127.0.0.1:80 111.com/2.php [root@yolks2 php-7.1.6]# curl -A "yolks" -x127.0.0.1:80 111.com/2.php -I HTTP/1.0 500 Internal Server Error Date: Tue, 07 Aug 2018 15:49:50 GMT Server: Apache/2.4.34 (Unix) PHP/7.1.6 X-Powered-By: PHP/7.1.6 Connection: close Content-Type: text/html; charset=UTF-8 [root@yolks2 php-7.1.6]# cat /tmp/php_errors.log [07-Aug-2018 15:46:00 UTC] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 3 [07-Aug-2018 15:49:47 UTC] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 3 [07-Aug-2018 15:49:50 UTC] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 3
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/目录,是由于网站会有临时文件写入到/tmp/目录下来