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

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

thinkphp5.1

复制代码
application/
└── index/          ← 模块名 index
└── controller/ ← 控制器目录(不参与 URL)
  └── Index.php ← 控制器文件

index.php / 模块 / 控制器 / 方法

访问:index.php / index / Index / index
app\index\controller\Index::index()
测试代码
复制代码
http://thinkphp5.com/index.php/index/index/hello/name/112719413
php 复制代码
<?php
namespace app\index\controller;

use think\Request;
class Index
{
    public function index()
    {
        return 123;

    }

    public function hello(Request $request)
    {
        return 'hello,' . $request->param('name');
    }
}

可以添加test目录进行测试

MVC

model view controller

模版 视图 控制器

MySQL测试
php 复制代码
<?php
namespace app\test\controller;
use think\Db;
use think\Request;

class Test
{
    public function index()
    {
        return 'nskjkdbksbd';
    }

    public function hello(Request $request)
    {
        return '7777,' . $request->param('name');
    }

    public function testsql()
    {
        $id=request()->param('x');
        $data = Db::table('new')->where('id',$id)->select();
        return json($data);
    }
}
复制代码
http://thinkphp5.com/index.php/test/test/testsql/x/1
http://thinkphp5.com/index.php/test/test/testsql/x/1%20or%201=1
内置过滤,只有1的时候有用,如果是"1 and 2=1"之类的没有任何反应

实验结果表名:使用thinkphp有内置过滤,比原生态代码强,防止SQL注入

1、使用TP框架操作数据库 默认是收到框架内置过滤保护

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

文件上传

在之前的test/controller/Test.php 改成下面代码

php 复制代码
<?php
namespace app\test\controller;
use think\Db;
use think\Request;
public function upload(){
        // 获取表单上传文件 例如上传了001.jpg
        $file = request()->file('image');
        // 移动到框架应用根目录/uploads/ 目录下
        $info = $file->validate(['size'=>15678,'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();
        }
    }

在public目录里创一个upload.html文件

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>
复制代码
http://thinkphp5.com/upload.html
访问上传测试即可
view
view渲染

渲染模板最常用的是控制器类在继承系统控制器基类(\think\Controller)后调用fetch方法,调用格式:

fetch('[模板文件]'[,'模板变量(数组)'])

模板文件的写法支持下面几种:

用法 描述
不带任何参数 自动定位当前操作的模板文件
[模块@][控制器/][操作] 常用写法,支持跨模块
完整的模板文件名 直接使用完整的模板文件名(包括模板后缀)

下面是一个最典型的用法,不带任何参数:

php 复制代码
<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
class Index extends Controller
{
    public function index()
    {
        return $this->fetch();


    public function hello(Request $request)
    {
        return 'hello,' . $request->param('name');
    }
}

表示系统会按照默认规则自动定位模板文件,其规则是:

复制代码
当前模块/view/当前控制器名(小写)/当前操作(小写).html

application/
└── index/          ← 模块名 index
└── controller/ ← 控制器目录(不参与 URL)
   └── Index.php ← 控制器文件
└── view/
	└── index/
		└── index.html

访问:http://thinkphp5.com/index.php/index/index/index
view赋值
复制代码
application/
└── index/          ← 模块名 index
└── controller/ ← 控制器目录(不参与 URL)
   └── Index.php ← 控制器文件
└── view/
	└── index/
		└── index.html
		└── test.html

Index.php

php 复制代码
<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
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');//这里可以修改,换成test
    }

}

index.html

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

test.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{$email}</title>
</head>
<body>
这里是test
</body>
</html>

看安全

1、版本漏洞

版本的内置安全漏洞

2、安全写法

3、半安全+半原生

4、原生写法

弹幕

思路流程,根据抓包获取特征文件,去github或者gitee搜索特征文件,尝试找到源码。对源码进行下载,如果是thinphp则查看版本,去cve找到漏洞进行复现。如果是别的那就自己审计

相关推荐
二流小码农3 小时前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少3 小时前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker3 小时前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋4 小时前
Android 协程时代,Handler 应该退休了吗?
android
用户9623779544817 小时前
DVWA 靶场实验报告 (High Level)
安全
火柴就是我17 小时前
让我们实现一个更好看的内部阴影按钮
android·flutter
数据智能老司机20 小时前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机20 小时前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954481 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star1 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全