限定某个目录禁止解析php,限制user_agent, php相关配置

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

  • 对于使用php语言编写的网站,有一些目录是有需求上传文件的。如果网站代码有漏洞,让黑客上传了一个用PHP写的木马,由于网站可以执行PHP程序,最终会让黑客拿到服务器权限。 为了避免这种情况发生,我们需要把能上传文件的目录直接禁止解析PHP代码 1.编辑虚拟主机配置
#进入虚拟主机配置文件
[root@aminglinux 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#增加下列配置
<Directory /data/wwroot/111.com/upload> //把upload目录下所有的php禁止解析
        php_admin_flag engine off //表示禁止解析php
## 增加下面的(两个F之间的)后,所有访问php都会是403
   <FilesMatch (.*)\.php(.*)> 
      Order allow,deny                
       Deny from all
    </FilesMatch>   
</Directory>

2.检查读写并重启服务

[root@aminglinux 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux 111.com]# /usr/local/apache2.4/bin/apachectl graceful

3.创建需要禁止解析php的目录,并把1个php文件放在目录下

[root@aminglinux ~]# cd /data/wwroot/111.com/
[root@aminglinux 111.com]# ls
123.php  admin  qq.png  u=3062734635,4183904616&fm=96.jpg
[root@aminglinux 111.com]# mkdir upload/
[root@aminglinux 111.com]# ls
123.php  admin  qq.png  u=3062734635,4183904616&fm=96.jpg  upload
#在目录下创建一个php文件
[root@aminglinux 111.com]# cp 123.php  upload/

4.访问这个文件,这里显示了403。当我们访问另一个目录的php文件的时候,显示能直接访问,所以这个限制解析php是指定了目录的,不影响我们其它目录。

[root@aminglinux 111.com]# curl -x192.168.10.120:80 '111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Mon, 08 Jan 2018 16:26:54 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
#当我们访问其他目录的php文件
[root@aminglinux 111.com]# curl -x192.168.10.120:80 '111.com/123.php'
123.com[root@centos001 111.com]# 

5.注释掉后面加的代码的时候会出现什么状况呢,开始说到禁止解析php只需要最前面的就可以了。

#进入虚拟主机配置文件并注释掉
    <FilesMatch (.*)\.php(.*)> 
       Order allow,deny                
       Deny from all
    </FilesMatch>   
#检查读写并重启服务
#再次访问目录下的php文件
[root@aminglinux 111.com]# curl -x192.168.10.120:80 '111.com/upload/123.php'
<?php
echo "123.com";

6.这里能看到直接显示源代码了,看起来不太美观

限制user_agent:

  • **什么是user_agent?**答:可以理解为浏览器标识
  • 了解cc攻击 CC是指攻击者借助代理服务器生成指向受害主机的合法请求,实现DOS和伪装。CC攻击主要针对WEB应用程序比较消耗资源的地方进行疯狂请求,比如,论坛中的搜索功能,如果不加以限制,任由人搜索,普通配置的服务器在几百个并发请求下,MYSQL服务就会瘫痪
  • 为何要限制 user_agent? 答:防止网站被cc攻击。这种攻击有很明显的规律,这些恶意请求的user_agent相同或相似,我们就能通过限制user_agent发挥防攻击作用

1.修改虚拟主机配置文件。本例意为当user_agent匹配到curl或者baidu.com时,都会触发规则显Forbidden

<IfModule mod_rewrite.c> //此处加载了一个模块
        RewriteEngine on 
#NC表示忽略大小写,OR表示或者,F相当于Forbidden
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]//
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]
        RewriteRule  .*  -  [F]
</IfModule>

2.检查读写并重启服务。:要是没有加载模块还要去主配置文件里面加载哦

[root@aminglinux 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux 111.com]# /usr/local/apache2.4/bin/apachectl graceful

3.访问。因为有curl触发了规则所以输出403

[root@aminglinux 111.com]# curl -x192.168.10.120:80 'http://111.com/123.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 /123.php
on this server.<br />
</p>
</body></html>

4.curl -A "123123" 指定user_agent

[root@aminglinux 111.com]# curl -A "123123" 192.168.10.120:80 '111.com/123.php'
abc.com

PHP相关配置:

查看php配置文件的位置

  • 第一种通过浏览器,访问phpinfo找到配置文件的路径(最准确)
  • 第二种/usr/local/php/bin/php -i|grep -i "loaded configuration file" ;但是有些情况“php -i ”是不准的,因为Apache他是调用了php 的一模块,而且“php -i” 只是php 的一个程序,它和libphp5.so可能有关系也可能没有关系;
[root@aminglinux ~]# cd /data/wwroot/111.com/
[root@centos001 111.com]# ls
123.php  index.php
[root@aminglinux 111.com]# vi index.php 
[root@aminglinux 111.com]# cat index.php 
<?php
phpinfo();
  • 有时候浏览器能看到配置文件的路径但是没有加载。所以我们就要去拷贝一个配置文件
cp php.ini-development /usr/local/php/etc/php.ini
#刷新浏览器不成功,可以再重启下服务
  • 这个就是我们的配置文件了/usr/local/php7/etc/php.ini

  修改php配置文件

  • 1.disable_functions 安全函数,以下函数会直接调去linux系统命令,开放将会很危险,因此要禁掉。
#打开配置文件
vim /usr/local/php7/etc/php.ini
#搜索 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可以添加到最后面
  • 示例1:禁用phpinfo。 在安全函数后面添加phpinfo,重启生效后用浏览器访问。因为不禁止的话,在网页上就会显示很多我们的目录信息。

2. date.timezone 定义时区。 不定义的话有时会出现一些警告信息

#进入配置文件
[root@aminglinux 111.com]# vim /usr/local/php7/etc/php.ini
#搜索date.timezone
#修改为date.timezone = Asia/Shanghai
#搜索display
修改为display_errors = Off

3.配置error_log (错误日志)

刚才我们禁用phpinfo的时候,浏览器输出了一段错误信息。这个就是php开启了错误日志的输出功能,但是开启之后呢,我们的有些东西就会泄露出去。所以下面我们将介绍怎么设置错误日志的路径、级别和类型等

#进入配置文件
1.开启error_log
#搜索 log_errors 
修改为log_errors = Off      on = 打开    off = 关闭

2.定义错误日志的文件路径
#搜索error_log
修改为error_log = /tmp/php_errors.log

3.定义错误日志的级别,这里我们选择的是最不严谨的。E_NOTICE为生产环境中所选的
#搜索error_reporting
修改为error_reporting = E_ALL
#保存退出后,检查读写并重启服务。查看路径有没有生成,访问下或者刷新一下网页
[root@aminglinux 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@aminglinux 111.com]# cd /tmp 
[root@aminglinux tmp]# ls
php_errors.log //生成的文件

查看php_errors.log文件,会看到属主属组是daemon

[root@aminglinux tmp]# ls -l /tmp/php_errors.log 
-rw-r--r--. 1 daemon daemon 432 1月   9 04:53 /tmp/php_errors.log

daemon实际上是httpd的属主,php_errors.log日志文件是以httpd这个进程的身份去生成的

[root@aminglinux tmp]# ps aux |grep httpd
root      2323  0.0  1.4 267872 14384 ?        Ss   1月08   0:15 /usr/local/apache2.4/bin/httpd -k start
daemon   24263  0.0  0.8 554700  8644 ?        Sl   04:46   0:00 /usr/local/apache2.4/bin/httpd -k start
daemon   24264  0.0  0.8 554700  8644 ?        Sl   04:46   0:00 /usr/local/apache2.4/bin/httpd -k start
daemon   24267  0.0  1.1 687884 11172 ?        Sl   04:46   0:00 /usr/local/apache2.4/bin/httpd -k start
root     24363  0.0  0.0 112676   984 pts/1    R+   04:55   0:00 grep --color=auto httpd
  • 有时候,定义了一个错误日志,但是这个错误日志始终没有生成,那么就需要检查一下定义错误日志所在的目录,到底httpd有没有写权限
  • 最保险的办法,就是在所在目录创建一个错误日志的文件,然后赋予它777的权限,这样就不需要担心这个文件httpd是否有写权限了
[root@aminglinux tmp]# grep error_log /usr/local/php/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 = php_errors.log
;error_log = syslog
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
[root@aminglinux tmp]# touch /tmp/php_errors.log ; chmod /tmp/php_errors.log
  • 查看错误日志文件 [root@aminglinux tmp]# cat /tmp/php_errors.log [09-Jan-2018 04:43:15 Asia/Shanghai] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwroot/111.com/index.php on line 2
  • open_basedir = /data/wwroot/111.com:/tmp open_basedir安全相关项 一台服务器上有多个网站运行,这样做的弊端是如果其中一个被黑。其它的也有可能被连累
  • open_basedir就刚好能解决这个问题,它的作用是将网站限定在指定目录里,就算被黑也波及不到其他目录
  • php.ini文件中的内容是针对所有虚拟主机进行的配置 1.修改配置文件
[root@aminglinux tmp]# vim /usr/local/php7/etc/php.ini
#搜索open_basedir
修改为open_basedir = /data/wwroot/111.com:/tmp

2.检查读写并重启服务 3.正常访问的话,直接就能访问 4.若是服务器上跑了N多个站点,那应该怎么去做限制呢? 应该针对站点,这些网站去做open_basedir ,但php.ini是做不到的,因为php.ini是针对所有站点的 但我们可以在虚拟主机配置文件中设置,在apache虚拟主机配置文件中去设置/usr/local/apache2.4/conf/extra/httpd-vhosts.conf

[root@aminglinux tmp]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#增加 保存并退出
php_admin_value open_basedir "/data/wwroot/111.com:/tmp/"

扩展

apache开启压缩 http://ask.apelearn.com/question/5528 apache2.2到2.4配置文件变更 http://ask.apelearn.com/question/7292 apache options参数 http://ask.apelearn.com/question/1051 apache禁止trace或track防止xss http://ask.apelearn.com/question/1045 apache 配置https 支持ssl http://ask.apelearn.com/question/1029

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux运维学习之路

Nginx软件部署配置过程

---恢复内容开始--- 注意:博主使用的系统为: [root@web01 ~]# uname -a Linux web01 2.6.32-696.el6.x...

2135
来自专栏IMWeb前端团队

PM2实用入门指南

简介 PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。 下面就对PM2进行入门...

25410
来自专栏上善若水

043android初级篇之android studio代码加入版本控制

项目开发中,代码加入版本控制的必要性毋庸置疑。android studio中集成有代码的版本控制。

713
来自专栏源哥的专栏

由于struts配置文件没有定义头文件引起的问题

在使用struts中,一定要配置struts-config.xml文件,我所采用的web容器是resin,采用struts结构,当系统搭建好了之后,启动res...

641
来自专栏刺客博客

艾特文件管理器 1.8

2145
来自专栏流柯技术学院

VMware安装CentOS时,无法以图形界面安装解决办法

1182
来自专栏企鹅号快讯

内网及外网MSSQL口令扫描渗透

在实际渗透过程中,往往通过SQL注入或者弱口令登录后台,成功获取了Webshell,但对于如何进行内网渗透相当纠结,其实在获取入口权限的情况下,通过lcx端口...

2955
来自专栏用户画像

git如何移除某文件夹的版本控制

531
来自专栏快乐八哥

ASP.NET输出JSON格式数据

一直使用WordPress3.1的版本,12月份WordPress发布了3.5的版本,想尝试升级一一下。当然最好是先在本地环境测试通过,然后上传的服务器是最好的...

19210
来自专栏云计算教程系列

如何保护PostgreSQL免受攻击

服务器刚搭建,流量少,没有任何对黑客有价值的东西,你可能就会忽视相关的安全问题。但是,许多漏洞攻击都是自动化的,专门用于查找你服务中的BUG。这些服务器主要目的...

753

扫码关注云+社区