对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析_php实例

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索漏洞
, sql注入
, 分析
thinkphp框架
thinkphp sql注入漏洞、thinkphp 注入漏洞、thinkphp3.2.3漏洞、thinkphp 漏洞、thinkphp漏洞检测工具,以便于您获取更多的相关知识。

时间: 2024-11-03 09:37:10

对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析_php实例的相关文章

有效防止SQL注入漏洞详细说明

1.如果动态构造的sql语句中包含参数,请必须对参数做如下操作 a.将'(单引号)替换成''(两个单引号) b.将--(注释符)替换掉 c.将参数加入语句时,一定要在前后各加上引号,如:'select * from table where id='''+@id+''''这样的加法 2.如果动态构造的sql语句中包含表参数,请勿必给表加上[](中括号),如:'select * from ['+@tab+']'这样的做法 3..避免动态sql语句:尤其是从ie客户端获取查询.修改.删除条件的字段最容

CI框架文件上传类及图像处理类用法分析_php实例

本文实例讲述了CI框架文件上传类及图像处理类用法.分享给大家供大家参考,具体如下: //列表页banner图片 public function edit_list_page_banner($category_id=""){ $category_id= empty($category_id)?$_POST["category_id"]:$category_id; //上传图片 if(isset($_POST["key"]) && $

ThinkPHP后台首页index使用frameset时的注意事项分析_php实例

html的frameset标签在多窗口程序设计中有着广泛的应用,尤其是在项目后台页面部分.本文就来分析ThinkPHP后台首页index使用frameset时的注意事项.具体如下: 文件路径:aoli/admin/Lib/Action/IndexAction.class.php 代码如下: <?php class IndexAction extends Action{ public function index(){ $this->display(); } public function to

最新dotCMS SQL注入漏洞 攻击者可获得敏感数据 绿盟科技发布安全威胁通告

dotCMS 3.6.2以下版本可能存在SQL注入漏洞 ,绿盟科技发布<dotCMS SQL注入漏洞安全威胁通告>,通告全文如下 2017年2月15日,seclists.org网站发布了关于dotCMS存在SQL注入漏洞的消息.文章称,dotCMS 3.6.1及其之前的部分版本,在"/categoriesServlet"的q和inode参数上存在SQL注入,未经身份认证的攻击者可以利用该漏洞获取敏感数据. 当dotCMS的版本<=3.3.2时,与之配套使用的MySQL

开发者论坛一周精粹(第九期):Joomla!3.7.0 Core SQL注入漏洞

第九期(2017年5月15日-2017年5月21日 ) 2017年5月17日,国外研究人员发现开源CMS软件Joomla!3.7.0 Core 版本里面发现一个SQL注入漏洞攻击,该漏洞风险较高,可能存在数据泄露的风险. [漏洞公告]Joomla!3.7.0 Core SQL注入漏洞 作者:正禾 码栈惊喜赋能618大促 释放工作量轻松备战! 作者:码栈小二 终极告白--com域名批量注册39元/首年! 作者:万小域 是时候亮出你的wang牌了!wang注册/续费/转入限时优惠! 作者:万小域 五

如何使用加密的Payload来识别并利用SQL注入漏洞?

本文讲的是如何使用加密的Payload来识别并利用SQL注入漏洞?,不可否认,密码学具有各种各样的优点,比如信息的机密性,但是对于密码过分的依赖,利用其保护应用程序俨然是一个坏主意.在这篇文章中我们app安全的首席培训师森尔·亚达夫,将针对一个案例进行研究,其中有一个SQL注入漏洞是通过加密的payload来进行识别和利用的. 注意:我们在本文中讨论的问题并不是加密(即如何破解密码),而是应用程序自身的缺陷,并且能够由开发人员进行监督,使我们生成加密的有效负载(即任何给定明文的密文),然后将其用

Wordpress4.2.3提权与SQL注入漏洞分析

这是这几天一直关注的漏洞了,wordpress上个礼拜发布的4.2.4版本,其中提到修补了可能存在的SQL漏洞和多个XSS. Check point也很快发出了分析,我也来分析与复现一下最新的这个漏洞.   0x01 GP混用造成的越权漏洞 首先,说明一下背景.wordpress中用户权限分为订阅者.投稿者.作者.编辑和管理员. 权限最低的是订阅者,订阅者只有订阅文章的权限,wordpress开启注册后默认注册的用户就是订阅者.国内很多知名网站,如Freebuf,用户注册后身份即为“订阅者”.

WordPress统计分析插件WP Statistics出现SQL注入漏洞 攻击者可窃取用户数据

安全研究员在WP Statistics插件中发现了一个缺陷,可使黑客貌似合理地窃取数据库,甚至远程劫持网站.该插件是一个非常流行的WordPress插件,用于超过30万个网站上.利用WP Statistics插件,网站管理员可查明网站信息,包含实时在线用户数量,网页统计和访客数量. WP Statistics插件SQL注入漏洞 Sucuri公司的安全研究员发现WP Statistics插件中可能存在一个SQL注入漏洞,可使远程攻击者利用订阅账户从网站数据库中窃取数据. 让我们先看一下SQL注入背

如何使用加密的Payload来识别并利用SQL注入漏洞

写在前面的话 密码学具有诸多优点,信息的保密性同样离不开密码学,但是从历史经验来看,在保护应用和数据安全方面我们绝对不能过分依赖于密码学.在这篇文章中,安全教育培训专家SunilYadav将会讨论一个案例,并介绍如何通过一个加密的Payload来发现并利用SQL注入漏洞. 请注意:我们在此不打算讨论密码学方面的问题(例如如何破解加密算法),我们讨论的是应用程序的安全缺陷,这方面问题是很多开发者最容易忽略的问题,而本文所描述的这个漏洞将允许我们通过一个加密的Payload来识别并利用程序中的SQL