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

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

目录

一、基于子查询的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.rhkb.cn/news/493064.html

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

相关文章

Moretl开箱即用日志采集

永久免费: 至Gitee下载 使用教程: Moretl使用说明 使用咨询: 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架…

Go框架比较:goframe、beego、iris和gin

由于工作需要,这些年来也接触了不少的开发框架,Golang的开发框架比较多,不过基本都是Web"框架"为主。这里稍微打了个引号,因为大部分"框架"从设计和功能定位上来讲,充其量都只能算是一个组件&…

DB-GPT 智谱在线模型配置

LLM_MODELzhipu_proxyllm PROXY_SERVER_URLhttps://open.bigmodel.cn/api/paas/v4/chat/completions ZHIPU_MODEL_VERSIONglm-4 ZHIPU_PROXY_API_KEY70e8ec7113882ff5478fcecaa47522479.ExY2LyjcvWmqrTAf

【GCC】2015: draft-alvestrand-rmcat-congestion-03 机器翻译

腾讯云的一个分析,明显是看了这个论文和草案的 : 最新的是应该是这个 A Google Congestion Control Algorithm for Real-Time Communication draft-ietf-rmcat-gcc-02 下面的这个应该过期了: draft-alvestrand-rmcat-congestion-03

python:用 sklearn 构建线性回归模型,并评价

编写 test_sklearn_6.py 如下 # -*- coding: utf-8 -*- """ 使用 sklearn 估计器构建线性回归模型 """ import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib import rcParamsfrom sklearn import dataset…

系统思考—战略共识

当企业不增长的时候,是忙着救火,还是在真正解决问题? 最近遇到很多领导者,把精力放在“管理”上,希望通过抓细节提升效率,解决经营问题。结果呢?全公司上上下下忙成了一团乱麻,但不…

web3跨链桥协议-Nomad

项目介绍 Nomad是一个乐观跨链互操作协议。通过Nomad协议,Dapp能够在不同区块链间发送数据(包括rollups),Dapp通过Nomad的合约和链下的代理对跨链数据、消息进行验证、传输。其安全通过乐观验证机制和欺诈证明制约验证者实现&…

微信小程序实现画板画布自由绘制、选择画笔粗细及颜色、记录撤回、画板板擦、清空、写字板、导出绘图、canvas,开箱即用

目录 画板创建canvas绘制及渲染画笔粗细功能实现画笔颜色选择画笔痕迹撤回、板擦、画布清空canvas解析微信小程序中 canvas 的应用场景canvas 与 2D 上下文、webgl 上下文的关系图像的加载与绘制说明代码说明画板创建 canvas绘制及渲染 在wxml添加对应的canvas标签代码,并在j…

网站灰度发布?Tomcat的8005、8009、8080三个端口的作用什么是CDNLVS、Nginx和Haproxy的优缺点服务器无法开机时

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…

解锁BL后的K40降级

1 下载刷机工具 https://miuiver.com/miflash/ 2、下载刷机包 https://xiaomirom.com/series/ 下载ROM包,12.0.8比较好 3 打开第一步下载的刷机工具 打开首次安装驱动, 接下来先选择个重要的东西,如果不想重新上BL那就选择全部删除…

蓝桥杯刷题——day8

蓝桥杯刷题——day8 题目一题干解题思路代码 题目二题干解题思路代码 题目一 题干 N 架飞机准备降落到某个只有一条跑道的机场。其中第i架飞机在 Ti时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di个单位时间,即它最早可以于 Ti时刻开始降落&am…

redis数据类型:list

list 的相关命令配合使用的应用场景: 栈和队列:插入和弹出命令的配合,亦可实现栈和队列的功能 实现哪种数据结构,取决于插入和弹出命令的配合,如左插右出或右插左出:这两种种方式实现先进先出的数据结构&a…

IDEA中解决Edit Configurations中没有tomcat Server选项的问题

今天使用IDEA2024专业版的时候,发现Edit Configurations里面没有tomcat Server,最终找到解决方案。 一、解决办法 1、打开Settings 2、搜索tomcat插件 搜索tomcat插件之后,找到tomcat 发现tomcat插件处于未勾选状态,然后我们将其勾选保存即可。 二、结果展示 最后,再次编…

复习打卡大数据篇——Hadoop HDFS 02

目录 1. HDFS辅助工具 2. namenode安全模式 1. HDFS辅助工具 跨集群数据拷贝 当我们需要跨集群进行文件数据的拷贝时可以用: hadoop distcp 集群1的某个文件路径 要拷贝到集群2的地址路径 文件归档工具archive 由于HDFS的块的数量取决于文件的大小和数量&…

Mamba安装环境和使用,anaconda环境打包

什么是mamba Mamba是一个极速版本的conda,它是conda的C重新实现,使用多线程并行处理来加速包和依赖项的下载。 Mamba旨在提高安装、更新和卸载Python包的速度,同时保持与conda相同的兼容性和命令行接口。 Mamba的核心部分使用C实现&#xff…

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导 Sigrity System Explorer Snip Via Pattern From Layout模式支持从其它设计中截取过孔模型用于仿真分析,同样以差分模板为例 具体操作如下 双击打开System Explorer软件…

顺序表的操作

注意位序和数组下标的关系 插入: 插入的时间复杂度: 最深层语句: 最好情况 最坏情况 平均情况 删除: 查找:

以腾讯混元模型为例,在管理平台上集成一个智能助手

背景 前几天,公司的同事们一起吃了个饭,餐桌上大家聊到大模型的落地场景。我个人在去年已经利用百度千帆平台写过案例,并发过博客(传送门👉:利用文心千帆打造一个属于自己的小师爷)&#xff0c…

计算机基础 试题

建议做的时候复制粘贴,全部颜色改为黑色,做完了可以看博客对答案。 一、单项选择题(本大题共25小题,每小题2分,共50分〉 1.计算机内部采用二进制数表示信息,为了便于书写,常用十六进制数表示。一个二进制数0010011010110用十六进制数表示为 A.9A6 B.26B C.4D6 D.…

[机器学习]XGBoost(3)——确定树的结构

XGBoost的目标函数详见[机器学习]XGBoost(2)——目标函数(公式详解) 确定树的结构 之前在关于目标函数的计算中,均假设树的结构是确定的,但实际上,当划分条件不同时,叶子节点包含的…