think5审计与调试技巧1


think5审计与调试技巧1

think5是一个非常流行的框架, 现在的cms很多都采用了think5作为开发框架.这就带来一个问题, 没用过的安全人员审计的时候就非常懵逼了.

例如 程序入口在哪? orm操作都是这种函数 Db::name($modeln['tablename'])->where('id',$id)->setInc('click'); 怎么操作才会出现sql注入?

这就需要框架知识了,但是学习整个框架又太多, 不学又不知道怎么审计.所以这个系列旨在带来足以审计的think5框架知识,而不太复杂

整体目录结构

think5 主要需要关注的目录如下

1
2
3
4
5
6
7
8
├── application 应用目录(可设置)
├── config 配置目录 
├── extend 扩展类库目录(可定义)
├── public 网站目录
├── route   路由
├─- runtime  应用的运行时目录(可写,可设置)
├── thinkphp 框架目录
└── vendor 第三方库

我们审计主要看application 目录

5.0 官方给的目录参考是

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
├─application           应用目录(可设置)
│  ├─common             公共模块目录(可更改)
│  ├─index              模块目录(可更改)
│  │  ├─config.php      模块配置文件
│  │  ├─common.php      模块函数文件
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  └─ ...            更多类库目录
│  ├─command.php        命令行工具配置文件
│  ├─common.php         应用公共(函数)文件
│  ├─config.php         应用(公共)配置文件
│  ├─database.php       数据库配置文件
│  ├─tags.php           应用行为扩展定义文件
│  └─route.php          路由配置文件

但是事实可能缺失很多部分 例如nonecms 的目录是

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

├── admin
│   ├── behavior
│   ├── config
│   ├── controller
│   ├── rbac.php
│   ├── tags.php
│   ├── validate
│   └── view
├── command.php
├── common
│   ├── lib
│   ├── model
│   └── taglib
├── common.php
├── index
│   ├── config
│   └── controller
├── mobile
│   ├── config
│   └── controller
└── push
    ├── controller
    └── service

think5 url

最常见的think5 url是

http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数名/参数值...]

http://serverName/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值...]

index.php/index/blog/read index.php?s=/index/blog/read

其他方式也有 但是基本大同小异 例如index/listing/index/cid/47.html

配置文件

think5.1 配置文件在config目录 5.0在application/config.php

常见的配置文件

app.php cache.php cookie.php database.php log.php session.php template.php trace.php

最重要的配置文件是app.php

主要需要关注的配置如下

1
2
3
4
5
6
7
8
// 应用调试模式
'app_debug'              => true,
// 应用Trace
'app_trace'              => true,
// 默认全局过滤方法 用逗号分隔多个
'default_filter'         => '',
// 禁止访问模块
'deny_module_list'       => ['common'],

app_debugapp_trace 建议设置成true.

调试模式下异常会显示详细信息,而不是通用报错界面

app_trace 则会在右下角显示一个按钮,根据设置可以显示执行路径,执行sql等等

如果没有显示,需要添加

1
2
3
4
5
// Trace信息
'trace'     =>  [
    //支持Html,Console
    'type'  =>  'html',
] 

如果没有看到这个设置 可能在trace.php中设置

1
2
3
4
5
<?php
return [
    // 内置Html Console 支持扩展
    'type' => 'Html',
];

xxx.php 对应的是app.php里的xxx设置

default_filter 可能的值是函数, 例如 strip_tags 等于对所有用户传入的参数执行过滤.

deny_module_list 则是禁止访问的模块

日志

config/log.php

1
2
3
4
5
6
7
8
return [
    // 日志记录方式,内置 file socket 支持扩展
    'type'  => 'File',
    // 日志保存目录
    'path'  => '',
    // 日志记录级别
    'level' => [],
];

默认路径是在runtime/log

数据库trace

app_trace设置后会发现并没有sql记录,这个需要在database.php添加

1
'debug'       => true,

不过就算你看到你的sql注入进入了显示的语句, 但是由于thinkphp5的参数绑定, 很可能并没有生效.

路由

路由对审计影响其实不大, 毕竟url怎么改, 真正的执行代码也不会变.建议扫描性的看一下,是否有开发不小心把调试用的路由留在上面了..