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

对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析,第1张

概述这篇文章主要介绍了对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析,对于网站安全十分重要!需要的朋友可以参考下

ThinkPHP官网上曾有一段公告指出,在ThinkPHP 3.1.3及之前的版本存在一个sql注入漏洞,漏洞存在于ThinkPHP/lib/Core/Model.class.PHP 文件根据官方文档对"防止sql注入"的方法解释(参考http://doc.thinkPHP.cn/manual/sql_injection.HTML)使用查询条件预处理可以防止sql注入,没错,当使用如下代码时可以起到效果:

where("ID=%d and username='%s' and xx='%f'",array($ID,$username,$xx))->select();

或者

where("ID=%d and username='%s' and xx='%f'",$ID,$xx)->select();

但是,当你使用如下代码时,却没有"防止sql注入"的效果(但是官方文档却说可以防止sql注入):

query('select * from user where ID=%d and status=%s',$status);

或者

query('select * from user where ID=%d and status=%s',$status));

原因分析:

ThinkPHP/lib/Core/Model.class.PHP 文件里的parsesql函数没有实现sql过滤.其原函数为:

_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;}

验证漏洞(举例):请求地址:

action代码:

query('select * from peipeIDui where name="%s"',$_GET['ID']);dump($m);exit;

或者:

query('select * from peipeIDui where name="%s"',array($_GET['ID']));dump($m);exit;

结果:

表peipeIDui所有数据被列出,sql注入语句起效.

解决方法:

可将parsesql函数修改为:

db,'escapestring'),$parse);//此行为新增代码 $sql = vsprintf($sql,'__PREFIX__'=>C('DB_PREFIX')));}$this->db->setModel($this->name);return $sql;}

总结:1.不要过分依赖TP的底层sql过滤,程序员要做好安全检查2.不建议直接用$_GET,$_POST

总结

以上是内存溢出为你收集整理的对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析全部内容,希望文章能够帮你解决对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1235008.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存