zyNo.23

news2025/3/16 23:22:40

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 的记录的 titlecontent 字段内容。查询结果会被存储在 $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博客

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

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

相关文章

visual studio 在kylin v10上跨平台编译时c++标准库提示缺少无法打开的问题解决

情况1&#xff1a;提示无法打开 源文件 "string"之类导致无法编译 情况2:能编译&#xff0c;但无法打开这些库文件或标准库使用提示下划红色问题 解决方案&#xff1a; 一、通过工具->选项->跨平台里&#xff0c;在“远程标头IntelliSense管理器”更新下载一下…

Spring Cloud — 深入了解Eureka、Ribbon及Feign

Eureka 负责服务注册与发现&#xff1b;Ribbon负责负载均衡&#xff1b;Feign简化了Web服务客户端调用方式。这三个组件可以协同工作&#xff0c;共同构建稳定、高效的微服务架构。 1 Eureka 分布式系统的CAP定理&#xff1a; 一致性&#xff08;Consistency&#xff09;&am…

2025年SEO工具有哪些?老品牌SEO工具有哪些

随着2025年互联网的发展和企业线上营销的日益重要&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;逐渐成为了提高网站曝光率和流量的重要手段。SEO的工作不仅仅是简单地通过关键词优化和内容发布就能够实现的&#xff0c;它需要依赖一系列专业的SEO工具来帮助分析、监测和…

LabVIEW显微镜成像偏差校准

在高精度显微镜成像中&#xff0c;用户常常需要通过点击图像的不同位置&#xff0c;让电机驱动探针移动到指定点进行观察。然而&#xff0c;在实际操作中&#xff0c;经常会遇到一个问题&#xff1a;当点击位于图像中心附近的点时&#xff0c;探针能够相对准确地定位&#xff1…

23页PDF | 国标《GB/T 44109-2024 信息技术 大数据 数据治理实施指南 》发布

一、前言 《信息技术 大数据 数据治理实施指南》是中国国家标准化管理委员会发布的关于大数据环境下数据治理实施的指导性文件&#xff0c;旨在为组织开展数据治理工作提供系统性的方法和框架。报告详细阐述了数据治理的实施过程&#xff0c;包括规划、执行、评价和改进四个阶…

AI代码生成器如何重塑前端开发的工作环境

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅猛发展&#xff0c;深刻地改变着各行各业的工作方式。在软件开发领域&#xff0c;AI写代码工具的出现更是掀起了一场革命&#xff0c;尤其对前端开发工程师的工作环境和协作方式产生了深远的影响。本文将深入探讨AI…

Xcode证书密钥导入

证书干嘛用 渠道定期会给xcode证书&#xff0c;用来给ios打包用&#xff0c;证书里面有记录哪些设备可以打包进去。 怎么换证书 先更新密钥 在钥匙串访问中&#xff0c;选择系统。(选登录也行&#xff0c;反正两个都要导入就是了)。 mac中双击所有 .p12 后缀的密钥&#xff…

Python 基于 OpenCV 的人脸识别上课考勤系统(附源码,部署教程)

博主介绍&#xff1a;✌2013crazy、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&a…

TikTok网页版访问受限?一文解析解决方案

TikTok网页版是许多用户用来浏览视频、管理账号和发布内容的重要工具。然而&#xff0c;部分用户可能会遇到无法打开TikTok网页版的问题&#xff0c;如页面加载失败、显示网络错误或提示访问受限。本文将帮助你快速排查问题&#xff0c;并提供解决方案&#xff0c;让你顺利访问…

【vs2022配置cursor】

Cursor搭配cmake实现C程序的编译、运行和调试的参考地址 cursor下载地址 第一步&#xff1a; 电脑上按爪cmake 第二步&#xff1a;cursor 配置 安装中文 第三步环境变量&#xff1a; D:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.35.322…

Redis 的缓存雪崩、缓存穿透和缓存击穿详解,并提供多种解决方案

本文是对 Redis 知识的补充&#xff0c;在了解了如何搭建多种类型的 Redis 集群&#xff0c;并清楚了 Redis 集群搭建的过程的原理和注意事项之后&#xff0c;就要开始了解在使用 Redis 时可能出现的突发问题和对应的解决方案。 引言&#xff1a;虽然 Redis 是单线程的&#xf…

DeepSeek-R1复现方案梳理

open-r1 项目地址&#xff1a;https://github.com/huggingface/open-r1 由huggingface组建&#xff0c;目前刚上线2周&#xff0c;发布了最新进展open-r1/update-1&#xff0c;在MATH-500任务上接近deepseek的指标&#xff0c;可以在open-r1/open-r1-eval-leaderboard查看指标的…

用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…

大模型RLHF:PPO原理与源码解读

大模型RLHF&#xff1a;PPO原理与源码解读 原文链接&#xff1a;图解大模型RLHF系列之&#xff1a;人人都能看懂的PPO原理与源码解读 本文直接从一个RLHF开源项目源码入手&#xff08;deepspeed-chat&#xff09;&#xff0c;根据源码的实现细节&#xff0c;给出尽可能丰富的训…

SQLite 数据库:优点、语法与快速入门指南

文章目录 一、引言二、SQLite 的优点 &#x1f4af;三、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…

5、大模型的记忆与缓存

文章目录 本节内容介绍记忆Mem0使用 mem0 实现长期记忆 缓存LangChain 中的缓存语义缓存 本节内容介绍 本节主要介绍大模型的缓存思路&#xff0c;通过使用常见的缓存技术&#xff0c;降低大模型的回复速度&#xff0c;下面介绍的是使用redis和mem0&#xff0c;当然redis的语义…

LangChain系列:LangChain基础入门教程

LangChain 是一个开源框架&#xff0c;旨在简化使用大型语言模型&#xff08;LLM&#xff09;创建应用程序的过程。它为链提供了标准接口&#xff0c;与许多其他工具进行了集成&#xff0c;并为常见应用提供了端到端的链。 LangChain 让 AI 开发人员能够基于大型语言模型&#…

修改docker内容器中的某配置文件的命令

先找到配置文件config.php find / -name "config.php" 2>/dev/null 然后用vi编辑器修改配置文件 vi /var/www/config.php 最后就是vi的基本操作&#xff0c;根据具体需求使用&#xff1a; vi 有两种主要模式&#xff1a; 命令模式&#xff1a;进入 vi 后的默认…

无人机遥感图像拼接及处理实践技术:生态环境监测、农业、林业等领域,结合图像拼接与处理技术,能够帮助我们更高效地进行地表空间要素的动态监测与分析

近年来&#xff0c;无人机技术在遥感领域的应用越来越广泛&#xff0c;尤其是在生态环境监测、农业、林业等领域&#xff0c;无人机遥感图像的处理与分析成为了科研和业务化工作中的重要环节。通过无人机获取的高分辨率影像数据&#xff0c;结合图像拼接与处理技术&#xff0c;…

基于Springmvc+MyBatis+Spring+Bootstrap+EasyUI+Mysql的个人博客系统

基于SpringmvcMyBatisSpringBootstrapEasyUIMysql的个人博客系统 1.项目介绍 使用Maven3Spring4SpringmvcMybatis3架构&#xff1b;数据库使用Mysql&#xff0c;数据库连接池使用阿里巴巴的Druid&#xff1b;使用Bootstrap3 UI框架实现博客的分页显示&#xff0c;博客分类&am…