对于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 相关文章推荐
PHP6 先修班 JSON实例代码
Aug 23 PHP
Codeigniter操作数据库表的优化写法总结
Jun 12 PHP
php+ajax实时刷新简单实例
Feb 25 PHP
php获取访问者IP地址汇总
Apr 24 PHP
分享五个PHP7性能优化提升技巧
Dec 07 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
Dec 22 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
Dec 31 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
Mar 26 PHP
Laravel框架下的Contracts契约详解
Mar 17 PHP
php swoft框架实例用法
Dec 22 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获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
让PHP更快的提供文件下载的代码
2012/06/13 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
jQuery CSS()方法改变现有的CSS样式
2014/08/20 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
初识Node.js
2015/03/20 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
MockJs结合json-server模拟后台数据
2020/08/26 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
用webAPI实现图片放大镜效果
2020/11/23 Javascript
30秒轻松实现TensorFlow物体检测
2018/03/14 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
python读取并写入mat文件的方法
2019/07/12 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
大国崛起日本观后感
2015/06/02 职场文书
小学运动会加油稿
2015/07/22 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
《地震中的父与子》教学反思
2016/02/16 职场文书
导游词之贵州织金洞
2019/10/12 职场文书
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL
实操Python爬取觅知网素材图片示例
2021/11/27 Python