一、Thinkphp基本结构
1、框架目录
www WEB部署目录(或者子目录) ├─application 应用目录 │ ├─common 公共模块目录(可以更改) │ ├─module_name 模块目录 │ │ ├─common.php 模块函数文件 │ │ ├─controller 控制器目录 │ │ ├─model 模型目录 │ │ ├─view 视图目录 │ │ ├─config 配置目录 │ │ └─ ... 更多类库目录 │ │ │ ├─command.php 命令行定义文件 │ ├─common.php 公共函数文件 │ └─tags.php 应用行为扩展定义文件 │ ├─config 应用配置目录 │ ├─module_name 模块配置目录 │ │ ├─database.php 数据库配置 │ │ ├─cache 缓存配置 │ │ └─ ... │ │ │ ├─app.php 应用配置 │ ├─cache.php 缓存配置 │ ├─cookie.php Cookie配置 │ ├─database.php 数据库配置 │ ├─log.php 日志配置 │ ├─session.php Session配置 │ ├─template.php 模板引擎配置 │ └─trace.php Trace配置 │ ├─route 路由定义目录 │ ├─route.php 路由定义 │ └─... 更多 │ ├─public WEB目录(对外访问目录) │ ├─index.php 入口文件 │ ├─router.php 快速测试文件 │ └─.htaccess 用于apache的重写 │ ├─thinkphp 框架系统目录 │ ├─lang 语言文件目录 │ ├─library 框架类库目录 │ │ ├─think Think类库包目录 │ │ └─traits 系统Trait目录 │ │ │ ├─tpl 系统模板目录 │ ├─base.php 基础定义文件 │ ├─convention.php 框架惯例配置文件 │ ├─helper.php 助手函数文件 │ └─logo.png 框架LOGO文件 │ ├─extend 扩展类库目录 ├─runtime 应用的运行时目录(可写,可定制) ├─vendor 第三方类库目录(Composer依赖库) ├─build.php 自动生成定义文件(参考) ├─composer.json composer 定义文件 ├─LICENSE.txt 授权说明文件 ├─README.md README 文件 ├─think 命令行入口文件
2、判断框架、版本
在源码中搜Thinkphp,如果有就是Thinkphp框架
搜THINK_VERSION可以看到相应的版本信息
3、入口文件
关键词APP_PATH
定义应用目录、框架入口文件
按住Ctrl再点击这个目录,就会在左边目录栏跳转到这个目录位置
4、资源文件
均放在public的目录下,找不到的话会爆路径错误情况
public ├─index.php 应用入口文件 ├─static 静态资源目录 │ ├─css 样式目录 │ ├─js 脚本目录 │ └─img 图像目录 │─router.php 快速测试文件 └─.htaccess 用于apache的重写
5、调试开关
审计的时候,需要将false改为true
如果直接搜debug的话,可能会搜到convention.php上的debug
默认情况下: // 应用调试模式 'app_debug' => false, // 应用Trace 'app_trace' => false,
6、URL路由
①方法/变量值进行传参 http://domainName/index.php/模块/控制器/操作/方法/变量值 eg:访问www.xxx.com/index.php/index/index/index 为application目录下的index模块下的从contraller目录下的index文件下的index函数 ②变量传参 http://tp5.com/index.php?s=/index/Index/index
二、基本函数
1、请求
Request对象进行调用
获取请求变量
利用:寻找用户可控的变量(且传入给有一定功能的函数)
1、param()
获取所有请求变量
param('指定的函数对象','未获取到时的默认值','对于获取到的值的处理函数')
$request->param():用于获取所有的变量(优先级:路由变量 > 当前请求变量($_POST) > $_GET变量
2、get()
获取$_GET变量
$request->get('指定的函数对象')
echo input('get.函数对象')
3、
post()获取$_POST
file()获取$_FILE
ip()获取请求IP
method()获取请求方法
pathInfo()获取控制器和方法名的路径
rootInfo()获取路由
2、交互:
配置:
1、代码过滤
2、过滤器过滤
3、模块过滤
4、预编译,使用占位符
……
利用:
1、判断代码绕过条件
2、过滤器漏洞
3、寻找未使用过滤模块的地方
4、不安全的过滤
……
3、响应:
1、配置自动输出
配置:在config.ph中设置default_return_type更改默认返回类型
利用:寻找模板存在的漏洞、寻找未引用模板的目录
2、函数输出
配置:
return 格式类型json($data,201,['set_cookie'=>'xxxx'])
利用:寻找用户可控值
3、重定向
eg:
if($userid>=0){$this->success("提示语","user跳转页面")}
else{ $this->error("错误提示语")}
利用:看是否能利用重定向漏洞,跳转到其他不安全地方
三、危险函数
四、已有漏洞
针对未公开的漏洞
根据描述寻找到未公开的漏洞点
五、漏洞检测工具
针对已公开的漏洞
大佬集成了一个工具箱,可以关注公众号以后免费下载
六、工具
Seay
RIPS
CheckMarx
Fortify
VCG
Kunlun-M