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