从ThinkPHP谈基于框架开发程序的安全性二,继续讨论基于框架开发可能带来的问题,厂商忽略不忽略都没关系,主要是给大家提出来,不管是程序员安全意识的问题,还是框架本身的设计缺陷,总之在使用这些框架开发时不要给自己挖坑了。
首先我们来看看官方文档:
http://document.thinkphp.cn/manual_3_2.html#model_instance
这里主要介绍了模型实例化的一些方法
终点介绍了D方法和M方法的使用
D方法实例化
M方法实例化
最后官方提到:
问题:
那么,要是我们在实例化模型时,程序员想动态传入模型内容咧?;例如:
这样是不是可行
我们来写个例子看一下。
这里我们动态传入要实例化的模型类
可以看到我们正常传入user模型,这里执行正常
我们来看看代码
先看看D函数:/ThinkPHP/Common/functions.php
当class没有定义时
$class = '\\Common\\'.$layer.'\\'.$name.$layer;
然后:$model = class_exists($class)? new $class($name) : new Think\Model($name);
此时,实例化model,new Think\Model($name);
继续跟进Model的实例化过程:
这里当name不为空时
$this->name = $name;
将name,就是我们传入的值赋给了实例化的model做了属性
那么,我们传入恶意的数据进入模型类呢?会不会引发问题?
这里我们加一个恶意的传值进去实例化,看的更清楚
可以看到,传入恶意的值,引发了sql报错,恶意数据直接带入了模型内,导致问题产生
看结果,上面的答案是:
可能官方说没让程序员这么用
或者大家会说这样用的人太少了
其实,这都说的通,我们来看看实例ThinkSNS
文件/apps/public/Lib/Action/FeedAction.class.php
变量post直接冲POST接受参数
然后遍历变量post的值,使用 t 函数进行过滤,t 函数的处理过程就不在赘述,存在绕过
最后变量post进入shareFeed函数,跟进
文件/addons/model/ShareModel.class.php:
这里的data就是传进来的psot
$data['type'],$data['app_name'],$data['curtable']进入了D函数
此时已经产生了SQL注入漏洞
漏洞证明,提升普通用户为管理员等:
还有文件/addons/widget/CommentWidget/CommentWidget.class.php
$data ['table'] = $data ['table_name']
然后$dao = M ( $data ['table'] );
同样,我们可控的元素进入了实例化Model中
这里导致盲注:
还有文件/addons/model/CommentModel.class.php存在多出这样的问题
很多这样的问题就不在一一列举了
最后,不管这是谁的问题,如果使用不当,或者和是这么使用了就会产生漏洞
主要是给大家提出来,不管是程序员安全意识的问题,还是框架本身的设计缺陷,总之在使用这些框架开发时不要给自己挖坑了。