对于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 相关文章推荐
PHP开发文件系统实例讲解
Oct 09 PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
Jul 23 PHP
php获取汉字首字母的函数
Nov 07 PHP
Fedora下安装php Redis扩展笔记
Sep 03 PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 PHP
浅谈php中变量的数据类型判断函数
Mar 04 PHP
LNMP部署laravel以及xhprof安装使用教程
Sep 14 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 PHP
PHP终止脚本运行三种实现方法详解
Sep 01 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
Dec 30 PHP
Jsonp劫持学习
Apr 01 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
深入了解php4(1)--回到未来
2006/10/09 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
jQuery1.6 使用方法二
2011/11/23 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
前端开发之便利店收银系统代码
2019/12/27 Javascript
js实现小星星游戏
2020/03/23 Javascript
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
opencv3/python 鼠标响应操作详解
2019/12/11 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
【HTML5】3D模型--百行代码实现旋转立体魔方实例
2016/12/16 HTML / CSS
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
如何填写个人简历自我评价
2013/12/10 职场文书
教师的实习鉴定
2013/12/15 职场文书
宠物店的创业计划书范文
2014/01/11 职场文书
如何写好建议书
2014/03/13 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
vue项目两种方式实现竖向表格的思路分析
2021/04/28 Vue.js
pytorch实现手写数字图片识别
2021/05/20 Python
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL