第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<?phpnamespaceapp\index\controller;usethink\Request;classIndex{publicfunctionindex(){return123;}publicfunctionhello(Request$request){return'hello,'.$request->param('name');}}可以添加test目录进行测试
MVC
model view controller
模版 视图 控制器
MySQL测试
<?phpnamespaceapp\test\controller;usethink\Db;usethink\Request;classTest{publicfunctionindex(){return'nskjkdbksbd';}publicfunctionhello(Request$request){return'7777,'.$request->param('name');}publicfunctiontestsql(){$id=request()->param('x');$data=Db::table('new')->where('id',$id)->select();returnjson($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 改成下面代码
<?phpnamespaceapp\test\controller;usethink\Db;usethink\Request;publicfunctionupload(){// 获取表单上传文件 例如上传了001.jpg$file=request()->file('image');// 移动到框架应用根目录/uploads/ 目录下$info=$file->validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move('../uploads');if($info){// 成功上传后 获取上传信息// 输出 jpgecho$info->getExtension();// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpgecho$info->getSaveName();// 输出 42a79759f284b767dfcb2a0197904287.jpgecho$info->getFilename();}else{// 上传失败获取错误信息echo$file->getError();}}在public目录里创一个upload.html文件
<formaction="/index.php/test/test/upload"enctype="multipart/form-data"method="post"><inputtype="file"name="image"/><br><inputtype="submit"value="上传"/></form>http://thinkphp5.com/upload.html 访问上传测试即可view
view渲染
渲染模板最常用的是控制器类在继承系统控制器基类(\think\Controller)后调用fetch方法,调用格式:
fetch(‘[模板文件]’[,‘模板变量(数组)’])
模板文件的写法支持下面几种:
| 用法 | 描述 |
|---|---|
| 不带任何参数 | 自动定位当前操作的模板文件 |
| [模块@][控制器/][操作] | 常用写法,支持跨模块 |
| 完整的模板文件名 | 直接使用完整的模板文件名(包括模板后缀) |
下面是一个最典型的用法,不带任何参数:
<?phpnamespaceapp\index\controller;usethink\Controller;usethink\Request;classIndexextendsController{publicfunctionindex(){return$this->fetch();publicfunctionhello(Request$request){return'hello,'.$request->param('name');}}表示系统会按照默认规则自动定位模板文件,其规则是:
当前模块/view/当前控制器名(小写)/当前操作(小写).htmlapplication/ └── index/ ← 模块名 index └── controller/ ← 控制器目录(不参与 URL) └── Index.php ← 控制器文件 └── view/ └── index/ └── index.html访问:http://thinkphp5.com/index.php/index/index/indexview赋值
application/ └── index/ ← 模块名 index └── controller/ ← 控制器目录(不参与 URL) └── Index.php ← 控制器文件 └── view/ └── index/ └── index.html └── test.htmlIndex.php
<?phpnamespaceapp\index\controller;usethink\Controller;usethink\Request;classIndexextendsController{publicfunctionindex(){// 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
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>{$name}</title></head><body>{$email}</body></html>test.html
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>{$email}</title></head><body>这里是test</body></html>看安全
1、版本漏洞
版本的内置安全漏洞
2、安全写法
3、半安全+半原生
4、原生写法
弹幕
思路流程,根据抓包获取特征文件,去github或者gitee搜索特征文件,尝试找到源码。对源码进行下载,如果是thinphp则查看版本,去cve找到漏洞进行复现。如果是别的那就自己审计