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

相关推荐
yueqc12 小时前
Android 线程梳理
android·线程
edisao2 小时前
四。SpaceX、网络化与未来的跨越:低成本、高频次的真正威胁
大数据·开发语言·人工智能·科技·php
顾林海2 小时前
Android登录模块设计:别让“大门”变成“破篱笆”
android·经验分享·面试·架构·移动端
小小代码狗2 小时前
PHP伪协议和文件包含
网络·网络安全·php
聚铭网络2 小时前
聚铭网络再次入选数世咨询《中国数字安全价值图谱》“日志审计”推荐厂商
网络·安全
工业HMI实战笔记2 小时前
HMI权限分级设计:兼顾安全与操作效率的平衡术
运维·数据库·安全·ui·自动化·人机交互·交互
qq_406176142 小时前
深耕JS防抖与节流:从原理到工程化实践的全方位指南
开发语言·php
嵌入式-老费2 小时前
Android开发(总结)
android
php_kevlin3 小时前
websocket实现站内信
android·websocket·网络协议