对于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基础知识:类与对象(5) static
Dec 13 PHP
php在页面中调用fckeditor编辑器的方法
Jun 10 PHP
支持中文的php加密解密类代码
Nov 27 PHP
改写ThinkPHP的U方法使其路由下分页正常
Jul 02 PHP
php中的动态调用实例分析
Jan 07 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
Jan 07 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
Mar 17 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
Jul 18 PHP
PHP简单字符串过滤方法示例
Sep 04 PHP
php实现图片以base64显示的方法
Oct 13 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
Nov 25 PHP
详解Yii2 之 生成 URL 的方法
Jun 16 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
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
php SQL之where语句生成器
2009/03/24 PHP
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
php强制用户转向www域名的方法
2015/06/19 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
JavaScript实现文字跟随鼠标特效
2015/08/06 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
[01:18:45]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第三场2月1日
2021/03/11 DOTA
Python实现的简单hangman游戏实例
2015/06/28 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
委托书范文
2014/04/02 职场文书
高中生班主任评语
2014/04/25 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
2014年后勤工作总结范文
2014/12/16 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
2015年保洁工作总结范文
2015/04/28 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书