sql注入补充——get注入

article/2025/7/1 17:44:08

Sql注入

Mysql中的information_schema库

用于存储数据库元信息,包含了数据库、表、列、索引等结构化信息。

特点

只读性

标准化:它是sql标准的一部分,适用于多种数据库系统

动态生成:数据是动态生成的,实时反映数据库的状态

常用表

Tables:存储数据库中所有表的信息,表名、表类型

Columns:存储表中列的详细信息,列名、数据类型

Schemata:存储所有数据库的基本信息

Statistics:存储表的索引信息

Views:存储视图的定义和相关信息

Sql常用函数

CONCAT(s1,s2...sn)

无分隔号连接字符

CONCAT_WS(x, s1,s2...sn)

合并多个字符串,并添加分隔符x:

GROUP_CONCAT([DISTINCT] expr [,expr ...]

             [ORDER BY {unsigned_integer | col_name | expr}

                 [ASC | DESC] [,col_name ...]]

             [SEPARATOR str_val])

连接一个组的所有字符串,默认用逗号分隔,可以通过指定separator更改分隔符

SUBSTR(s, start, length)

从字符串 s 的 start 位置截取长度为 length 的子字符串,下标从1开始

MID(s,n,len)

从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len),下标从1开始。substr大多数数据库都支持mid主要在MySQL中使用

ASCII(s)

返回字符串 s 的第一个字符的 ASCII 码。

ORD(str)

如果字符串 str 的最左侧字符是多字节字符,则返回该字符的代码;

单字节字符:ASCII字符集中的字符,每个字符占用1个字节(8位)

多字节字符:需要2个或更多字节表示的字符,如中文、日文、韩文等

如果最左边的字符不是多字节字符,则 ORD() 返回与 ASCII() 函数相同的值

Sleep(duration)

休眠 (暂停) duration 参数给定的秒数(单位是秒,不是毫秒),然后返回 0。 持续时间可能具有小数部分。如果参数为 NULL 或负数,则 SLEEP() 在严格 SQL 模式下生成警告或错误。

BENCHMARK(count,expr)

BENCHMARK() 函数执行表达式 expr 重复计数count次的时间。它可用于对 MySQL 处理表达式的速度进行计时。结果值为 0,对于不适当的参数(如 NULL 或负重复计数),结果值为 NULL。预期用途是在 mysql 客户端中,该客户端报告查询执行时间

Union

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。它可以从多个表中选择数据,并将结果集组合成一个结果集。使用 UNION 时,每个 SELECT 语句必须具有相同数量的列,且对应列的数据类型必须相似

UNION 操作符默认会去除重复的记录,如果需要保留所有重复记录,可以使用 UNION ALL 操作符

当前一个select查询结果为空时,后面的select不会要求具有相同数量的列

判断数据库类型

Mysql5.0以上有information_schema

Access的msysobjects

Oracle的dual

注释

作用:

通过注释符屏蔽原始sql代码,确保注入的代码可以执行

规避对敏感关键字(union、select)的过滤

使注入sql语句符合数据库的语法要求,避免语法错误

Mysql注释符

寻找注入点

\

‘)

“)

And 1=1

And 1=2

注入点类型

字符型

Sql查询中的参数被当做字符串处理,通常参数被单引号或双引号包裹,注入时需要闭合引号

数字型

Sql查询中的参数被当做数字处理,参数不被单引号或双引号包裹

Tips:在 URL 中,+ 有时会被解释为 空格(尤其是在 application/x-www-form-urlencoded 格式的表单数据中)。https://example.com/search?q=1+2=3  # 服务器可能解析为 "1 2=3"

注入思路

1.寻找注入点

2.确定注入类型

3.猜当前页面查询的字段总数

order by n     逐渐加大n,直到报错

4.查询页面显示了哪几个字段

url后加 and 1=2 union select 1,2,3,4,5...n

页面中会显示相应字段出现的位置

5.查询当前数据库名称

url后加 and 1=2 union select 1,2,database(),4,5...n

3号位置显示数据库名称

6.查询数据库中所有表名(mysql)

url后加 and 1=2 union select 1,2,group_concat(table_name),4,5...n from information_schema.tables where table_schema = database()

7. 查询指定表中所有字段名称

   url后加and 1=2 union select 1,2,group_concat(column_name),4,5...n from information_schema.columns where table_name = '查询的表名'

8. 查询指定字段的值

   url后加 and 1=2 union select 1,2,字段名,字段名,4,5...n from '表名' limit 1,1

   limit N,M : 从第 N (从0开始)条记录开始, 返回 M 条记录。

注释符举例

Mysql报错内容是在两个单引号中间,以下图为例:

说明查询语句是用双引号闭合,且有括号,需要将括号闭合,再用--+注释掉后面。但是此处不能使用#注释,原因是在url中#有特殊含义,表示片段标识符,会用来页面锚点定位,浏览器不会将#及其后面的内容发送到服务器。

举例:

获取所有库名

获取指定库的所有表名

获取指定表的所有列名

获取指定表的指定列的值

普通注入

后台能提供有价值的错误信息,显示在页面

XPath报错注入

暴露了库名

主要利用了数据库处理XML数据时的XPath函数,如(extractValue()和updateXML())产生的错误信息来泄露敏感数据

XPath报错基本原理

ExtractValue(xml_fragment, xpath_expression):从xml片段中提取符合XPath表达式的值

updateXML(xml_target, xpath_expression, new_value):根据XPath表达式更新XML文档中的某个节点

当XPath表达式语法不正确时,mysql会抛出错误,并将部分错误信息返回给用户。可以利用这一点,在XPath表达式中嵌入查询语句,通过错误信息获取数据库信息。一次性最多输出32位报错信息,所以可以用substr按段输出信息。

~即0x7e会因此XPath报错

ExtractValue(1,XPath)

updateXML(1,XPath,1)

举例:

extractvalue(1,concat(0x7e,(select @@version),0x7e)) //mysql 对 xml数据进行查询和修改的 xpath 函数,xpath 语法错误

updatexml(1,concat(0x7e,(select @@version),0x7e),1)//mysql 对 xml 数据进行查询和修改的 xpath 函数,xpath 语法错误

获取当前数据库名

输出所有库名的60-90位

输出users表中的列名

输出列的值

floor报错注入

Floor报错基本原理

Group by在向临时表插入数据时,由于rand()多次计算导致插入临时表时主建重复,从而报错。又因为报错前concat()中利用group by 和 floor() 函数引发分组冲突,导致数据库抛出错误。

报错需要满足的条件

Floor()报错注入在mysql 8.0已失效,7.3.4nts也失效。

注入语句中,查询用到的表内数据必须>=2条

需要用到count(*),floor()或者ceil(),rand(),group by

堆叠注入

允许攻击者通过在单个查询中执行多条sql语句来实现更复杂的攻击。堆叠注入利用了某些数据库和编程语言支持的多语句执行功能,从而可以在一个请求中执行多个sql操作。

Select * from users where id=1; drop table users;

Select和drop是两条独立的sql语句,他们会依次执行。如果应用程序未对用户的输入进行严格的过滤或转义,并且底层数据库支持多语句执行,就可以注入额外的语句进行操作

核心:

多语句执行:通过分号分隔,执行多条sql语句

权限提升:可以执行任意sql操作(创建、删除、修改数据)

盲注

通过仅有的判断信息对表中字段进行探测

布尔型盲注

构造一个条件语句,使得数据库根据条件的真假返回不同的结果。通过观察应用程序的行为变化(如页面是否正常加载、某些内容是否显示等),推断条件是否成立,从而逐步提取目标数据。

注入流程
  1. 确定注入点

测试是否存在布尔型盲注漏洞,例如:

?id=1 and 1=1

?id=1 and 1=2

如果1=1页面正常,但1=2页面异常,则可能存在布尔型盲注漏洞。

  1. 推到目标数据

使用逐位比较的方法,结合substr()和ascii()函数,推导出目标数据的每一位。

?id=1 and ascii(substr(database(),1,1))=115

如果页面正常,说明数据库名的第一位是s

注意:

  1. 页面行为的稳定性

布尔型盲注依赖页面行为的变化,因此需要确保页面在不同条件下有明显差异。

如果页面行为不稳定(如缓存、随机内容等),可能导致误判。

  1. 数据长度限制

在推导数据时,需要事先知道目标数据的长度,或者通过二分法逐步试探

  1. 效率问题

布尔型盲注逐位推导效率低,尤其是在目标数据较长时,建议结合自动化工具

  1. 权限限制

布尔型盲注需要数据库用户具有执行相关函数的权限,如substr(),ascii()等

延时盲注

构造包含条件判断的sql语句,若条件成立则触发延迟函数(如sleep()),否则立即返回。

注入流程
  1. 确认注入点存在延时盲注:试探性playload(如’ and sleep(5)--),若页面响应延时5s,则存在盲注漏洞。
  2. 构造条件判断逻辑:通过if(),case when 等条件语句将数据提取与延时绑定。

If(ascii(substr((select database()),1,1))>100,sleep(5),0)

若当前数据库名的第一个字符ascii值大于100,则触发5s延时。

  1. 逐字符提取数据

Length(database() )=n确定数据库名长度

与其他盲注技术的对比:

布尔盲注:通过页面内容变化(如“存在/不存在”)判断条件真假,无需延时但依赖可见状态差异。

报错盲注:结合报错注入与条件判断,通过是否触发错误间接推断数据,需要目标返回错误详情。

页面始终显示you are in...... ,此时用尝试用延时注入,页面会延时加载


http://www.hkcw.cn/article/KwOcsEXCGj.shtml

相关文章

eBay关键词搜索API开发指南

一、接口概述 eBay的Finding API提供findItemsByKeywords方法,支持通过关键词检索商品列表。该接口采用REST架构,返回标准JSON/XML格式数据,日均调用限额5000次(生产环境需申请提升配额)。 二、核心参数说明 必需参…

<6>, 界面优化

目录 一,QSS 1,背景介绍 2,基本语法 3,设置方式 (1)指定控件样式设置 (2)全局样式设置 (3)从文件加载样式表 (4)使用 Qt Desig…

截图工具 Snipaste V2.10.7(2025.06.2更新)

—————【下 载 地 址】——————— 【​本章下载一】:https://pan.xunlei.com/s/VORklK9hcuoI6n_qgx25jSq2A1?pwde7bi# 【​本章下载二】:https://pan.quark.cn/s/7c62f8f86735 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…

Docker安装Redis集群(3主3从+动态扩容、缩容)保姆级教程含踩坑及安装中遇到的问题解决

前言 部署集群前,我们需要先掌握Redis分布式存储的核心算法。了解这些算法能帮助我们在实际工作中做出合理选择,同时清晰认识各方案的优缺点。 一、分布式存储算法 我们通过一道大厂面试题来进行阐述。 如下:1-2亿条数据需要缓存&#xff…

Altium Disigner(16.1)学习-元器件封装

一、元器件封装 封装就是给画的原理图所有的器件的外形描述出来(几个引脚啦、引脚之间的长度啦、宽度啦),一定要精确。否则等到真正元器件焊在板子上的时候,会发现根本焊不上去,可能就是焊盘的位置不够精确。 可以点击…

初识CSS3

1. 什么是CSS <style>标签 行内样式 内部样式表 外部样式表⭐ CSS样式优先级⭐ 2. CSS3基本选择器 标签选择器 类选择器 ID选择器 基本选择器的特点⭐ 基本选择器的优先级⭐ 3. CSS3高级选择器-层次选择器 后代选择器 子选择器 相邻兄弟选择器 通用兄弟选择器 4. CSS3高级…

Python训练营---Day43

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 数据集来源水母图像数据集 --- Jellyfish Image Dataset&#xff0c;对水母图片进行分类&#xff0c;共6个类别。 数据集文件…

NLP学习路线图(十八):Word2Vec (CBOW Skip-gram)

自然语言处理&#xff08;NLP&#xff09;的核心挑战在于让机器“理解”人类语言。传统方法依赖独热编码&#xff08;One-hot Encoding&#xff09; 表示单词&#xff0c;但它存在严重缺陷&#xff1a;每个单词被视为孤立的符号&#xff0c;无法捕捉词义关联&#xff08;如“国…

win32相关(事件)

事件 什么是事件&#xff1f; 事件是指系统或应用程序中发生的特定动作或状态变化&#xff0c;这些动作或变化可以被程序检测并响应。Windows 采用事件驱动的编程模型&#xff0c;应用程序主要通过处理各种事件来与用户交互 我们来看一下事件的函数 HANDLE CreateEventW(LPSE…

VisionPro项目记录3 —— 圆心距

简介&#xff1a;本项目实现基于Cognex视觉系统的两圆心对位功能&#xff0c;使用一个圆作为基准&#xff0c;另一个圆进行补偿&#xff0c;输出偏移值给PLC或机械手。 系统采用CogFindCircleTool定位两圆心坐标&#xff0c;通过脚本计算圆心距并乘以缩放系数kValue&#xff0…

面向连接的运输:TCP

目录 TCP连接 TCP报文段结构 往返时间估计与超时 可靠数据传输 回退N步or超时重传 超时间隔加倍 快速重传 流量控制 TCP连接管理 三次握手 1. 客户端 → 服务器&#xff1a;SYN 包 2. 服务器 → 客户端&#xff1a;SYNACK 包 3. 客户端 → 服务器&#xff1a;AC…

使用Python进行函数作画

前言 因为之前通过deepseek绘制一下卡通的人物根本就不像&#xff0c;又想起来之前又大佬通过函数绘制了一些图像&#xff0c;想着能不能用Python来实现&#xff0c;结果发现可以&#xff0c;不过一些细节还是需要自己调整&#xff0c;deepseek整体的框架是没有问题&#xff0…

C#项目07-二维数组的随机创建

实现需求 创建二维数组&#xff0c;数组的列和宽为随机&#xff0c;数组内的数也是随机 知识点 1、Random类 Public Random rd new Random(); int Num_Int rd.Next(1, 100);2、数组上下限。 //定义数组 int[] G_Array new int[1,2,3,4];//一维数组 int[,] G_Array_T …

java Semaphore‌

Java Semaphore 用于控制同时访问特定资源的线程数量&#xff0c;通过管理一组“许可”&#xff08;permits&#xff09;实现并发限制。 模拟6人上厕所&#xff0c;但只有两个坑位&#xff0c;测试代码&#xff1a; import java.util.concurrent.Semaphore;// 假设厕所只有俩…

代码随想录算法训练营第60期第五十五天打卡

大家好&#xff0c;我们今天继续我们图论的部分&#xff0c;其实我们昨天是主要讲解了深搜与广搜的理论基础&#xff0c;我们大体上了解了两种算法的差异与适用情景&#xff0c;今天我们就继续我们的图论的章节&#xff0c;以后几天的题目是图论中比较有名的问题叫做岛屿问题&a…

【音视频】FFmpeg 编码H265

一、概述 实现了读入本地yuv文件&#xff0c;通过libx265编码为H265格式&#xff0c;并存储到本地文件中 二、实现流程 准备文件 在build路径下准备yuv文件 在项目中添加文件参数&#xff0c;输出为h265文件&#xff0c;使用libx265编码 初始化解码器 通过传进来的libx265…

贪心算法应用:带权任务间隔调度问题详解

贪心算法应用&#xff1a;带权任务间隔调度问题详解 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。带权任务间隔调度问题是贪心算法的一个经典应用场景。 问题定义…

Git-flow流

Git git是版本控制软件&#xff0c;一般用来做代码版本控制 github是一个免费版本控制仓库是国内外很多开源项目的集中地&#xff0c;其本体是一个git服务器 Git初始化操作 git init 初始化仓库 git status 查看当前仓库的状态 git add . 将改动的文件加到暂存区 gi…

LeetCode-链表操作题目

虚拟头指针&#xff0c;在当前head的前面建立一个虚拟头指针&#xff0c;然后哪怕当前的head的val等于提供的val也能进行统一操作 203移除链表元素简单题 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(…

mybatisplus的总结

一.通用Mapper 1.首先创建一个接口与实体类 Data TableName("user") public class User { TableId(value "id", type IdType.AUTO) private Long id; TableField("name") private String name; TableField("age") pri…