对于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
phpmyadmin MySQL 加密配置方法
Jul 05 PHP
从php核心代码分析require和include的区别
Jan 02 PHP
最新用php获取谷歌PR值算法,附上php查询PR值代码示例
Dec 25 PHP
支持中文字母数字、自定义字体php验证码代码
Feb 27 PHP
使用php判断浏览器的类型和语言的函数代码
Feb 28 PHP
PHP URL路由类实例
Nov 12 PHP
PHP易混淆函数的区别及用法汇总
Nov 22 PHP
php检测url是否存在的方法
Apr 14 PHP
PHP自毁程序(慎用)
Jul 09 PHP
深入分析PHP优化及注意事项
Jul 04 PHP
PHP获取学生成绩的方法
Nov 17 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的库,结果发现很多东西
2006/12/31 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
php验证码实现代码(3种)
2015/09/07 PHP
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
10个经典的网页鼠标特效代码
2018/01/09 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
JavaScript实现更换背景图片
2019/10/18 Javascript
详解Angular Karma测试的持续集成实践
2019/11/15 Javascript
在服务器端实现无间断部署Python应用的教程
2015/04/16 Python
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
Python利用splinter实现浏览器自动化操作方法
2018/05/11 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
python matplotlib饼状图参数及用法解析
2019/11/04 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
Python实现点云投影到平面显示
2020/01/18 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
python 提高开发效率的5个小技巧
2020/10/19 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
中职生自荐信范文
2014/06/15 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
小学教研工作总结2015
2015/05/13 职场文书
担保书怎么写 ?
2019/04/22 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers