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注入漏洞详细分析所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)