前言

自己在这个框架上栽了也不指一次两次了,有句话说的好再一再二不再三遂打算深入学习一下.

thinkphp配置

MVC认知

MVC是一种将视图、控制、数据三者分开的一种开发模式:

M-Model模型 编写model类,负责逻辑业务、数据处理

V-View视图 编写html文件,负责前台js页面显示

C-Controller 编写类文件,IndexController.class.php,对web应用进行控制、修改、删除等操作

配置

1、配置数据库,可以将Thinkphp目录下的配置信息复制到Home目录下

2、开启页面Trace:’SHOW_PAGE_TRACE’ =>true,添加到配置文件

出现如上情形说明前期准备已经OK。

控制器

附上官方手册给的典型控制器类的定义:

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
    public function hello(){
        echo 'hello,thinkphp!';
    }
}

这里主要说的是A方法,需要跨控制器调用官方提供了快捷调用方法A。

A('模块/控制器')
//当控制器层名称不是 Controller 时须这样写
A('模块/控制器','控制器层名称')

当我们在审计时遇到A方法一定要跟进查看。

SQL注入

where方法

where方法的参数支持字符串和数组

在index控制器调用where方法传入字符串参数查询数据

    $data = M('User')->where('id='.I('id'))->find();
    dump($data);

可以看到如果没有在I方法中对参数进行过滤或者没有采用预处理、传入数组参数的方式,那么单纯调用where方法传入字符串参数是不安全的,是我们在审计的时候要注意的地方。

table方法

通常情况下table方法:

1、切换操作的数据表;

2、对多表进行操作;

test
M()->table(I('table'))->where('1=1')->find();

我们构造语句进行简单测试,结果如下图所示:

可以看到我们传入正确的表名执行的sql语句,只要我们继续构造很容易造成注入。

field方法 //union、join、alias类似

field主要是标识要返回或者操作的字段,可以用于查询和写入操作。

官方文档给出三种查询方式,字符串、数组、数组别名,主要参数可控都是能产生注入的。

test
M('user')->field(array('id','username'=>I('uname')))->select();


闭合引号很容易产生注入

order group having

return !empty($order)?  ' ORDER BY '.$order:'';
return !empty($group)? ' GROUP BY '.$group:'';
return  !empty($having)?   ' HAVING '.$having:'';

我们可以看到源码中他们都是使用拼接方式直接拼接出来的,如果输入可控都存在注入。

以order举例
M('User')->where(1=1)->order(array('id'=>I('order')))->select();


//query、execute、聚合方法也是同样道理

表达式注入

exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。查询表达式不仅可用于查询条件,也可以用于数据更新

 $map = array();
    $map['id'] = $_GET['id'];
    $data = M('User')->where($map)->find();
    dump($data);
}

可以看到上述代码中参数如果没有用I()方法传入的话就会引发注入,$_GET引入可以传入数组类型参数引发exp注入。

结尾

停滞了好久,实在没精力了先这样未完待续……