当前位置: 首页 > news >正文

thinkphp漏洞之sql注入漏洞-builder处漏洞

目录

适用版本

环境搭建

文件下载安装

配置文件修改

漏洞分析


适用版本

注:thinkphp版本:5.0.13<=ThinkPHP<=5.0.155.1.0<=ThinkPHP<=5.1.5

环境搭建

文件下载安装

在github上面下载相应版本,下载think文件,下载framework文件,然后将framework文件修改名字为thinkphp,然后将修改后的framework放在think文件下,然后将think放在网站目录下

配置文件修改

修改数据库连接文件,这里需要提前创建一个数据库文件

修改你的控制器

$username = request()->get('username/a');

这里是接收一个get传参,然后username/a的意思是有username传参username的值就是传参的值没有的话就是默认是a

  db('users')->insert(['username'=>$username]);

这里就是将你输入的值传道数据库里

漏洞分析

漏洞我们可以在framework中的5.0.16版本去看,因为后面的版本肯定是把前面的版本bug修复了。所以可以从里面看到bug是什么样子,看一下5.0.16官方更新了什么东西,到底是把什么修复了。

来看一下啊它的更新提交,然后看看有啥子漏洞

在builder中会有一个修改的地方

下面我们来追一下这个代码,首先输入注入语句

http://127.0.0.1:9999/thinkphp/think-5.0.15/public/index.php?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1

这个需要开启调试模式,注入成功,将user回显了过来

在这里下断,看他一步步执行步骤

首先username的值为0="inc",1="updatexml(1,concat(0x7,user(),0x7e),1)",2="1"

将断点打在插入语句

 看一下他的insert这个函数,数据传输是自己写的值

然后下一步追到builder上,即上面的 $this->builder->insert() 最终调用的是 Builder 类的 insert 方法。 然后调用 parseData 方法来分析并处理数据

然后咱来看一下parseData的方法,下图代码

这个代码中上面第一个红框将data数组中遍历,然后val中就是data的值,然后看第二个红框三个不同的参数对应不同的处理方式,这三个处理方式都可以进行注入,但是insert方法中会对exp进行过滤如果数据中存在 exp ,则会被替换成 exp空格,所以三种处理方式中选项等于exp的无法使用

然后经过parseData处理的数据返回到Builder中的insert,然后下面的sql中的str_replace中的第一个数组被第二个数组中的值进行替换

 上图代码中第二个数组的意思

$sql = str_replace(['%INSERT%', '%TABLE%', '%FIELD%', '%DATA%', '%COMMENT%'],[$replace ? 'REPLACE' : 'INSERT',$this->parseTable($options['table'], $options),implode(' , ', $fields),implode(' , ', $values),$this->parseComment($options['comment']),], $this->insertSql);
$replace ? 'REPLACE' : 'INSERT'

replace有值就是INSERT没值就默认是REPLACE

 $this->parseTable($options['table'], $options)

option中table是users

implode(' , ', $fields)
implode(' , ', $values)

将数组转换为字符串,fileds是username、values就是你写的报错语句

  $this->parseComment($options['comment'])

数据库建表的时候允许你建一个注释comment就是这个注释,这个注释没有的话就为空然后就插入到数据库中,引起报错注入

回来以后数组的值经过替换后变成如下代码

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • wiota窄带通讯技术对于vu传统lora
  • [cvpr 2024 目标检测 前沿研究 热点] cpvr 2024中与目标检测主题有关的论文
  • 【无标题】第九章 从 Web 客户端指定自定义传输
  • 钢板现货:A572Gr60和SA572Gr60材质分析、A572Gr60和SA572Gr60简介
  • fetch 在实际项目中的思考
  • 2024华为OD机试真题- 求字符串中所有整数的最小和-(C++/Python)-C卷D卷-100分
  • 中国联通在国外最大的综合电信服务枢纽
  • 【算法模板】数据结构:单调栈
  • vue2和vue3项目使用signalr插件,前后端如何配合的
  • 大语言模型有什么用途?
  • 计算机网络17——IM聊天系统——客户端核心处理类框架搭建
  • XV6——锁与并发
  • AI技术在招聘数据分析洞察中的作用
  • haproxy总结与实验
  • sgetrf M N is 103040 时报错,这是个bug么 lapack and Openblas the same,修复备忘
  • SegmentFault for Android 3.0 发布
  • 【Amaple教程】5. 插件
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • crontab执行失败的多种原因
  • Django 博客开发教程 8 - 博客文章详情页
  • Gradle 5.0 正式版发布
  • iOS编译提示和导航提示
  • JavaScript设计模式系列一:工厂模式
  • js数组之filter
  • leetcode讲解--894. All Possible Full Binary Trees
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • 技术发展面试
  • 蓝海存储开关机注意事项总结
  • 算法-插入排序
  • 算法---两个栈实现一个队列
  • 学习JavaScript数据结构与算法 — 树
  • 一些关于Rust在2019年的思考
  • 运行时添加log4j2的appender
  • 找一份好的前端工作,起点很重要
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # 数论-逆元
  • #pragma once
  • (14)Hive调优——合并小文件
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (一) 初入MySQL 【认识和部署】
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)视频码率,帧率和分辨率的联系与区别
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core 项目指定SDK版本
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET大文件上传知识整理
  • .sh
  • @WebServiceClient注解,wsdlLocation 可配置