第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找到漏洞进行复现。如果是别的那就自己审计

相关推荐
misty youth几秒前
Navicat与PHPstudy小皮
mysql·adb·php·navicat
问心无愧051337 分钟前
[GXYCTF2019]Ping Ping Ping
android·笔记
事圆则缓1 小时前
Kotlin 异步与并发:从一次搜索请求走到状态流
android·开发语言·kotlin
遇印记1 小时前
应用层,网络管理
运维·网络·windows·学习·安全
帅得不敢出门2 小时前
Android Framework定制卸载确认窗口
android
无障碍研究院2 小时前
2026TADC|李璀:从标准走向落地,拆解无障碍产品合规实操方案
安全·web安全
qq_443132412 小时前
数字资产安全治理平台是什么:定义、核心能力与选型要点
网络·安全
江湖有缘2 小时前
Docker实战 | 使用Docker部署HarborGuard容器安全扫描平台
安全·docker·容器
I肆逸I3 小时前
OpenStack 管理:从认证、计算到存储与网络
网络·php·openstack
福狼3 小时前
Go 用户密码存储实践:从 MD5 到 Argon2id
安全