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

news2024/11/22 23:23:55

时间轴

演示案例

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){
            // 成功上传后 获取上传信息
            // 输出 jpg
            echo $info->getExtension();
            // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
            echo $info->getSaveName();
            // 输出 42a79759f284b767dfcb2a0197904287.jpg
            echo $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后,就可以实现逻辑越权,从普通用户变成管理员。
本文章由李豆豆喵和番薯小羊卷~共同完成。

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

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

相关文章

【自动驾驶】数据集合集!

本文将为您介绍经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 Automatic-driving-Test 更新时间&#xff1a;2024-07-26 访问地址: GitHub 描述&#xff1a; 该模型使用 ultralytics yolo v8 和 deepsort 方法来检测车道与车轮的碰撞并跟踪车辆。…

Leetcode 完全二叉树的节点个数

不讲武德的解法 java 实现 class Solution {public int countNodes(TreeNode root) {if(root null) return 0;return countNodes(root.left) countNodes(root.right) 1;} }根据完全二叉树和满二叉树的性质做 class Solution {public int countNodes(TreeNode root) {if (r…

力扣面试题 - 24 插入

题目&#xff1a; 给定两个整型数字 N 与 M&#xff0c;以及表示比特位置的 i 与 j&#xff08;i < j&#xff0c;且从 0 位开始计算&#xff09;。 编写一种方法&#xff0c;使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域&#xff0c;不足之处用 0 补齐…

Elasticsearch 中的热点以及如何使用 AutoOps 解决它们

作者&#xff1a;来自 Elastic Sachin Frayne 探索 Elasticsearch 中的热点以及如何使用 AutoOps 解决它。 Elasticsearch 集群中出现热点的方式有很多种。有些我们可以控制&#xff0c;比如吵闹的邻居&#xff0c;有些我们控制得较差&#xff0c;比如 Elasticsearch 中的分片分…

Matlab多输入单输出之倾斜手写数字识别

本文主要介绍使用matlab构建多输入单输出的网络架构&#xff0c;来实现倾斜的手写数字识别&#xff0c;使用concatenationLayer来拼接特征&#xff0c;实现网络输入多个特征。 1.加载训练数据 加载数据&#xff1a;手写数字的图像、真实数字标签和数字顺时针旋转的角度。 lo…

Nacos实现IP动态黑白名单过滤

一些恶意用户&#xff08;可能是黑客、爬虫、DDoS 攻击者&#xff09;可能频繁请求服务器资源&#xff0c;导致资源占用过高。因此我们需要一定的手段实时阻止可疑或恶意的用户&#xff0c;减少攻击风险。 本次练习使用到的是Nacos配合布隆过滤器实现动态IP黑白名单过滤 文章…

如何在Word文件中设置水印以及如何禁止修改水印

在日常办公和学习中&#xff0c;我们经常需要在Word文档中设置水印&#xff0c;以保护文件的版权或标明文件的机密性。水印可以是文字形式&#xff0c;也可以是图片形式&#xff0c;能够灵活地适应不同的需求。但仅仅设置水印是不够的&#xff0c;有时我们还需要确保水印不被随…

测试工程师如何在面试中脱颖而出

目录 1.平时工作中是怎么去测的&#xff1f; 2.B/S架构和C/S架构区别 3.B/S架构的系统从哪些点去测&#xff1f; 4.你为什么能够做测试这一行&#xff1f;&#xff08;根据个人情况分析理解&#xff09; 5.你认为测试的目的是什么&#xff1f; 6.软件测试的流程&#xff…

jenkins的安装(War包安装)

‌Jenkins是一个开源的持续集成工具&#xff0c;基于Java开发&#xff0c;主要用于监控持续的软件版本发布和测试项目。‌ 它提供了一个开放易用的平台&#xff0c;使软件项目能够实现持续集成。Jenkins的功能包括持续的软件版本发布和测试项目&#xff0c;以及监控外部调用执行…

无线感知会议系列【15】DPSense-2

接&#xff1a; 无线感知会议系列【15】DPSense-1 目录&#xff1a; 实验 讨论 结论 附录 一 实验 在本节中&#xff0c;我们通过全面的实验验证了所提出的DPSense系统的有效性。首先&#xff0c;我们将我们的方法与三种最先进的技术进行了比较。然后&#xff0c…

AI编程入门指南002:API、数据库和应用部署

进阶概念教程&#xff1a;API、数据库和应用部署 在学习了编程的基础概念后&#xff0c;我们将进入更高级的内容。本文将详细介绍API、数据库和应用部署三个进阶概念&#xff0c;并通过丰富的示例和形象的说明帮助你更好地理解这些内容。 1. API&#xff08;应用程序接口&#…

Docker3:docker基础1

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

《Django 5 By Example》阅读笔记:p645-p650

《Django 5 By Example》学习第8天&#xff0c;p645-p650总结&#xff0c;总计6页。 一、技术总结 1.django-rest-framework (1)serializer p648, Serializer: Provides serialization for normal Python class instances。Serializer又细分为Serializer, ModelSerializer,…

【机器学习】回归模型(线性回归+逻辑回归)原理详解

线性回归 Linear Regression 1 概述 线性回归类似高中的线性规划题目。线性回归要做的是就是找到一个数学公式能相对较完美地把所有自变量组合&#xff08;加减乘除&#xff09;起来&#xff0c;得到的结果和目标接近。 线性回归分为一元线性回归和多元线性回归。 2 一元线…

【大模型推理】vLLM 源码学习

强烈推荐 https://zhuanlan.zhihu.com/p/680153425 sequnceGroup 存储了相同的prompt对应的不同的sequence, 所以用字典存储 同一个Sequence可能占据多个逻辑Block&#xff0c; 所以在Sequence 中用列表存储 同一个block 要维护tokens_id 列表, 需要添加操作。 还需要判断blo…

FIFO和LRU算法实现操作系统中主存管理

FIFO&#xff0c;用数组实现 1和2都是使用nextReplace实现新页面位置的更新 1、不精确时间&#xff1a;用ctime输出运行时间都是0.00秒 #include <iostream> #include <iomanip> #include<ctime>//用于计算时间 using namespace std;// 页访问顺序 int pa…

【Ubuntu24.04】VirtualBox安装ubuntu-live-server24.04

目录 0 背景1 下载镜像2 安装虚拟机3 安装UbuntuServer24.044 配置基本环境5 总结0 背景 有了远程连接工具之后,似乎作为服务器的Ubuntu24.04桌面版有点备受冷落了,桌面版的Ubuntu24.04的优势是图形化桌面,是作为一个日常工作的系统来用的,就像Windows,如果要作为服务器来…

《SpringBoot、Vue 组装exe与套壳保姆级教学》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

Flowable第一篇、快速上手(Flowable安装、配置、集成)

目录 Flowable 概述Flowable的安装与配置 2.1. FlowableUI安装 2.2. Flowable BPMN插件下载 2.3 集成Spring Boot流程审核操作 3.3 简单流程部署 3.4 启动流程实例 3.5 流程审批 一、Flowable 概述 Flowable是一个轻量级、高效可扩展的工作流和业务流程管理&#xff08;BPM&…

Docker搭建有UI的私有镜像仓库

Docker搭建有UI的私有镜像仓库 一、使用这个docker-compose.yml文件&#xff1a; version: 3services:registry-ui:image: joxit/docker-registry-ui:2.5.7-debianrestart: alwaysports:- 81:80environment:- SINGLE_REGISTRYtrue- REGISTRY_TITLEAtt Docker Registry UI- DE…