zyNo.23
SQL注入漏洞
1.SQL语句基础知识
一个数据库由多个表空间组成,sql注入关系到关系型数据库,常见的关系型数据库有MySQL,Postgres,SQLServer,Oracle等
以Mysql为例,输入 mysql-u用户名-p密码 即可登录到MySQL交互式命令行界面。
既然是数据的集合,我们要想操作这些数据就需要有一定的媒介和手段。比如,可以选择用图形化的工具(如Datagrip、Navicat等),也可以直接使用数据库管理工具自带的命令行(如MySQL自带了一个命令行的界面,Postgres亦然)。我们要与这些界面进行交互,去管理数据的话,就需要一种语言或者说一种规范去定义,这就是sql语句
sql语句的基本操作:
#创建表users,其中包含两个字段id、name
create table users (id int (11),name varchar(256));
#查看当前数据库下的所有表名
show tables;
#向 users表中插入数据
insert into users values (1,'admin'), (2,'test');
#查询users 表中的所有数据
select * from users;
#查询id为1的数据
select * from users where id=1;
#修改数据(将name为admin的数据改为name为abc)
update users set name='abc' where name='admin';详细解释看我另一篇文章SQL 语句的详细解释-CSDN博客【代码】SQL 语句的详细解释。
https://blog.csdn.net/2401_88743143/article/details/145594691?sharetype=blogdetail&sharerId=145594691&sharerefer=PC&sharesource=2401_88743143&sharefrom=mp_from_link
2.SQL注入漏洞的基础概念

代码解释
include "db.php";:使用include语句引入名为db.php的文件。通常db.php会包含数据库连接、操作相关的函数或配置信息,这里引入它是为了后续能使用其中定义的数据库操作功能(如代码中的select函数)。$id = $_GET['id'];:通过$_GET超全局变量获取 URL 中传递的名为id的参数值,并将其赋值给变量$id。$_GET用于获取通过 GET 方法提交的数据,例如在 URL 中形如example.php?id=1的形式,1就会被获取到赋值给$id。$result = select("select title, content from contents where id=$id;");:调用名为select的函数(此函数应在db.php中定义),传入一个 SQL 查询语句select title, content from contents where id=$id;。该 SQL 语句的作用是从名为contents的数据库表中,查询id字段值等于$id的记录的title和content字段内容。查询结果会被存储在$result变量中。echo(json_encode(isset($result[0])? $result[0] : []));:首先使用isset函数判断$result数组的第一个元素(索引为0)是否存在。如果存在,就将其作为参数传递给json_encode函数,将其转换为 JSON 格式的字符串;如果不存在,就将一个空数组[]转换为 JSON 格式字符串。最后使用echo函数输出转换后的 JSON 字符串。这段代码存在 SQL 注入风险,因为
$id直接拼接进 SQL 语句中,如果用户可控的$id传入恶意内容(如1; DROP TABLE contents;),可能导致数据库被恶意操作。
注意,如果输入“id =- 1 or1=1;#”,则查询语句为“select title,content from contents where id =- 1 or 1=1;#;”,语句中的where判断子句部分可以分成两个条件“或”来看,满足其一即可。首先来看id =- 1,id字段显然不会存在为负数的记录,则前半部分不成立;后半部分为1=1,永远成立,此条件可以把所有记录匹配查询出来。“;#”是为了将语句后面可能出现的多余查询条件给注释掉,避免造成利用失败。
3.手工注入方法
数据库
先用union(因为SQL语句union要求联合起来的前后请求列数必须相等,这样才能正确查询出结果。)探测sql查询语句有几行,利用“-1 union select 1;#"“-1 union select 1,2;#”等进行探测(
只要有形如title为1,content为2等返回不为空的结果,就说明成功探测到了列数。),
控制联合查询中1,2任意一个位置为回显位,即可回带数据。例如:
获取数据库当前的版本,传入“id =- 1 unionselect 1,version();#",![]()
获取当前连接所在的数据库的名称,传入“id =- 1 unionselect 1,database();#”,![]()
获取当前连接的用户,传入“id =- 1 union select1,user();#。
如果想获取数据库系统中所有数据库的名称列表,显然此处不能使用“show databases;”,需要想办法从MySQL之前自带的数据库中获取信息,如information_schema,这个数据库储存了数据库的信息,我们来尝试获取其中的schema_name字段的数据。
为什莫不用show databases;
在正常的MySQL客户端环境中,“show databases”能直接展示所有数据库名称,这是客户端工具和MySQL服务端交互的正常流程。但在SQL注入时,我们注入的语句通常是要嵌在其他SQL语句里执行的,而且可能受到各种限制和上下文环境的影响。很多时候,单纯使用“show databases”并不能按预期那样获取到所有数据库名称列表,并且它的输出格式等也不一定适合注入场景下我们对数据提取和处理的需求。
information_schema
MySQL自带的数据库,其中有一个很重要的数据库叫“information_schema”。这个数据库里存储了很多关于MySQL系统的元数据信息,包括所有数据库的结构、表结构、字段信息等等。如果我们想在SQL注入时获取所有数据库名称,就可以从“information_schema”数据库里的特定表(比如“schemata_names”表)中去查询。这个表中记录了所有数据库的名称,我们通过合适的查询语句,比如
“select schema_name from information_schema.schemata_names;”,就能获取到所有数据库的名称列表。
如果我们想要获取其他数据库的名字,一种办法是用limit子句。传入“id =- 1 union select 1,schema_name from
information_schema.schemata limit 1, 1;#",格式为limit<起始位置>,<查询条数>从0开始,则1就是第二条数据。
(id=-1 UNION SELECT 1, schema_name FROM information_schema.schemata_names LIMIT 1, 1;#)
但这样就意味着我们需要依次修改起始位置来获取数据,非常麻烦。这时我们就需要使用到另外一种语法,传入“id=-1 union select 1,group_concat (schema_name) from information_schema. schemata;#”,使用group_concat把这个字段所有的查询结果用逗号拼接到一起
数据表
例如查看ctf-training 这个库里的表有什么内容,需要从information_schema这个库里的表tables去查找相应的信息
(1)先找表名。传入“id =- 1 union select1,group_concat(table_name) from information_schema.tables where table_schema='ctftraining';#",查询ctftraining这个库中所有表的名称并拼接返回,
(2)接着union select需要知道表里字段的名称才能做单字段的查询,如果直接输入 ,很大概率会因为union select前后列数不一致导致查询出错。所以我们还得获取表里的字段名,这里我们就从information_schema的columns表进行查询。比如想查询FLAG_TABLE这个表的字段名,就传入“id =- 1 union select 1 , group_concat( column_name ) from information_schema.columns where table_schema='ctftraining'and table_name='flag';#"
(3)拿到了字段名flag,我们就可以来尝试拉取数据了,传入“id =- 1 union select 1, flag from ctftraining.flag;#",
4.注入利用方式分类——布尔盲注利用

数据库有记录,就返回res=1,否则就返回res=0,所以需要利用好仅存的这一点1和0的结果,获取数据库里的数据,尝试利用username参数,传入username=1' or 1=1;#,后端查询的语句就相当于变成了:select password from admin where username =' 1 ' or 1=1; #
or 1=1永远为真,则永远会查询到记录,所以请求会返回1,对此进行利用,如果我们能在此处进行一个判断,比如判断某个数据字段第几位上的字符是否为'1',如果成立则为真,不成立为假。写成语句如下:select password from admin where username='1'or if((substring(version (),1,1)='1'),1,0);#
代码解释
if函数:if是 SQL 中的条件判断函数,其语法为if(condition, value_if_true, value_if_false)。意思是如果condition条件为真,则返回value_if_true;如果为假,则返回value_if_false。在这条语句里,if((substring(version (),1,1)='1'),1,0)就是判断substring(version (),1,1)='1'这个条件是否成立,如果成立就返回1,不成立则返回0。substring(version (),1,1):
version()是 SQL 中的一个函数,用于返回当前数据库的版本信息,例如5.7.33等。substring(str, start, length)是字符串截取函数,用于从字符串str中截取从start位置开始、长度为length的子字符串。所以substring(version (),1,1)就是截取数据库版本信息的第一个字符。- 总的说就是:就是判断version()从第一位开始的一位字符是否为'1',是则返回1,否则返回0,得出version()的值
5.SQL注入利用方式分类——时间盲注利用
没有回显就利用返回时间快慢确定字符,用MySQL中sleep函数。例如:
传入“username=1' or if((substring (version(),1,1)='1'),sleep (10),0);#”,也就是当version()第一位为1时,就会进入到第二个参数里,会触发sleep(10),如果不符合就会返回0。sleep(10)则会让语句等待10s后再返回
补充资料
我在之前的文章zyNo.18-CSDN博客 有一些关于布尔和时间盲注的相关知识
经典例题:[CISCN2019]Hack World-CSDN博客
相关文章:
zyNo.23
SQL注入漏洞 1.SQL语句基础知识 一个数据库由多个表空间组成,sql注入关系到关系型数据库,常见的关系型数据库有MySQL,Postgres,SQLServer,Oracle等 以Mysql为例,输入 mysql-u用户名-p密码 即可登录到MySQL交互式命令行界面。 既然是…...
visual studio 在kylin v10上跨平台编译时c++标准库提示缺少无法打开的问题解决
情况1:提示无法打开 源文件 "string"之类导致无法编译 情况2:能编译,但无法打开这些库文件或标准库使用提示下划红色问题 解决方案: 一、通过工具->选项->跨平台里,在“远程标头IntelliSense管理器”更新下载一下…...
黑马Mistral Le chat逆转deepseek
法国人工智能聊天机器人出来了。 Mistral AI比deepseek 性能快很多,准确率更高,非常好用。 全新的发现! 站在老美已经出来的方法&理论上,感觉有0.2亿美金和有gpu算力,感觉搞一个超越国内deepseek难道其实…...
Spring Cloud — 深入了解Eureka、Ribbon及Feign
Eureka 负责服务注册与发现;Ribbon负责负载均衡;Feign简化了Web服务客户端调用方式。这三个组件可以协同工作,共同构建稳定、高效的微服务架构。 1 Eureka 分布式系统的CAP定理: 一致性(Consistency)&am…...
Web项目测试专题(六)压力测试
概述: 压力测试检验Web应用在高并发、高负载情况下的表现,帮助预估系统承载能力和发现瓶颈 步骤: 并发用户测试:增加虚拟用户数测试系统在多人同时使用时的表现 负载测试:模拟高负载情况测试系统的稳定性和响应时间…...
2.5 使用注解进行单元测试详解
Mockito 使用注解进行单元测试详解 Mockito 提供了一系列注解来简化测试代码的编写,减少手动创建和管理 Mock 对象的样板代码。结合 JUnit 5,可以更高效地构建清晰、易维护的单元测试。 1. 核心注解概览 注解作用Mock创建并注入一个 Mock 对象…...
2025年SEO工具有哪些?老品牌SEO工具有哪些
随着2025年互联网的发展和企业线上营销的日益重要,SEO(搜索引擎优化)逐渐成为了提高网站曝光率和流量的重要手段。SEO的工作不仅仅是简单地通过关键词优化和内容发布就能够实现的,它需要依赖一系列专业的SEO工具来帮助分析、监测和…...
使用 React 16+Webpack 和 pdfjs-dist 或 react-pdf 实现 PDF 文件显示、定位和高亮
写在前面 在本文中,我们将探讨如何使用 React 16Webpack 和 pdfjs-dist 或 react-pdf 库来实现 PDF 文件的显示、定位和高亮功能。这些库提供了强大的工具和 API,使得在 Web 应用中处理 PDF 文件变得更加容易。 项目设置 首先,我们需要创建…...
LabVIEW显微镜成像偏差校准
在高精度显微镜成像中,用户常常需要通过点击图像的不同位置,让电机驱动探针移动到指定点进行观察。然而,在实际操作中,经常会遇到一个问题:当点击位于图像中心附近的点时,探针能够相对准确地定位࿱…...
【Elasticsearch】文本分析Text analysis概述
文本分析概述 文本分析使 Elasticsearch 能够执行全文搜索,搜索结果会返回所有相关的结果,而不仅仅是完全匹配的结果。 如果你搜索“Quick fox jumps”,你可能希望找到包含“A quick brown fox jumps over the lazy dog”的文档,…...
23页PDF | 国标《GB/T 44109-2024 信息技术 大数据 数据治理实施指南 》发布
一、前言 《信息技术 大数据 数据治理实施指南》是中国国家标准化管理委员会发布的关于大数据环境下数据治理实施的指导性文件,旨在为组织开展数据治理工作提供系统性的方法和框架。报告详细阐述了数据治理的实施过程,包括规划、执行、评价和改进四个阶…...
AI代码生成器如何重塑前端开发的工作环境
近年来,人工智能(AI)技术迅猛发展,深刻地改变着各行各业的工作方式。在软件开发领域,AI写代码工具的出现更是掀起了一场革命,尤其对前端开发工程师的工作环境和协作方式产生了深远的影响。本文将深入探讨AI…...
kafka的架构和工作原理
目录 Kafka 架构 Kafka 工作原理 Kafka 数据流 Kafka 核心特性 总结 Kafka 架构 1. 生产者(Producer) 2. 消费者(Consumer) 3. 主题(Topic) 4. 分区(Partition) 5. 副本(Replica) 6. 代理(Broker) 7. ZooKeeper(旧版本)/KRaft(新版本) Kafka 工作…...
Xcode证书密钥导入
证书干嘛用 渠道定期会给xcode证书,用来给ios打包用,证书里面有记录哪些设备可以打包进去。 怎么换证书 先更新密钥 在钥匙串访问中,选择系统。(选登录也行,反正两个都要导入就是了)。 mac中双击所有 .p12 后缀的密钥ÿ…...
索引的详细介绍
数据库索引是一种用于加速数据检索的数据结构,类似于书籍的目录。通过索引,数据库可以快速定位数据,而无需扫描整个表。以下是关于数据库索引的详细介绍: 1. 索引的基本概念 定义:索引是数据库表中一列或多列的值及其…...
Python 基于 OpenCV 的人脸识别上课考勤系统(附源码,部署教程)
博主介绍:✌2013crazy、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&a…...
TikTok网页版访问受限?一文解析解决方案
TikTok网页版是许多用户用来浏览视频、管理账号和发布内容的重要工具。然而,部分用户可能会遇到无法打开TikTok网页版的问题,如页面加载失败、显示网络错误或提示访问受限。本文将帮助你快速排查问题,并提供解决方案,让你顺利访问…...
本地部署【LLM-deepseek】大模型 ollama+deepseek/conda(python)+openwebui/docker+openwebui
通过ollama本地部署deepseek 总共两步 1.模型部署 2.[web页面] 参考官网 ollama:模型部署 https://ollama.com/ open-webui:web页面 https://github.com/open-webui/open-webui 设备参考 Mac M 芯片 windows未知 蒸馏模型版本:deepseek-r1:14b 运行情况macminim2 24256 本地…...
【vs2022配置cursor】
Cursor搭配cmake实现C程序的编译、运行和调试的参考地址 cursor下载地址 第一步: 电脑上按爪cmake 第二步:cursor 配置 安装中文 第三步环境变量: D:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.35.322…...
Redis 的缓存雪崩、缓存穿透和缓存击穿详解,并提供多种解决方案
本文是对 Redis 知识的补充,在了解了如何搭建多种类型的 Redis 集群,并清楚了 Redis 集群搭建的过程的原理和注意事项之后,就要开始了解在使用 Redis 时可能出现的突发问题和对应的解决方案。 引言:虽然 Redis 是单线程的…...
Docker使用指南与Dockerfile文件详解:从入门到实战
Docker使用指南与Dockerfile文件详解:从入门到实战 文章目录 **Docker使用指南与Dockerfile文件详解:从入门到实战****引言****第一部分:Docker 核心概念速览****1. Docker 基础架构****2. Docker 核心命令****第二部分:Dockerfile 文件深度解析****1. Dockerfile 是什么?…...
如何在个人电脑本地化部署Deepseek-R1大模型
文章目录 Deepseek概述公司简介DeepSeek模型优势DeepSeek模型发展历史Ollama安装Deepseek版本选择Deepseek支持的客户端工具编程语言客户端库桌面客户端插件类其他工具客户端工具配置cherryStudio配置测试如何使用DeepSeek满血版什么是 DeepSeek R1 满血版?deepseek官方第三方…...
DeepSeek-R1复现方案梳理
open-r1 项目地址:https://github.com/huggingface/open-r1 由huggingface组建,目前刚上线2周,发布了最新进展open-r1/update-1,在MATH-500任务上接近deepseek的指标,可以在open-r1/open-r1-eval-leaderboard查看指标的…...
【Redis】 - Redis的Bitmap实现用户签到
Redis的Bitmap实现用户签到 使用Redis的Bitmap数据结构来记录用户的每日签到状态是一种高效且节省空间的方法。通过将用户ID和日期结合生成动态Key,可以轻松管理不同用户在不同日期的签到情况。下面详细介绍如何设计这一方案。 设计思路 动态Key生成:根…...
用php tp6对接钉钉审批流的 table 表格 明细控件 旧版sdk
核心代码 foreach ($flows[product_list] as $k>$gift) {$items_list[] [[name > 商品名称, value > $gift[product_name] ?? ],[name > 规格, value > $gift[product_name] ?? ],[name > 数量, value > $gift[quantity] ?? ],[name > 单位, v…...
使用DeepSeek建立一个智能聊天机器人0.07
进一步完善获取API密钥和DeepSeek的API端点,我们可以添加更多的错误处理和默认值设置,确保程序在各种情况下都能正常运行。同时,我们还可以提供一个更友好的用户界面,以便用户可以轻松地设置和查看配置信息。 以下是进一步完善的…...
PySpark查找Dataframe中的非ASCII字符并导出Excel文件
from pyspark.sql import SparkSession from pyspark.sql.types import StringType from pyspark.sql.functions import udf, col from pyspark.sql.types import BooleanType import pandas as pd# 初始化Spark会话 spark SparkSession.builder.appName("StringFilter&q…...
大模型RLHF:PPO原理与源码解读
大模型RLHF:PPO原理与源码解读 原文链接:图解大模型RLHF系列之:人人都能看懂的PPO原理与源码解读 本文直接从一个RLHF开源项目源码入手(deepspeed-chat),根据源码的实现细节,给出尽可能丰富的训…...
SQLite 数据库:优点、语法与快速入门指南
文章目录 一、引言二、SQLite 的优点 💯三、SQLite 的基本语法3.1 创建数据库3.2 创建表3.3 插入数据3.4 查询数据3.5 更新数据3.6 删除数据3.7 删除表 四、快速入门指南4.1 安装 SQLite4.2 创建数据库4.3 创建表4.4 插入数据4.5 查询数据4.6 更新数据4.7 删除数据4…...
pytorch笔记:mm VS bmm
1 bmm (batch matrix multiplication) 批量矩阵乘法,用于同时处理多个矩阵的乘法bmm 的输入是两个 3D 张量(batch of matrices),形状分别为 (batch_size, n, m) 和 (batch_size, m, p)bmm 输出的形状是 (batch_size, n, p) 2 mm…...
