对于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 相关文章推荐
人大复印资料处理程序_查询篇
Oct 09 PHP
Dedecms常用函数解析
Feb 01 PHP
php懒人函数 自动添加数据
Jun 28 PHP
linux下安装php的memcached客户端
Aug 03 PHP
php截取html字符串及自动补全html标签的方法
Jan 15 PHP
php快速查找数据库中恶意代码的方法
Apr 01 PHP
PHP处理postfix邮件内容的方法
Jun 16 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
Jan 14 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
WordPress伪静态规则设置代码实例
Dec 10 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实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
javawscript 三级菜单的实现原理
2009/07/01 Javascript
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
菜鸟javascript基础整理1
2010/12/06 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
jquery+json实现数据列表分页示例代码
2013/11/15 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
express框架下使用session的方法
2019/07/31 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
python中Flask框架简单入门实例
2015/03/21 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
python操作文件的参数整理
2019/06/11 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
2020/06/17 Python
介绍一下UNIX启动过程
2013/11/14 面试题
公司董事长职责
2013/12/12 职场文书
服务员岗位责任制
2014/02/11 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
网站出售协议书范文
2014/10/10 职场文书
实验心得体会范文
2016/01/25 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
canvas多重阴影发光效果实现
2021/04/20 Javascript
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL