对于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 相关文章推荐
如何去掉文章里的 html 语法
Oct 09 PHP
用文本文件制作留言板提示(下)
Oct 09 PHP
剖析 PHP 中的输出缓冲
Dec 21 PHP
简单的PHP缓存设计实现代码
Sep 30 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
Jul 03 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
Dec 15 PHP
Win7下手动安装apache2.2、php5.4笔记
Apr 03 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
Nov 09 PHP
php封装好的人民币数值转中文大写类
Dec 20 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
Mar 31 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
PHP安全之register_globals的on和off的区别
Jul 23 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
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
Javascript Memoizer浅析
2014/10/16 Javascript
javascript实现动态标签云
2015/10/16 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
python实现按长宽比缩放图片
2018/06/07 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
详解Python字符串切片
2019/05/20 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
python3 深浅copy对比详解
2019/08/12 Python
Python-opencv 双线性插值实例
2020/01/17 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
经营管理策划方案
2014/05/22 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
政府班子四风问题整改措施
2014/10/04 职场文书
出国留学自荐信模板
2015/03/06 职场文书
创业计划书之都市休闲农庄
2019/12/28 职场文书
go xorm框架的使用
2021/05/22 Golang
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
Golang数据类型和相互转换
2022/04/12 Golang