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 的记录的 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.rhkb.cn/news/18220.html

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

相关文章

Okay, But Please Don’t Stop Talking

Okay, But Please Don’t Stop Talking 研发背景 现有问题&#xff1a;像ChatGPT的高级语音模式这类先进的语音对语音系统&#xff0c;容易被“我明白”“嗯哼”等在人类对话中常见的插入语打断。这表明现有语音交互系统在处理自然对话中的语音重叠情况时存在不足。 新的尝试&…

Jenkins | Jenkins安装

Jenkins安装 一、前置准备二、启动三、登录 一、前置准备 下载安装包 war包 下载地址: https://www.jenkins.io/ 安装jdk 要求jdk11版本以上 集成maven项目的话 需要有maven 与 git 二、启动 启动命令 需要注意使用jdk11以上的版本 /usr/java/jdk17/bin/java -Xms2048m -X…

Unity UI 道路线跟随:让图标沿道路轨迹移动

在 Unity UI 开发中&#xff0c;有时需要让图标沿着一条道路轨迹移动&#xff0c;比如地图上的车辆行驶动画、导航路径指示等。本文介绍如何基于 UI 图片中的道路线生成曲线&#xff0c;并使用 Slider 控制图标沿轨迹运动&#xff0c;适用于 UI 导航、路径跟随动画等场景。 1. …

「软件设计模式」建造者模式(Builder)

深入解析建造者模式&#xff1a;用C打造灵活对象构建流水线 引言&#xff1a;当对象构建遇上排列组合 在开发复杂业务系统时&#xff0c;你是否经常面对这样的类&#xff1a;它有20个成员变量&#xff0c;其中5个是必填项&#xff0c;15个是可选项。当用户需要创建豪华套餐A&…

有哪些免费的SEO软件优化工具

随着2025年互联网的不断发展&#xff0c;越来越多的企业意识到在数字营销中&#xff0c;网站的曝光度和排名至关重要。无论是想要提高品牌知名度&#xff0c;还是想要通过在线销售增加收益&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;都是一项不可忽视的关键策略。而要…

DeepSeek从入门到精通:提示词设计的系统化指南

目录 引言&#xff1a;AIGC时代的核心竞争力 第一部分 基础篇&#xff1a;提示词的本质与核心结构 1.1 什么是提示词&#xff1f; 1.2 提示词的黄金三角结构 第二部分 类型篇&#xff1a;提示词的六大范式 2.1 提示语的本质特征 2.2 提示语的类型 2.2.1 指令型提示词 …

单智能体到多智能体智能体任务规划有什么变化

单智能体到多智能体智能体任务规划有什么变化 核心原理 单智能体任务规划:大模型利用其强大的自然语言理解和生成能力,结合多模态信息,将自然语言描述的任务分解为可执行子任务,并能根据环境反馈调整执行策略。在规划过程中,可通过不同方式生成或优化任务计划,如端到端规…

算法之 跳跃游戏

文章目录 55.跳跃游戏思路参考&#xff1a;56.合并区间 55.跳跃游戏 55.跳跃游戏 灵神思路 思路分析&#xff1a; 两种思路&#xff0c;思路1是我们可以直接维护当前到达i的时候所能到达的最右的边界mr&#xff0c;如果i>mr就说明无法到达i,否则就是可以到达&#xff1b;…

Ubuntu22.04通过Docker部署Jeecgboot

程序发布环境包括docker、mysql、redis、maven、nodejs、npm等。 一、安装docker 1、用如下命令卸载旧Docker: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done 2、安装APT环境依赖包…

STM32 ADC介绍(硬件原理篇)

目录 背景 AD转换器 采样与保持 量化 编码 AD转换器转换原理 DA转换原理 AD转换原理 1.逐次逼近型AD转换器 2.并联比较型AD转换器 编码器 同步D触发器和边沿D触发器 基本RS触发器 同步RS触发器 同步D触发器 边沿型D触发器&#xff08;维持-阻塞D触发器&#xff…

DeepSeek4j 已开源,支持思维链,自定义参数,Spring Boot Starter 轻松集成,快速入门!建议收藏

DeepSeek4j Spring Boot Starter 快速入门 简介 DeepSeek4j 是一个专为 Spring Boot 设计的 AI 能力集成启动器&#xff0c;可快速接入 DeepSeek 大模型服务。通过简洁的配置和易用的 API&#xff0c;开发者可轻松实现对话交互功能。 环境要求 JDK 8Spring Boot 2.7Maven/Gr…

编程技巧:VUE 实现接口返回数据的流式处理

一、写在前面 ChatGPT 的问答响应界面相信大家都见过&#xff0c;内容是一点一点追加式的显示。不是等好了一起发给你&#xff0c;然后一次性展示出来。这种效果和我们平常开发的展示渲染模式有点区别。可能有的同学会说&#xff0c;前端拿到报文后&#xff0c;我们做成这样的…

Django 创建表 choices的妙用:get_<field_name>_display()

1.定义choices 我在创建表时&#xff0c;对于性别这个字段&#xff0c;定义了choices 选项&#xff0c;1代表男&#xff0c;2代表女 mysql中表的数据如下&#xff0c;里面存储的是1或2 如果我们在网页上展示的时候&#xff0c;想展示“男”或“女”&#xff0c;而不是数字1或2…

Mac安装JD-GUI

Mac安装反编译工具步骤如下&#xff1a; 打开官网https://java-decompiler.github.io/ 选择下载mac的安装包解压下载好的压缩包&#xff0c;点击JD-GUI安装 有可能会遇到如下错误。请先检查是否安装JDK&#xff0c;通过java -version命令查看是否是1.8版本的jdk如果jdk没问题&…

[免费]Springboot+Vue医疗(医院)挂号管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringbootVue医疗(医院)挂号管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue医疗(医院)挂号管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 在如今社会上&#xff0c;关于信息上…

链表(典型算法思想)—— OJ例题算法解析思路

目录 一、2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 1. 初始化 2. 遍历链表并相加 3. 返回结果 举例说明 二、24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 代码思路 举例说明 初始状…

twisted实现MMORPG 游戏数据库操作封装设计与实现

在设计 MMORPG&#xff08;大规模多人在线角色扮演游戏&#xff09;时&#xff0c;数据库系统是游戏架构中至关重要的一部分。数据库不仅承担了游戏中各种数据&#xff08;如玩家数据、物品数据、游戏世界状态等&#xff09;的存储和管理任务&#xff0c;还必须高效地支持并发访…

lvsDR模式实现

LVS DR模式与NAT模式的优缺点&#xff1a; NAT&#xff1a;优点&#xff1a;配置简单&#xff0c;所需网络环境简单&#xff0c;访问流量的出入都经过LVS服务器&#xff0c;控制流量简单&#xff0c; 缺点&#xff1a;由于访问流量的出入都会经过LVS服务器&#xff0c;所以LVS…

闭源大语言模型的怎么增强:提示工程 检索增强生成 智能体

闭源大语言模型的怎么增强 提示工程 检索增强生成 智能体 核心原理 提示工程:通过设计和优化提示词,引导大语言模型进行上下文学习和分解式思考,激发模型自身的思维和推理能力,使模型更好地理解和生成文本,增强其泛用性和解决问题的能力。检索增强生成:结合检索的准确…

【快速幂算法】快速幂算法讲解及C语言实现(递归实现和非递归实现,附代码)

快速幂算法 快速幂算法可用分治法实现 不难看出&#xff0c;对任意实数a和非负整数n&#xff0c;有&#xff1a; a n { 1 , n 0 , a ≠ 0 0 , a 0 ( a n 2 ) 2 , n > 0 , n 为偶数 ( a n 2 ) 2 ∗ a , n > 0 , n 为奇数 a^n \begin{cases} 1, & n 0, a\neq 0…