对于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格式化工具Beautify PHP小小BUG
Apr 24 PHP
在PHP中使用模板的方法
May 24 PHP
使用php来实现网络服务
Sep 15 PHP
php中数组首字符过滤功能代码
Jul 31 PHP
表格展示无限级分类(PHP版)
Aug 21 PHP
php增删改查示例自己写的demo
Sep 04 PHP
php事务处理实例详解
Jul 11 PHP
PHP使用正则表达式获取微博中的话题和对象名
Jul 18 PHP
ThinkPHP框架安全实现分析
Mar 14 PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
Yii框架模拟组件调用注入示例
Nov 11 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
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
PHP精确计算功能示例
2016/11/29 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
Swoole实现异步投递task任务案例详解
2019/04/02 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
使用javascript做的一个随机点名程序
2014/02/13 Javascript
javascript常见操作汇总
2014/09/03 Javascript
js实现select组件的选择输入过滤代码
2014/10/14 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
Bootstrap Search Suggest使用例子
2016/12/21 Javascript
JavaScript函数参数的传递方式详解
2017/03/06 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
2020/03/12 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
numpy中矩阵合并的实例
2018/06/15 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
柏林通行证:Berlin Pass
2018/04/11 全球购物
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
个人自查自纠材料
2014/10/14 职场文书
招商引资工作汇报材料
2014/10/28 职场文书
教你怎么用python实现字符串转日期
2021/05/24 Python
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫