对于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 相关文章推荐
?繁体转换的class
Oct 09 PHP
php str_replace的替换漏洞
Mar 15 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
Aug 21 PHP
php代码中使用换行及(\n或\r\n和br)的应用
Feb 02 PHP
php判断手机访问还是电脑访问示例分享
Jan 20 PHP
php多任务程序实例解析
Jul 19 PHP
thinkphp中html:list标签传递多个参数实例
Oct 30 PHP
迁移PHP版本到PHP7
Feb 06 PHP
php实现36进制与10进制转换功能示例
Jan 10 PHP
PHP生成图片缩略图类示例
Jan 12 PHP
PHP实现微信小程序人脸识别刷脸登录功能
May 24 PHP
PHP count_chars()函数讲解
Feb 14 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计算到指定日期还有多少天的方法
2015/04/14 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
yii分页组件用法实例分析
2015/12/28 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
javascript demo 基本技巧
2009/12/18 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
2016/08/02 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
浅谈jquery fullpage 插件增加头部和版权的方法
2018/03/20 jQuery
对layui中表单元素的使用详解
2018/08/15 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
node.js基础知识汇总
2020/08/25 Javascript
Python和php通信乱码问题解决方法
2014/04/15 Python
python爬虫获取京东手机图片的图文教程
2017/12/29 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
python标准库os库的函数介绍
2020/02/12 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
Python多线程Threading、子线程与守护线程实例详解
2020/03/24 Python
django实现模型字段动态choice的操作
2020/04/01 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
python实现计算图形面积
2021/02/22 Python
css3 transform 3d 使用css3创建动态3d立方体(html5实践)
2013/01/06 HTML / CSS
挪威手表购物网站:Klokker
2016/09/19 全球购物
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
最美护士演讲稿
2014/08/27 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
2015年招聘工作总结
2014/12/12 职场文书
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle