关于thinkPHP3.2中的rewrite不严谨问题会导致网站被注入以及nginx配置中的if多条件判断问题-阿里云阻止指host访问

本文主要是介绍关于thinkPHP3.2中的rewrite不严谨问题会导致网站被注入以及nginx配置中的if多条件判断问题-阿里云阻止指host访问,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、关于thinkPHP3.2中的rewrite不严谨问题会导致网站被注入

    thinkPHP3.2的rewrite问题,之前也没在意过,但是今天浏览了一下服务器的一套CMS的相关东西,因为这套CMS是使用thinkPHP3.2搭建的,在浏览代码时发现其目录架构与目前的流行架构不一样,其index.php是写在应用程序的根目录下,而现在的index.php一般都写在public目录(只允许对外访问的目录下面),于是我顺便看了一下涉及此CMS平台的nginx配置,配置conf基本和thinkphp官网的配置一样,在thinkphp网站上也能看到大多数这样的配置,publish:September 14, 2018 -Friday 如下:

server {listen   80;server_name  domain.com;error_page   404              /404.html;error_page   500 502 503 504  /50x.html;#这个location块处理动态资源请求.location ~  \.php   {root /data0/htdocs/www;fastcgi_pass   127.0.0.1:9000;include        fastcgi.conf;       }#这个location处理能处理所有的静态资源location / {root   /home/htdocs/www;index  index.php index.html index.htm;if (!-e $request_filename){rewrite ^(.*)$ /index.php?s=$1 last;}}
}

    看了一眼之后突然觉得这个有问题,在执行最后一步rewrite之前的判断是判断这个文件是否存在,if (!-e $request_filename)。如果不存在才会执行由index.php入口进行请求。但这明显是有问题的,那么如果直接请求存在的PHP文件或者其它文件呢?是不是也能请求(是否会造成问题不论,至少突破了你的设防)。由于我的代码版本中存在一些shell脚本以及一些python代码,于是我尝试直接访问python代码文件,发现其能将python文件下载下来,这就是很大的问题了。万一shell或者python代码块中有服务器密码或什么账号之类的东西,这个服务器就要被攻击玩完了。可见thinkphp升级到5的必要性了,thinkPHP5中的框架已经是大众架构了(对外只允许访问Public目录,index.php和其它的css/js等资源文件都放在此目录。当然对于我现在的情况,也懒得去升级了。不改代码的话在nginx层加上配置:

#将不允许直接访问的文件后缀列在此处
location ~ \.(py|sh)$ {return 404;
}

 如果你方便去改代码,建议将thinkphp3.2的PHP的入口文件移动到Public目录下,同时将其它robots.txt文件也放入。然后修改thinkphp3.2的入口文件如下:

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------// 应用入口文件// 检测PHP环境
if(version_compare(PHP_VERSION,'5.3.0','<'))  die('require PHP > 5.3.0 !');// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',false);// 定义应用目录
define('ROOT_PATH', dirname(__DIR__));  #此行为增加的新行
define('APP_PATH', ROOT_PATH.'/Application/');  #修改此处加载路径,添加上面的ROOT_PATH// 引入ThinkPHP入口文件
require ROOT_PATH.'/ThinkPHP/ThinkPHP.php';     #修改此处加载路径,添加上面的ROOT_PATH// 亲^_^ 后面不需要任何代码了 就是如此简单

 二、nginx配置中的if多条件判断问题-阿里云阻止指host访问

        下面是一段nginx配置,之前只是判断如果$host是否等于www.007.cn,后来我加上一个匹配007,保存配置文件后检查发现报错:nginx: [emerg] invalid condition  publish:September 28, 2018 -Friday

#配置文件修改
if ( $host ~ /007/ && $host != 'www.007.cn' ) {rewrite ^/(.*)$ http://47.13.13.36/$1 permanent;
}
[root@007 vhosts]# nginx -t
nginx: [emerg] invalid condition "$host" in /usr/local/nginx/conf/vhosts/007.conf:6
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

     于是我带着程序语言的逻辑认真地检查配置文件的语法,依然没发现哪里有异常,后来才知道nginx的配置中不支持if条件的逻辑与&& 逻辑或|| 运算,而且不支持if的嵌套语法:nginx通过ngx_http_rewrite_module模块支持url rewritet和if条件判断,但不支持else。另外该模块需要PCRE支持,应在编译nginx时指定PCRE支持。根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可以执行10次,超过后nginx将返回500错误。同时,重写模块可以包含set指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。学习rewrite之前要对正则表达式要很熟悉,常用的正则表达式元字符如下:

#nginx常用的正则表达式
.     :匹配除换行符以外的任意字符
?     :重复0次或1次
+     :重复1次或更多次
*     :重复0次或更多次
\d    :匹配数字
^     :匹配字符串的开始字符
$     :匹配字符串的结束字符
{n}   :重复n次
{n,}  :重复n次或更多次
[c]   :匹配单个字符c
[a-z] :匹配a-z小写字母的任意一个
#在rewrite中,如果使用小括号(),那么在小括号之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。

    所以上述配置会报下面的错误:nginx: [emerg] invalid condition。所以上面的这方法是行不通的,改成两个if条件嵌套也一样不行,我这里的条件到是简单,一想,我这个可以改为:

if ( $host = '007.cn' ) { rewrite ^/(.*)$ http://47.13.13.26/$1 permanent;
}
#还可以这样:
if ( $host ~ ^007 ) {rewrite ^/(.*)$ http://47.13.13.26/$1 permanent;
}

        另外对于上面的问题,如果不能像以上压缩到一个条件解决的话,可以使用间接变量的方式来实现,这个在程序逻辑里我们也经常使用, 方法如下:

set $flag 0;
if ($host ~ '007' ){set $flag "${flag}1";
}
if ($host != 'www.007.cn'){set $flag "${flag}1";
}
if ($flag = "011"){rewrite ^/(.*)$ http://47.13.13.26/$1 permanent;
}

        但在进行上述试验后,我想使用一个假域名指host访问阿里云主机,发现阿里云会阻止这样的访问:

该网站暂时无法访问尊敬的用户,您好
很抱歉,该网站暂时无法访问,可能由以下原因导致:
原因一:未备案或未接入;根据《非经营性互联网信息服务备案管理办法》,网站需要完成备案或接入。
原因二:网站内容与备案信息不符或备案信息不准确;根据《非经营性互联网信息服务备案管理办法》,网站内容需要与备案信息一致,且备案信息需真实有效。建议网站管理员尽快修改网站信息。

这篇关于关于thinkPHP3.2中的rewrite不严谨问题会导致网站被注入以及nginx配置中的if多条件判断问题-阿里云阻止指host访问的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101979

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1