十一周二次课
11.28限制某个目录禁止解析PHP
11.29限制user_agent
11.30/11.31PHP相关配置
11.28限制某个目录禁止解析PHP
• 核心配置文件内容
<Directory /data/wwwroot/www.123.com/upload>
php_admin_flag engine off
</Directory>
• curl测试时直接返回了php源代码,并未解析
案例
- 假设有一个目录是可以上传图片,但是可能被有心之人上传php文件上去,因为httpd开放了php模块,所以如果被人上传了木马文件(php类型),httpd就有可能会进行执行,一旦执行,就会让对方获得我们服务器的root权限,或者是被恶意删除或修改一些参数,导致服务器瘫痪或者是被攻击。
- 案例:
- 一台服务器,网站被入侵,但不知道是什么原因,不知道怎么入侵的,也不知道入侵到什么程度,只知道他们公司的数据库泄露了,数据是一些电话号码,黑客并没有去删除数据,因为他知道这个服务器的数据库里,电话号码每天都在增长,它就可以源源不断的获得新的电话号码,获得的电话号码可以卖给第三方。
- 分析:
- 把一个没有在这个服务器提交过的电话号码,在这个服务器的网站上提交一次,结果,马上就有人打电话过来,证明,黑客获得电话号码,到打电话给新的用户,这套体系,已经完全自动化了(每天都会去抓取一个新的电话号码来队列,然后马上卖给第三方,第三方马上打电话给这个用户),所以就猜测,网站的程序(php)存在漏洞。另一种可能就是sql注入的漏洞(可以把查询的sql通过一些特殊的提交,提交到服务器上,服务器就会把这个sql语句转换成正常的查询,最终获得一些数据回来);但是sql注入漏洞,很容易修复,只要在网站提交的入口,增加一些特殊符号的过滤,就能完全的阻断sql注入的漏洞。
- 解决方法:
- 首先抓包,监控数据库的查询,因为电话号码是通过查询了数据库来的,写一个死循环的脚本,每隔一分钟抓一次查询数据,抓完以后生成一个日志文件。
- 查看日志以后,发现有一条sql查询,和网站源生的查询不一样,通过日志定位到了时间点,然后就去web服务器上查看时间点的访问日志,通过日志查看到了一个非常特殊的请求,名字是以php结尾的文件,而且这个php文件是在图片的目录下进行访问的,然后去查看这个php 文件,发现这个文件内容(一句话木马),是获取服务器的权限,相当于在服务器开了一个后门;这个问题产生的根本原因,就是因为上传图片目录并没有禁止解析php。在这个目录中上传了一个一句话木马,PHP文件,通过浏览器访问这个1.php,拿到了更高的权限,最终把数据库的权限拿到,去查询了他想要的数据。为了避免这种情况的发生,把上传图片的这个目录做一个禁止PHP解析,这样即便上传了一句话木马,但是不能解析,解析不了就获得不了权限。
sql注入
- 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1] 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击..
访问控制 – 禁止php解析
1.打开虚拟主机主机配置文件
[root@tianqi-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
//把代码放到配置文件中
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/abc.com"
ServerName abc.com
ServerAlias www.abc.com www.123.com
ErrorLog "logs/abc.com-error_log"
CustomLog "logs/abc.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com 2111.com.cn
# <Directory /data/wwwroot/111.com>
#<FilesMatch 123.php>
#AllowOverride AuthConfig
#AuthName "111.com user auth"
#AuthType Basic
#AuthUserFile /data/.htpasswd
#require valid-user
#</FilesMatch>
<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>
</Directory>
<Directory /data/wwwroot/111.com>
<FilesMatch "admin.php(.*)">
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
</Directory>
<Directory /data/wwwroot/111.com>
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "http://ask.apelearn.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>
</Directory>
SetEnvIf Request_URI ".*\.gif$" img
SetEnvIf Request_URI ".*\.jpg$" img
SetEnvIf Request_URI ".*\.png$" img
SetEnvIf Request_URI ".*\.bmp$" img
SetEnvIf Request_URI ".*\.swf$" img
SetEnvIf Request_URI ".*\.js$" img
SetEnvIf Request_URI ".*\.css$" img
CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
2.检查配置文件是否存在语法错误,并重新加载配置文件
[root@tianqi-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 ~]#
3.创建upload目录,新建php文件
[root@tianqi-01 111.com]# mkdir upload
[root@tianqi-01 111.com]# ls
123.php admin eagle1.jpg index.php upload
[root@tianqi-01 111.com]# cp 123.php upload/
[root@tianqi-01 111.com]#
4.curl访问
[root@tianqi-01 111.com]# curl -x127.0.0.1:80 '111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Mon, 05 Mar 2018 13:28:50 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
[root@tianqi-01 111.com]#
5.这时再去虚拟主机配置文件中注销掉FilesMatch
[root@tianqi-01 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off //把upload目录下的所有php禁止解析
#<FilesMatch (.*)\.php(.*)>
#Order allow,deny
#Deny from all
#</FilesMatch>
</Directory>
然后保存退出
6.检查配置文件是否存在语法错误,并重新加载配置文件
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 111.com]#
7.这时候访问php,会发现无法解析php
[root@tianqi-01 111.com]# curl -x127.0.0.1:80 'http://111.com/upload/123.php'
<?php
echo "123.php";
[root@tianqi-01 111.com]#
8.在浏览器中访问http://111.com/upload/123.php,会提示直接下载,这是因为无法解析php
9.这时候再打开虚拟主机配置文件,取消FilesMatch注释
[root@tianqi-01 111.com]# !vim
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off
<FilesMatch (.*)\.php(.*)>
Order allow,deny
Deny from all
</FilesMatch>
</Directory>
10.检查配置文件是否存在语法错误并重新加载配置文件
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 111.com]#
11.这时再去浏览器访问php,会直接显示Forbidden
12.即使去访问一个不存在的php文件,也会显示显示Forbidden
总结
- 禁止php解析操作,其实就是为了服务器更加安全,特别是针对可以写的目录;
- 可写的目录,一般(99%)是不需要解析php,这个需要牢记,一般静态文件存放的目录是不允许解析php 的。
11.29限制user_agent
• user_agent可以理解为浏览器标识
• 核心配置文件内容
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
• curl -A "123123" 指定user_agent
常用知识介绍
-
有时候,网站会受到一种叫 cc 攻击,CC攻击就是黑客,通过软件,肉鸡同时去访问一个站点,超过服务器的并发,就会导致站点宕机;通过肉鸡,软件去访问站点,就是普通的访问,没有什么特殊的,只是让站点超过并发导致严重超负荷而宕机,所以没办法去进行控制;所谓CC攻击都会有一个规律的特征,就是user_agent是一致的,比如同一个IP、同一个标识、同一个地址;遇到这种规律的user_agent频繁访问的情况我们就可以判定他就是CC攻击,我们就可以通过限制他的user_agent 减轻服务器压力,只需要让他从正常访问的200,限制为403,就能减轻服务器的压力,因为403仅仅是一个请求,只会使用到很少的带宽,毕竟他没有牵扯到php 和mysql
-
cc攻击
- 攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装就叫:CC(ChallengeCollapsar)。
- CC主要是用来攻击页面的。大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,访问的人越多,论坛的页面越多,数据库压力就越大,被访问的频率也越高,占用的系统资源也就相当可观。
- 一个静态页面不需要服务器多少资源,甚至可以说直接从内存中读出来发给你就可以了,但是论坛就不一样了,我看一个帖子,系统需要到数据库中判断我是否有读帖子的权限,如果有,就读出帖子里面的内容,显示出来——这里至少访问了2次数据库,如果数据库的数据容量有200MB大小,系统很可能就要在这200MB大小的数据空间搜索一遍,这需要多少的CPU资源和时间?如果我是查找一个关键字,那么时间更加可观,因为前面的搜索可以限定在一个很小的范围内,比如用户权限只查用户表,帖子内容只查帖子表,而且查到就可以马上停止查询,而搜索肯定会对所有的数据进行一次判断,消耗的时间是相当的大。
- CC就是充分利用了这个特点,模拟多个用户(多少线程就是多少用户)不停的进行访问(访问那些需要大量数据操作,就是需要大量CPU时间的页面).这一点用一个一般的性能测试软件就可以做到大量模拟用户并发。
-
肉鸡 (受黑客远程控制的电脑)
- 肉鸡也称傀儡机,是指可以被黑客远程控制的机器。比如用”灰鸽子”等诱导客户点击或者电脑被黑客攻破或用户电脑有漏洞被种植了木马,黑客可以随意操纵它并利用它做任何事情。
- 肉鸡通常被用作DDOS攻击。可以是各种系统,如windows、linux、unix等,更可以是一家公司、企业、学校甚至是政府军队的服务器。
1.打开虚拟主机配置文件
- 在两个条件中用OR做了一个连接符,理解起来就是 匹配第一条规则或者第二条规则;如果不加OR就是并且的意思,必须两个条件同时匹配以后才会执行
- NC表示忽略大小写,因为user_agent,可能会是大写的,比如:Mozilla/5.0,他首字母就是大写的
- RewriteRule .* - [F] 这里的F表示Forbidden
[root@tianqi-01 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/abc.com"
ServerName abc.com
ServerAlias www.abc.com www.123.com
ErrorLog "logs/abc.com-error_log"
CustomLog "logs/abc.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com 2111.com.cn
# <Directory /data/wwwroot/111.com>
#<FilesMatch 123.php>
#AllowOverride AuthConfig
#AuthName "111.com user auth"
#AuthType Basic
#AuthUserFile /data/.htpasswd
#require valid-user
#</FilesMatch>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
2.然后检查配置文件是否存在语法错误,并重新加载配置文件
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 111.com]#
3.去访问的时候,会显示403,这是因为限制了user_agent
[root@tianqi-01 111.com]# curl -x127.0.0.1:80 '111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 06 Mar 2018 01:04:51 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
[root@tianqi-01 111.com]# curl -x127.0.0.1:80 '111.com/123.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 06 Mar 2018 01:05:02 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
[root@tianqi-01 111.com]#
4.查看访问日志
[root@tianqi-01 111.com]# tail /usr/local/apache2.4/logs/111.com-access_20180306.log
127.0.0.1 - - [06/Mar/2018:08:40:44 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:08:42:52 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:08:43:10 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:08:59:56 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:12 +0800] "GET HTTP://111.com/upload/123.php HTTP/1.1" 403 223 "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:33 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 200 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:39 +0800] "GET HTTP://111.com/123.php HTTP/1.1" 200 7 "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:04:51 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:09:05:02 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
[root@tianqi-01 111.com]#
5.测试是否是因为user_agent才会被信任的
6.首先自定义user_agent
- curl -A,去自定义
//模拟user_agent,去访问会看到状态吗为200,可以正常访问
[root@tianqi-01 111.com]# curl -A "tianqi tianqi" -x127.0.0.1:80 '111.com/123.php' -I
HTTP/1.1 200 OK
Date: Tue, 06 Mar 2018 01:09:02 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
[root@tianqi-01 111.com]# curl -A "tianqi tianqi" -x127.0.0.1:80 '111.com/123.php'
123.php[root@tianqi-01 111.com]#
7.查看访问日志,会看到user_agent是tianqi tianqi
123.php[root@tianqi-01 111.com]# !tail
tail /usr/local/apache2.4/logs/111.com-access_20180306.log
127.0.0.1 - - [06/Mar/2018:08:42:52 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:08:43:10 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:08:59:56 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:12 +0800] "GET HTTP://111.com/upload/123.php HTTP/1.1" 403 223 "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:33 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 200 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:39 +0800] "GET HTTP://111.com/123.php HTTP/1.1" 200 7 "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:04:51 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:09:05:02 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:09:09:02 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 200 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:09:13 +0800] "GET HTTP://111.com/123.php HTTP/1.1" 200 7 "-" "tianqi tianqi"
[root@tianqi-01 111.com]#
curl命令
- curl命令是一个利用URL规则在命令行下工作的文件传输工具
- -A ,指定user-agent,设置用户代理发送给服务器
- -e ,指定referer,就是来源网址
- -I ,仅仅查看它的状态码
- -x ,在指定的端口上使用HTTP代理
11.30/11.31PHP相关配置
- 查看php配置文件位置
- /usr/local/php/bin/php -i|grep -i "loaded configuration file"
- date.timezone
- disable_functions 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
- error_log, log_errors, display_errors, error_reporting
- open_basedir
- php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"
PHP相关配置
- 查看php配置文件的位置
- 通过浏览器,访问phpinfo找到配置文件的路径
- 也可以用/usr/local/php/bin/php -i |grep -i “loaded configuration file”找到他的路径;但是有些情况“php -i ”是不准的,因为Apache它是调用了php 的模块,而且“php -i” 只是php 的一个程序,它和libphp5.so可能有关系也可能没有关系;
- 案例:
- 有时改了php.ini,改动了也重启了服务,结果配置还是不生效;因为使用“php -i” 找到的配置文件和在web上的phpinfo找到的php.ini不是同一个,如果想要准确的找到php.ini配置文件,就在对应的站点目录下,创建一个phpinfo的php文件,在web上打开,在phpinfo上找到的,才是最准确的
[root@tianqi-01 111.com]# ls
123.php admin eagle1.jpg index.php upload
[root@tianqi-01 111.com]# vim index.php
<?php
phpinfo();
在浏览器中打开111.com/index.php
//配置文件并没有加载,下载去复制一个
[root@tianqi-01 111.com]# cd /usr/local/src/php-7.1.6
[root@tianqi-01 php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#
此时再去浏览器中打开111.com/index.php,会看到配置文件已经有了,所以phpinfo是最准的。
- 设置安全函数
- disable_functions //安全函数
- eval 之前提到的一句话木马涉及到的函数,如果把这个函数禁用,那么那个木马将不会生效
- 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 以上是比较危险的函数
设置PHP文件
1.打开php文件,禁掉一些危险的函数(默认里面是空的)
[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
//搜索disable_functions,在disable_functions=后面禁掉一些危险的函数
disable_functions=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涉及到服务器很多php 的配置相关,如果一不小心上传到了线上,那么久很容易被黑客查到,进行对应的攻击。
2.查看是否存在语法错误,并重新加载配置文件
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#
3.再去浏览器访问111.com/123.php,会看到phpinfo被禁掉了
4.还需要使用phpinfo,所以在此编辑配置文件,在disable_functions后面去掉phpinfo,检查语法错误并重新加载配置文件
[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
disable_functions=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
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#
5.编辑php配置文件
- 定义data.timezone时区,如果不定义,有时候会有告警信息
- display_errors=On(On显示,Off不显示),这样设置就会把错误的信息直接显示在浏览器上,这样就会把目录给暴露出来,所以这里就更改成display_errors=Off。
[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
//搜索timezone
在date.timezone定义时区
//需要删除分号;
date.timezone = Asia/Shanghai
//搜索display
//需要删除分号;
将display_errors = On改为display_errors = Off
将disable_functions=后面加上phpinfo,继续做实验
6.检查配置文件是否存在语法错误,并重新加载配置文件
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#
7.这时候再去用浏览器访问111.com/index.php,会看到的是白页,这就是因为display_errors=Off
8.用curl试一下
[root@tianqi-01 php-7.1.6]# curl -x127.0.0.1:80 http://111.com/index.php
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /index.php
on this server.<br />
</p>
</body></html>
[root@tianqi-01 php-7.1.6]#
现在看到的状态码还是403,因为此时限制了user_agent。
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/index.php
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/index.php -I
HTTP/1.1 200 OK
Date: Tue, 06 Mar 2018 02:33:32 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
[root@tianqi-01 php-7.1.6]#
没有任何的输出,就是白页这就有问题了,因为不显示任何内容,一切都是未知的。
9.打开配置文件
- 定义错误日志log_errors = On-->On表示打开
- 定义错误日志文件路径error_log=/tmp/php_errors.log
- error_reporting = E_ALL,定义日志的级别,默认是ALL,表示把所有的errors都记录下来,这是最不严谨的
- 在生产环境中,使用; E_ALL & ~E_NOTICE (Show all errors, except for notices)
[root@tianqi-01 php-7.1.6]# !vim
vim /usr/local/php7/etc/php.ini
搜索log_errors,log_errors = On,将错误日志文件打开
搜索/error_log,将错误日志文件定义到tmp目录下
将;error_log = php_errors.log改为error_log=/tmp/php_errors.log,去掉分号;。
搜索error_reporting,定义日志级别
; error_reporting
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
按n键查找下一个
error_reporting = E_ALL
保存退出
10.检查配置配置文件是否存在语法错误,并重新加载配置配置文件
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#
11.这时再去访问一遍,会看到tmp目录下生成了php_errors.log
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/index.php
[root@tianqi-01 php-7.1.6]# ls /tmp/
pear
php_errors.log
systemd-private-10939be3906d4885a694c9ccaa969513-vgauthd.service-up8a1e
systemd-private-10939be3906d4885a694c9ccaa969513-vmtoolsd.service-qrMrpr
systemd-private-42380971d6c34175aa4f900510bf7f60-vgauthd.service-Wj57Dr
systemd-private-42380971d6c34175aa4f900510bf7f60-vmtoolsd.service-EC3gse
systemd-private-491ebf486ca940d885ed9348c17675f5-vgauthd.service-3sBthy
systemd-private-491ebf486ca940d885ed9348c17675f5-vmtoolsd.service-sJ80kS
systemd-private-70996ce584314349997855a51a9da3d4-vgauthd.service-fehOdP
systemd-private-70996ce584314349997855a51a9da3d4-vmtoolsd.service-WZC9Q4
systemd-private-74b18b5fecc548f1ac450ce1fea7233b-vgauthd.service-DBvBHm
systemd-private-74b18b5fecc548f1ac450ce1fea7233b-vmtoolsd.service-AjXoy6
systemd-private-8531739ab5bb4905a63c0a8665d16b3b-vgauthd.service-vh8gyS
systemd-private-8531739ab5bb4905a63c0a8665d16b3b-vmtoolsd.service-koi7xB
systemd-private-9644814bb86e455d8e911deb7225488b-vgauthd.service-KLJ6Yc
systemd-private-9644814bb86e455d8e911deb7225488b-vmtoolsd.service-g2bpAg
systemd-private-aa279ed589d542bcbc4f2903687ce469-vgauthd.service-xDYbZY
systemd-private-aa279ed589d542bcbc4f2903687ce469-vmtoolsd.service-tTo26l
[root@tianqi-01 php-7.1.6]#
12.查看php_errors.log,会看到属主属组是daemon
[root@tianqi-01 php-7.1.6]# ll /tmp/php_errors.log
-rw-r--r-- 1 daemon daemon 145 Mar 6 11:07 /tmp/php_errors.log
[root@tianqi-01 php-7.1.6]#
13.deamon实际上是httpd的属主,php_errors.log日志文件是以httpd这个进程的身份去生成的
[root@tianqi-01 php-7.1.6]# ps aux |grep httpd
root 1113 0.0 1.3 258888 13628 ? Ss 08:39 0:00 /usr/local/apache2.4/bin/httpd -k graceful
daemon 1886 0.0 1.2 545716 12428 ? Sl 11:07 0:00 /usr/local/apache2.4/bin/httpd -k graceful
daemon 1887 0.0 1.0 545716 10404 ? Sl 11:07 0:00 /usr/local/apache2.4/bin/httpd -k graceful
daemon 1888 0.0 1.4 613364 14868 ? Sl 11:07 0:00 /usr/local/apache2.4/bin/httpd -k graceful
root 1977 0.0 0.0 112660 984 pts/0 S+ 11:11 0:00 grep --color=auto httpd
[root@tianqi-01 php-7.1.6]#
- 有时候,定义了一个错误日志,但是这个错误日志始终没有生成,那么就需要检查一下定义错误日志所在的目录,到底httpd有没有写权限;
- 最保险的办法,就是在所在目录创建一个错误日志的文件,然后赋予它777的权限,这样就不需要担心这个文件httpd是否有写权限了。
[root@tianqi-01 111.com]# grep error_log /usr/local/php7/etc/php.ini
; server-specific log, STDERR, or a location specified by the error_log
; Set maximum length of log_errors. In error_log information about the source is
error_log = /tmp/php_errors.log
;error_log = syslog
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
[root@tianqi-01 111.com]#
- 可以先创建好/tmp/php_errors.log文件,然后赋予chmod 777权限
14.查看文件日志
[root@tianqi-01 111.com]# cat /tmp/php_errors.log
[06-Mar-2018 11:33:18 Asia/Shanghai] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[root@tianqi-01 111.com]#
15.下面模拟一个错误
[root@tianqi-01 111.com]# vim /data/wwwroot/111.com/2.php
<?php
echo 123;
dgebszfhasdf
16.访问2.php,会出现一些错误
[root@tianqi-01 111.com]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php
[root@tianqi-01 111.com]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.0 500 Internal Server Error
Date: Tue, 06 Mar 2018 06:08:02 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@tianqi-01 111.com]#
同样是一个白页,只不过这个白页的状态码是500
17.看一下错误日志
[root@tianqi-01 111.com]# cat /tmp/php_errors.log
[06-Mar-2018 11:33:18 Asia/Shanghai] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[06-Mar-2018 13:56:54 Asia/Shanghai] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[06-Mar-2018 14:08:02 Asia/Shanghai] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[root@tianqi-01 111.com]#
这里是syntax error,比warning的级别更高
安全相关的参数
- 一台服务器上,运行了多个站点,有一台服务器假如代码有问题,结果这个站点被黑客攻击了,被黑客拿到了权限,黑客拿了权限肯定会继续往里渗透,就会有可能渗透到其他的站点,同时导致其它的站点被黑;
- open_basedir,它是一个安全选项,A网站在A目录下,B网站在B目录下,这两个目录会做一个隔离,即使说A网站被黑了,最多也就黑一下A目录,其它目录看不到也进不去,也不会有权限进去,这就是open_basedir的作用。即使说服务器上只有一个网站,open_basedir限制也是很有必要的,网站一旦被黑,就会可能导致黑客到其它目录做坏事,限制了以后,即使这个目录被黑了,也只能在这个目录下搞事情;
- php.ini文件中的内容是针对所有虚拟主机进行的配置!!!
1.打开php配置文件
[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
//搜索open_basedir,并删除分号;
open_basedir=/data/wwwroot/1111.com:/tmp //如果限制错了,限制成1111.com:
然后保存退出
2.查看配置文件是否存在语法错误,并重新加载配置文件
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#
3.用curl访问2.php
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.0 500 Internal Server Error
Date: Wed, 07 Mar 2018 11:05:42 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@tianqi-01 php-7.1.6]#
4.现在改正2.php,去掉第3行的乱码
[root@tianqi-01 php-7.1.6]# vim /data/wwwroot/111.com/2.php
<?php
echo 123;
保存退出
5.再次用curl访问2.php,状态码还是500
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.0 500 Internal Server Error
Date: Wed, 07 Mar 2018 11:08:06 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@tianqi-01 php-7.1.6]#
6.查看错误输出
[root@tianqi-01 php-7.1.6]# cat /tmp/php_errors.log
[06-Mar-2018 11:33:18 Asia/Shanghai] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[06-Mar-2018 13:56:54 Asia/Shanghai] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[06-Mar-2018 14:08:02 Asia/Shanghai] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[07-Mar-2018 19:03:19 Asia/Shanghai] PHP Warning: Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/index.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:03:19 Asia/Shanghai] PHP Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:03:19 Asia/Shanghai] PHP Fatal error: Unknown: Failed opening required '/data/wwwroot/111.com/index.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:04:20 Asia/Shanghai] PHP Warning: Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/index.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:04:20 Asia/Shanghai] PHP Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:04:20 Asia/Shanghai] PHP Fatal error: Unknown: Failed opening required '/data/wwwroot/111.com/index.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:04:24 Asia/Shanghai] PHP Warning: Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/index.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:04:24 Asia/Shanghai] PHP Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:04:24 Asia/Shanghai] PHP Fatal error: Unknown: Failed opening required '/data/wwwroot/111.com/index.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:04:42 Asia/Shanghai] PHP Warning: Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/2.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:04:42 Asia/Shanghai] PHP Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:04:42 Asia/Shanghai] PHP Fatal error: Unknown: Failed opening required '/data/wwwroot/111.com/2.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:05:42 Asia/Shanghai] PHP Warning: Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/2.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:05:42 Asia/Shanghai] PHP Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:05:42 Asia/Shanghai] PHP Fatal error: Unknown: Failed opening required '/data/wwwroot/111.com/2.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:08:06 Asia/Shanghai] PHP Warning: Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/2.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:08:06 Asia/Shanghai] PHP Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:08:06 Asia/Shanghai] PHP Fatal error: Unknown: Failed opening required '/data/wwwroot/111.com/2.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[root@tianqi-01 php-7.1.6]#
7.重新编辑配置文件,将1111.com改为111.com
[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
open_basedir = /data/wwwroot/1111.com:/tmp改为
open_basedir = /data/wwwroot/111.com:/tmp
保存并退出
8.查看配置文件是否存在语法错误,并重新加载配置文件
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#
9.再次用curl访问2.php,状态码会显示200
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.1 200 OK
Date: Wed, 07 Mar 2018 11:15:15 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
[root@tianqi-01 php-7.1.6]#
10.若是服务器上跑了n多个站点,该如何做限制呢?
11.应该针对站点、这些网站做open_basedir,但是php.ini是做不到的,因为php.ini是针对所有站点的
12.取消第一步中对open_basedir的设置
[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
将open_basedir = /data/wwwroot/111.com:/tmp改为
open_basedir =
然后保存退出
13.但我们可以在虚拟主机配置文件中设置,在apache虚拟主机文件中去设置
- 在这里可以针对不同的虚拟主机限制不同的open_basedir
[root@tianqi-01 php-7.1.6]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/abc.com"
ServerName abc.com
ServerAlias www.abc.com www.123.com
php_admin_value open_basedir "/data/wwwroot/abc.com:/tmp" //这里限定在abc.com目录下
ErrorLog "logs/abc.com-error_log"
CustomLog "logs/abc.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com 2111.com.cn
# <Directory /data/wwwroot/111.com>
#<FilesMatch 123.php>
#AllowOverride AuthConfig
#AuthName "111.com user auth"
#AuthType Basic
#AuthUserFile /data/.htpasswd
#require valid-user
#</FilesMatch>
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp" //这里限定在111.com目录下
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
14.查看配置文件是否存在语法错误,并重新加载配置文件
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]#
15.用curl继续访问2.php
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php
123[root@tianqi-01 php-7.1.6]#
//这里就可以使用不同的虚拟主机去限制不同的open_basedir
友情链接:阿铭Linux