对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析


Posted in PHP onJuly 04, 2014

ThinkPHP官网上曾有一段公告指出,在ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
根据官方文档对"防止SQL注入"的方法解释(参考http://doc.thinkphp.cn/manual/sql_injection.html)
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:

$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();

或者

$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();

但是,当你使用如下代码时,却没有"防止SQL注入"的效果(但是官方文档却说可以防止SQL注入): 

$model->query('select * from user where id=%d and status=%s',$id,$status);

或者

$model->query('select * from user where id=%d and status=%s',array($id,$status));

原因分析:

ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
其原函数为: 

protected function parseSql($sql,$parse) {
// 分析表达式
if(true === $parse) {
  $options = $this->_parseOptions();
  $sql =  $this->db->parseSql($sql,$options);
}elseif(is_array($parse)){ // SQL预处理
  $sql = vsprintf($sql,$parse);
}else{
  $sql  =  strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
}
$this->db->setModel($this->name);
return $sql;
}

 

验证漏洞(举例):
请求地址:

http://localhost/Main?id=boo" or 1="1


http://localhost/Main?id=boo%22%20or%201=%221

action代码: 

$model=M('Peipeidui');
$m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
dump($m);exit;

或者:

$model=M('Peipeidui');
$m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
dump($m);exit;

结果:

表peipeidui所有数据被列出,SQL注入语句起效.
 
解决方法:

可将parseSql函数修改为: 

protected function parseSql($sql,$parse) {
// 分析表达式
if(true === $parse) {
  $options = $this->_parseOptions();
  $sql =  $this->db->parseSql($sql,$options);
}elseif(is_array($parse)){ // SQL预处理
  $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
  $sql = vsprintf($sql,$parse);
}else{
  $sql  =  strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
}
$this->db->setModel($this->name);
return $sql;
}

总结:
1.不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
2.不建议直接用$_GET,$_POST

PHP 相关文章推荐
PHP4(windows版本)中的COM函数
Oct 09 PHP
php操作excel文件 基于phpexcel
Jul 02 PHP
解析PHP缓存函数的使用说明
May 10 PHP
解析argc argv在php中的应用
Jun 24 PHP
PHP GD库生成图像的几个函数总结
Nov 19 PHP
php使用正则表达式进行字符串搜索的方法
Mar 23 PHP
typecho插件编写教程(四):插件挂载
May 28 PHP
基于thinkPHP实现的微信自定义分享功能示例
Sep 23 PHP
PHP手机号中间四位用星号*代替显示的实例
Jun 02 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
Apr 13 PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
Jul 04 #PHP
php+memcache实现的网站在线人数统计代码
Jul 04 #PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 #PHP
CodeIgniter安全相关设置汇总
Jul 03 #PHP
php使用pack处理二进制文件的方法
Jul 03 #PHP
PHP源码分析之变量的存储过程分解
Jul 03 #PHP
ThinkPHP让分页保持搜索状态的方法
Jul 02 #PHP
You might like
PHP一些有意思的小区别
2006/12/06 PHP
smarty的保留变量问题
2008/10/23 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
php实现上传图片保存到数据库的方法
2015/02/11 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
javascript字符串与数组转换汇总
2015/05/26 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
微信公众号 客服接口的开发实例详解
2016/09/28 Javascript
超全面的javascript中变量命名规则
2017/02/09 Javascript
js实现自定义进度条效果
2017/03/15 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
JS如何生成动态列表
2020/09/22 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
Python中atexit模块的基本使用示例
2015/07/08 Python
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
Python中使用Queue和Condition进行线程同步的方法
2016/01/19 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
Python3 翻转二叉树的实现
2019/09/30 Python
学习Python列表的基础知识汇总
2020/03/10 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
香港演唱会订票网站:StubHub香港
2019/10/10 全球购物
模具专业毕业生自荐书范文
2014/02/19 职场文书
电子专业自荐信
2014/07/01 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
防溺水主题班会教案
2015/08/12 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL