#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)

news2024/12/21 15:18:35

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。

目录

一、基于子查询的SQL注入

一、原理

二、攻击过程示例

二、子查询SQL注入的其他攻击示例:

一、利用子查询进行数据提取

二、基于子查询的盲注攻击

三、防范措施:

一、输入验证与过滤

二、使用参数化查询

三、遵循最小权限原则

四、使用存储过程

五、定期进行安全审计和漏洞扫描


一、基于子查询的SQL注入

基于子查询的SQL注入是SQL注入攻击的一种方式。它是指攻击者利用子查询构造恶意的SQL语句,通过在Web应用程序输入字段(如表单输入框、URL参数等)注入包含子查询的恶意内容,来欺骗数据库执行非预期的指令,从而达到获取敏感信息、篡改数据或执行其他恶意操作的目的。

子查询是嵌套在其他SQL查询中的查询。在正常情况下,子查询用于从一个或多个表中检索数据,然后将结果用于主查询。然而,在存在安全漏洞(如对用户输入数据验证不严格)的应用程序中,攻击者可以构造恶意的子查询注入语句。

基于子查询的SQL注入是一种较为复杂的SQL注入方式。

一、原理

  1. 子查询基础
    • 子查询是嵌套在其他SQL查询中的查询语句。例如在一个查询中,先在内部通过子查询获取一些数据,然后外部查询再基于子查询的结果进行进一步操作。正常的子查询如:SELECT column1 FROM table1 WHERE condition = (SELECT column2 FROM table2 WHERE another_condition)
  2. 注入原理
    • 在存在安全漏洞(如对用户输入验证不严格)的Web应用中,攻击者可以在输入字段(如表单输入框、URL参数等)中构造包含恶意子查询的内容。
    • 例如,有一个查询语句用于根据用户输入的ID查询用户信息:SELECT * FROM users WHERE id = '$user_input'。攻击者可能会输入类似' AND (SELECT COUNT(*) FROM secret_table)>0--(假设secret_table是一个包含敏感信息的表)的内容。当这个输入被插入到查询语句中时,就变成了SELECT * FROM users WHERE id = '' AND (SELECT COUNT(*) FROM secret_table)>0--。如果数据库执行了这个语句,就可能会根据子查询的结果泄露关于secret_table的信息,比如判断这个表是否存在以及是否有数据等情况。

二、攻击过程示例

  1. 判断注入点
    • 攻击者首先需要确定存在SQL注入漏洞的输入点。可以使用一些常见的测试方法,如在输入框中输入单引号、1 = 11 = 2等,观察页面的返回结果是否符合SQL注入的特征(如正常显示、报错信息等)。
  2. 构造子查询注入语句
    • 假设已经确定了一个字符型注入点,并且知道数据库为MySQL。如果想要获取数据库中的所有表名(假设存在一个名为information_schema的系统数据库,其中的tables表存储了所有表的信息),攻击者可能会构造如下注入语句:
      • 假设输入框对应的查询语句为SELECT * FROM some_table WHERE some_column = '$input',攻击者输入' AND (SELECT COUNT(*) FROM (SELECT table_name FROM information_schema.tables WHERE table_schema = 'target_database') AS subquery)>0--。这里通过子查询先从information_schema.tables 中获取指定数据库(target_database)中的表名,然后外部的COUNT(*)用于判断是否有结果,--用于注释掉后面可能存在的原始查询语句的其他部分。
  3. 获取信息
    • 根据数据库对注入语句的执行结果,攻击者可以逐步获取更多信息。例如,如果想要获取表中的列名,可以进一步构造子查询,如:' AND (SELECT COUNT(*) FROM (SELECT column_name FROM information_schema.columns WHERE table_schema = 'target_database' AND table_name = 'target_table') AS subquery)>0--
 

二、子查询SQL注入的其他攻击示例:

一、利用子查询进行数据提取

  1. 获取数据库版本信息(以MySQL为例)
    • 假设存在一个存在SQL注入漏洞的查询语句:SELECT * FROM products WHERE product_id = '$user_input'
    • 攻击者可以构造如下注入语句:' AND (SELECT @@version) = '1'--。这里@@version是MySQL中用于获取数据库版本的系统变量。如果应用程序将这个输入拼接到查询语句中并执行,数据库会先执行子查询(SELECT @@version),然后攻击者可以通过分析数据库的响应(例如是否有数据返回或者是否有错误提示等情况)来获取数据库的版本信息。
  2. 获取数据库用户信息
    • 对于MySQL,攻击者可以构造这样的注入语句:' AND (SELECT user()) = '1'--。其中user()函数用于获取当前数据库连接的用户信息。当这个注入语句被执行时,攻击者可能通过数据库的响应获取到当前数据库连接所使用的用户信息,这有助于进一步了解数据库的权限设置等情况。

二、基于子查询的盲注攻击

  1. 布尔型盲注
    • 假设存在一个登录页面,其查询语句可能是SELECT * FROM users WHERE username = '$username' AND password = '$password'
    • 攻击者可以通过构造子查询进行布尔型盲注。例如,想要判断数据库中是否存在名为admin的用户,构造注入语句如下:
      • 在用户名输入框输入:admin' AND (SELECT COUNT(*) FROM users WHERE username = 'admin')>0--。如果登录页面返回的结果(如登录成功或者登录失败的提示、页面的显示状态等)与正常情况不同,攻击者就可以推断出数据库中是否存在名为admin的用户。
    • 进一步地,如果想要获取密码的长度,攻击者可以逐步尝试。例如,先假设密码长度为1,构造注入语句:admin' AND (SELECT LENGTH(password) FROM users WHERE username = 'admin') = 1--,然后根据页面的响应调整假设的密码长度值,直到找到正确的密码长度。
  2. 时间型盲注
    • 同样以存在漏洞的查询语句SELECT * FROM products WHERE product_id = '$user_input'为例。
    • 攻击者可以利用MySQL中的SLEEP()函数进行时间型盲注。例如,想要判断数据库中是否存在名为secret_table的表,构造注入语句:' AND IF((SELECT COUNT(*) FROM information_schema.tables WHERE table_name ='secret_table')>0,SLEEP(5),1)--。如果数据库执行这个查询时存在名为secret_table的表,那么查询会因为SLEEP(5)函数而延迟5秒响应,攻击者可以通过观察响应时间来判断表是否存在。

三、防范措施:

一、输入验证与过滤

  1. 严格的格式验证
    • 对用户输入的数据进行严格的格式验证。例如,如果某个输入字段预期为数字类型,那么只接受数字输入,拒绝任何包含字母或特殊字符的输入。可以使用编程语言提供的类型检查功能,如在Python中使用isdigit()方法检查字符串是否为数字。
    • 对于字符串类型的输入,限制其长度,防止攻击者输入过长的恶意字符串。
  2. 危险字符过滤
    • 过滤掉可能用于构造SQL注入语句的危险字符,如单引号(')、双引号(")、分号(;)、注释符号(-- 或 #)等。可以使用字符串替换函数将这些字符替换为空字符串或者进行转义处理。例如在PHP中,可以使用addslashes()函数对输入字符串进行转义,将特殊字符转义为安全的形式。

二、使用参数化查询

  1. 参数化查询原理
    • 参数化查询将用户输入作为参数传递给SQL语句,而不是直接将输入内容拼接到SQL语句中。这样,即使输入中包含恶意的SQL语法,数据库也会将其视为普通的参数值,而不会将其作为SQL语句的一部分进行执行。
  2. 不同编程语言和数据库的实现
    • 在Java中,使用PreparedStatement类进行数据库操作。例如:
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
public class Main { 
    public static void main(String[] args) { 
        try { 
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb",  "root", "password"); 
            String sql = "SELECT * FROM users WHERE username =? AND password =?"; 
            PreparedStatement statement = connection.prepareStatement(sql);  
            statement.setString(1,  "user1"); 
            statement.setString(2,  "pass1"); 
            ResultSet resultSet = statement.executeQuery();  
            while (resultSet.next())  { 
                System.out.println(resultSet.getString("username"));  
            } 
            connection.close();  
        } catch (Exception e) { 
            e.printStackTrace();  
        } 
    } 
} 

在Python中,使用数据库驱动提供的参数化查询功能。例如,对于pymysql库:

import pymysql 
connection = pymysql.connect(host='localhost',  user='root', password='password', database='test') 
cursor = connection.cursor()  
query = "SELECT * FROM users WHERE username = %s AND password = %s" 
cursor.execute(query,  ('user1', 'pass1')) 
results = cursor.fetchall()  

三、遵循最小权限原则

  1. 权限分配策略
    • 为数据库用户分配最小的权限。例如,如果一个Web应用只需要从特定的表中读取数据,那么就只为其数据库连接用户授予该表的SELECT权限,而不授予INSERTUPDATEDELETE等权限。
  2. 定期审查权限
    • 定期审查数据库用户的权限,确保权限始终保持在最小化的状态。随着应用功能的更新和变化,可能会有一些权限不再需要,及时进行调整可以降低SQL注入攻击可能造成的危害。

四、使用存储过程

  1. 存储过程的安全性
    • 存储过程是预编译的SQL语句集合,存储在数据库中。使用存储过程可以将复杂的业务逻辑封装起来,并且可以对输入参数进行严格的验证和处理。由于存储过程是预编译的,攻击者很难通过注入恶意的SQL语句来改变其逻辑。
  2. 示例(以MySQL为例)
    • 首先创建一个存储过程:
DELIMITER // 
CREATE PROCEDURE get_user_info(IN username VARCHAR(255), IN password VARCHAR(255)) 
BEGIN 
    SELECT * FROM users WHERE username = username AND password = password; 
END // 
DELIMITER ; 

在应用程序中调用存储过程:

  • 在Java中,可以使用CallableStatement来调用存储过程。
  • 在Python中,使用pymysql库时:
  • import pymysql 
    connection = pymysql.connect(host='localhost',  user='root', password='password', database='test') 
    cursor = connection.cursor()  
    cursor.callproc('get_user_info',  ('user1', 'pass1')) 
    results = cursor.fetchall()  

    五、定期进行安全审计和漏洞扫描

  • 安全审计
    • 定期对应用程序的代码进行安全审计,检查是否存在可能导致SQL注入的代码逻辑问题。重点关注与数据库交互的部分,如查询语句的构造、用户输入的处理等。
  • 漏洞扫描工具
    • 使用专业的漏洞扫描工具,如SQLMap等。这些工具可以自动检测应用程序中是否存在SQL注入漏洞,包括子查询SQL注入漏洞。根据扫描结果及时修复发现的漏洞,提高应用程序的安全性。

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

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

相关文章

【数据安全】如何保证其安全

数据安全风险 数字经济时代,数据已成为重要的生产要素。智慧城市、智慧政务的建设,正以数据为核心,推动城市管理的智能化和公共服务的优化。然而,公共数据开放共享与隐私保护之间的矛盾日益凸显,如何在确保数据安全的…

武汉市电子信息与通信工程职称公示了

2024年武汉市电子信息与通信工程专业职称公示了,本次公示通过人员有109人。 基本这已经是今年武汉市工程相关职称最后公示了,等待出证即可。 为什么有人好奇,一样的资料,都是业绩、论文等,有的人可以过,有的…

勤研低代码平台:高效数据集成助力企业数字化转型

在数字化转型的浪潮中,企业对高效开发工具的需求日益增长。勤研低代码平台强大的开发能力和灵活的数据集成方案,是企业提升效率、降低成本的理想选择。数据集成作为勤研低代码平台的核心功能之一,为企业提供了高效整合和利用数据的能力&#…

【毕业设计】A079-基于Java的影院订票系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…

大腾智能受邀出席南京工业软件云工程应用创新中心工业软件生态应用推广大会并领奖

12月18日,南京工业软件云工程应用创新中心工业软件生态应用推广大会在南京江北新区圆满召开。本次大会由南京江北新区管委会主办,南京工业软件云工程应用创新中心、南京江北新区智能制造产业发展管理办公室联合承办,华为云计算技术有限公司支…

EasyPlayer.js播放器Web播放H.265要兼顾哪些方面?

在数字化时代,流媒体技术已经成为信息传播和娱乐消费的重要方式。随着互联网技术的飞速发展和移动设备的普及,流媒体服务正在重塑我们的生活和工作方式。从视频点播、在线直播到音乐流媒体,流媒体技术的广泛应用不仅改变了内容的分发和消费模…

fabric.js

目录 一、在canvas上画简单的图形 二、在canvas上用路径(Path)画不规则图形 三、在canvas上插入图片并设置旋转属性(angle) 四、让元素动起来(animate) 五、图像过滤器(filters)让图片多姿多彩 六、颜色模式(Color)和相互转换(toRgb、toHex) 七、对图形的渐变填充(Gradi…

白话AI大模型(LLM)原理

大模型(例如 GPT-4或类似的深度学习模型)是基于神经网络的系统,用于理解、生成文本、图像或其他数据类型。其工作原理可以分为以下几个核心步骤,我将通过易于理解的例子逐一解释。 1. 神经网络的基本概念 大模型背后有一个非常庞…

基于海思soc的智能产品开发(巧用mcu芯片)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于开发车规级嵌入式软件的同学来说,socmcu这样的组合,他们并不陌生。但是传统的工业领域,比如发动机、医疗或…

力扣438-找到字符串中所有字母异位词

力扣438-找到字符串中所有字母异位词 力扣438-找到字符串中所有字母异位词原题地址:https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/ 题目描述: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串&#x…

C#代码实现把中文录音文件(.mp3 .wav)转为文本文字内容

我们有一个中文录音文件.mp3格式或者是.wav格式,如果我们想要提取录音文件中的文字内容,我们可以采用以下方法,不需要使用Azure Speech API 密钥注册通过离线的方式实现。 1.首先我们先在NuGet中下载两个包 NAudio 2.2.1、Whisper.net 1.7.3…

数据可视化-2. 条形图

目录 1. 条形图适用场景分析 1.1 比较不同类别的数据 1.2 展示数据分布 1.3 强调特定数据点 1.4 展示时间序列数据的对比 1.5 数据可视化教育 1.6 特定领域的应用 2. 条形图局限性 3. 条形图图代码实现 3.1 Python 源代码 3.2 条形图效果(网页显示&#…

基于Redis的网关鉴权方案与性能优化

文章目录 前言一、微服务鉴权1.1 前端权限检查1.2 后端权限检查1.3 优缺点 二、网关鉴权2.1 接口权限存储至Redis2.2 网关鉴权做匹配 总结 前言 在微服务架构中,如何通过网关鉴权结合Redis缓存提升权限控制的效率与性能。首先,文章对比了两种常见的权限…

Ansible 批量管理华为 CE 交换机

注:本文为 “Ansible 管理华为 CE 交换机” 相关文章合辑。 使用 CloudEngine - Ansible 批量管理华为 CE 交换机 wsf535 IP 属地:贵州 2018.02.05 15:26:05 总体介绍 Ansible 是一个开源的自动化运维工具,AnsibleWorks 成立于 2012 年&a…

使用自定义分光比对分束器进行建模

分束器将一束光分成两个或多个单独的光束。它常用于各种光学系统,例如显微镜、干涉仪和成像设备。分束器可以由不同的材料制成,通常涂有金属或介电材料的薄层,以达到所需的分束效果。分束器的两种流行形式是立方体和板式。立方体分束器由两个…

C++对象数组对象指针对象指针数组

一、对象数组 对象数组中的每一个元素都是同类的对象&#xff1b; 例1 对象数组成员的初始化 #include<iostream> using namespace std;class Student { public:Student( ){ };Student(int n,string nam,char s):num(n),name(nam),sex(s){};void display(){cout<&l…

SQL进阶技巧:如何计算商品需求与到货队列表进出计划?

目录 0 需求描述 1 数据准备 2 问题分析 3 小结 累计到货数量计算 出货数量计算 剩余数量计算 0 需求描述 假设现有多种商品的订单需求表 DEMO_REQUIREMENT&#xff0c;以及商品的到货队列表 DEMO_ARR_QUEUE&#xff0c;要求按照业务需要&#xff0c;设计一个报表&#…

清远榉之乡托养机构为你深度分析:特殊碳水化合物饮食对自闭症的作用

在探索自闭症干预方法的道路上&#xff0c;各种尝试不断涌现。其中&#xff0c;特殊碳水化合物饮食引起了不少家长的关注。那么&#xff0c;特殊碳水化合物饮食对自闭症究竟有怎样的作用呢&#xff1f;今天&#xff0c;清远榉之乡托养机构为你深度分析。 榉之乡大龄自闭症托养机…

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 keywor…

ONES 功能上新|ONES Copilot、ONES Wiki 新功能一览

ONES Copilot 可基于工作项的标题、描述、属性信息&#xff0c;对工作项产生的动态和评论生成总结。 针对不同类型的工作项&#xff0c;总结输出的内容有对应的侧重点。 应用场景&#xff1a; 在一些流程步骤复杂、上下游参与成员角色丰富的场景中&#xff0c;工作项动态往往会…