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

news2024/11/24 18:58:14

一、关于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访问阿里云主机,发现阿里云会阻止这样的访问:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网横向移动常用方法

横向移动 #横向移动含义 横向移动是以已经被攻陷的系统为跳板&#xff0c;通过收集跳板机的信息&#xff08;文档&#xff0c;存储的凭证&#xff0c;ipc连接记录等等信息&#xff09;来访问其他域内主机。#常见横向手段 1&#xff0c;通过相同的用户名密码批量ipc连接其他域内…

【C++二分查找 】1477. 找两个和为目标值且不重叠的子数组

本文涉及的基础知识点 C二分查找 C算法&#xff1a;滑动窗口总结 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode1477. 找两个和为目标值且不重叠的子数组 给你一个整数数组 arr 和一个整数值 target 。 请你在 arr 中找 两个互…

C语言 | Leetcode C语言题解之第368题最大整除子集

题目&#xff1a; 题解&#xff1a; int cmp(int* a, int* b) {return *a - *b; }int* largestDivisibleSubset(int* nums, int numsSize, int* returnSize) {int len numsSize;qsort(nums, numsSize, sizeof(int), cmp);// 第 1 步&#xff1a;动态规划找出最大子集的个数、…

Java | Leetcode Java题解之第371题两整数之和

题目&#xff1a; 题解&#xff1a; class Solution {public int getSum(int a, int b) {while (b ! 0) {int carry (a & b) << 1;a a ^ b;b carry;}return a;} }

【Python】函数内的全局变量关键字gobal值,在函数外调用,有块“免死金牌”

在python世界里&#xff0c;全局变量global关键字&#xff0c;在函数间的跳转&#xff0c;就像是被赋予独立于体系的全局者&#xff0c;拥有一块“免死金牌”。 他拥有一种特权——它只是函数内部的对象&#xff0c;但是却能在函数外&#xff0c;亮出自己身份的全局变量&#…

浅拷贝和深拷贝(图文详解)

前端面试中&#xff0c;面试官经常会提到关于浅拷贝和深拷贝的问题。但是我总是理解于它的表面&#xff0c;面试中再深挖一点就会卡壳&#xff0c;我想把我的理解写下来&#xff0c;希望可以帮助到大家&#xff0c;如果有错误的地方希望大家可以指正&#xff0c;以免误导~ 看这…

mysql的安装与初始化

mysql mysql5.7.40下载链接 mysql安装文档 1. 编译安装过程 yum install -y cmake # 安装cmake tar xf mysql-boost-5.7.40.tar.gz cd /root/mysql-5.7.40 cmake -LH # 查看cmake的默认参数&#xff0c;需要进入mysql目录 yum install -y gcc-c.x86_64 yum install -y bis…

漏洞挖掘 | 记一次伪静态页面的SQL注入

前言 最近工作繁忙&#xff0c;许久没有挖洞&#xff0c;打开度娘&#xff0c;凡事随缘&#xff0c;偶米头发~~(⊙﹏⊙) 涉及技能点 SQL注入基础原理 盲注常用函数及思路 burpsuite基础知识 过程记录 1.发现 在翻阅一EDU站点时&#xff0c;发现路径中带有明显的数字参数 …

Java语言程序设计基础篇_编程练习题*17.1 (创建一个文本文件)

题目&#xff1a;*17.1 (创建一个文本文件) 编写一个程序&#xff0c;如果文件 Exercise17_01.txt 不存在&#xff0c;就创建一个名为 Exercise17_01.txt 的文件。向这个文件追加新数据。使用文本 I/O 将 100 个随机生成的整数写入这个文件。文件中的整数用空格分隔。 习题思路…

Sqlite3数据库表内数据批量读取操作---sqlite3_stmt机制

0、引言 在前面两篇文章已经对数据环境搭建、数据批量写入库中进行了较为详细的讲解。因此&#xff0c;基于前两篇文章内容的基础上&#xff0c;本文主要从数据库中批量数据读取操作进行梳理讲解。 嵌入式数据库SQLite 3配置使用详细笔记教程_sqlite3-CSDN博客 SQLite 3 优化批…

TCP与UDP传输的学习

void *memset(void *s, int c, size_t n); 功能&#xff1a;将一块内存空间的每个字节都设置为指定的值&#xff1b;这个函数通常用于初始化一个内存空间&#xff0c;或者清空一个空间&#xff1b; 参数&#xff1a;viod * s 空类型指针&#xff0c;指向要填充内存块&#xf…

android13 隐藏状态栏里面的飞行模式 隐藏蓝牙 隐藏网络

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码分析 4.代码修改 5.编译运行 6.彩蛋 1.前言 android13 隐藏状态栏里面的飞行模式,或者其他功能,如网络,蓝牙等等功能,隐藏下图中的一些图标。 2.问题分析 这里如果直接找这个布局的话,需要跟的逻…

ubuntu /windows 安装COLMAP

目录 一、COLMAP简介 二、ubuntu安装COLMAP 三、windows安装COLMAP 一、COLMAP简介 COLMAP 是一款用于3D重建和图像处理的软件&#xff0c;它结合了计算机视觉算法和优化技术&#xff0c;用于从一组图像中构建三维结构。COLMAP 是一个全功能的通用视觉测距和三维建模工具&a…

免费的AI认证考试

努力保持领先地位 过去几年&#xff0c;科技行业发展速度越来越快&#xff0c;尤其是人工智能和大型语言模型(LLM) 的出现。 作为该领域的资深软件开发人员&#xff0c;我也注意到一个人的经验很快就会变得过时。 就在几年前&#xff0c;神经网络和深度学习风靡一时。虽然这…

三星计划今年HBM4设计,2025年初开始样品测试

三星计划今年晚些时候完成首款HBM4内存设备的设计定稿&#xff0c;2025年初开始样品测试 根据nN Elec援引行业消息人士的报道&#xff0c;三星计划在今年晚些时候完成首款HBM4内存设备的设计定稿&#xff0c;并预计将于2025年初开始样品测试。该公司预计将采用其最新一代10纳米…

全新 Firebase AI 开发助手,助力构建应用的每一步

作者 / 助理产品经理实习生 Aayush Bandopadhyay 使用 Firebase 构建应用可以变得更加简单&#xff01; 了解 Firebase 中的 Gemini&#xff0c;从构思应用创意到编写安全代码&#xff0c;都将成为您的最佳助手。这个功能强大的新工具集成在 Firebase 控制台中&#xff0c;可以…

如何在算家云搭建模型mPLUG-Owl3(智能对话)

一、模型介绍 1. 项目背景与概述 mPLUG-Owl3 是阿里巴巴 mPLUG 团队最新发布的通用多模态大模型&#xff0c;该模型在理解和处理复杂多图及长视频内容方面实现了显著突破。这一创新成果不仅提升了模型的推理效率&#xff0c;还保持了高度的准确性&#xff0c;为多模态大模型的…

计算机毕业设计选题推荐-花园管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Blender----利用DEM(tif)生成三维模型

首先需要安装Blender GIS这个插件&#xff1a;https://github.com/domlysz/BlenderGIS 一、TIFF的导入 可以通过GIS桌面端线查看DEM数据的信息&#xff0c;在blender中我们最好把TIF转换成3857或者其他投影的形式&#xff0c;推荐转成3857(web mector)投影是因为构建的模型可…

Leetcode-day31-01背包问题

46. 携带研究材料 1.dp数组代表的是什么&#xff1f; 这里的dp数组是一个二维数组&#xff0c;dp[i][j]是从前i个物品中任选放入容量j内的最大价值。 2.递推公式。 不放物品i&#xff1a;由dp[i - 1][j]推出&#xff0c;即背包容量为j&#xff0c;里面不放物品i的最大价值&am…