对于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 Token(令牌)设计
Mar 15 PHP
PHP下操作Linux消息队列完成进程间通信的方法
Jul 24 PHP
PHP学习笔记之数组篇
Jun 28 PHP
简单的php新闻发布系统教程
May 09 PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
May 11 PHP
PHP登录验证码的实现与使用方法
Jul 07 PHP
thinkPHP商城公告功能开发问题分析
Dec 01 PHP
使用Codeigniter重写insert的方法(推荐)
Mar 23 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 PHP
PHP+redis实现的悲观锁机制示例
Jun 12 PHP
php-fpm重启导致的程序执行中断问题详解
Apr 29 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 array_merge函数
2014/08/31 PHP
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
php调整服务器时间的方法
2015/04/03 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
jQuery对象与DOM对象之间的转换方法
2010/04/15 Javascript
DLL+ ActiveX控件+WEB页面调用例子
2010/08/07 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
手机Web APP如何实现分享多平台功能
2016/08/19 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
python日志模块logbook使用方法
2019/09/19 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
如何基于Python批量下载音乐
2019/11/11 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
python切割图片的示例
2020/11/12 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
python tkinter实现连连看游戏
2020/11/16 Python
python urllib和urllib3知识点总结
2021/02/08 Python
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
Charlotte Tilbury美国官网:英国美妆品牌
2017/10/13 全球购物
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
小区的门卫岗位职责
2014/10/01 职场文书
学校运动会广播稿
2014/10/11 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript
Nginx四层负载均衡的配置指南
2021/06/11 Servers
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android
MySQL三种方式实现递归查询
2022/04/18 MySQL