thinkphp审计
Comment前言
自己在这个框架上栽了也不指一次两次了,有句话说的好再一再二不再三遂打算深入学习一下.
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注入。
结尾
停滞了好久,实在没精力了先这样未完待续……