sql注入详解

2023-11-05

# sql注入详解

## SQLI介绍

SQLI,sql injection,我们称之为sql注入,sql(Structured Query Language),叫做结构化查询语句。在我们的应用系统使用 sql 语句进行管理应用数 据库时,往往采用拼接的方式形成一条完整的数据库语言,而危险的是,在拼接 sql 语句的 时候,我们可以改变 sql 语句。从而让数据执行我们想要执行的语句,这就是我们常说的 sql 注入。

## 一、漏洞原理分析

sql注入的原理通俗的来说,就是通关SQL命令将web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令。

举个例子,以sqli-labs第一关为列,(sqli-labs是一个sql注入的靶场),按要求查询?id=1


得到的结果为:name和Password均为Dumb。

当我们输入?id=2时,又得到了不同的结果。

我们进入数据库去查看一下。(默认知道了数据库名字security)

可以发现我们查询的信息存在users这个表中。这里我们就可以知道了我们输入的SQL命令最终进入数据库中进行相应的查询,试想一下,如果我们构造一个恶意的SQL语句,是不是就可以达到我们想要的目的——数据库信息泄露,网页篡改,网站挂马,数据库恶意操作,服务器被远程控制等等。

为了更加清楚sql语句的执行和变化过程,我们可以查看源码,打开Less-1/index.php,在源码中添加几行语句。

[

访问后得到

红色框出来的语句就是执行的sql语句,我们输入的变量‘1’也在其中。通常我们构造的SQL语句就是这个‘1’的内容。在1后面加一个单引号。

显示语法错误,说靠经'1'' limit 0,1有语法错误,我们输入的1’被完整的带入到SQL语句中。这里错误的原理是我们输入的单引号与前面的单引号进行闭合,导致后面的单引号变成了多余的。而sql语句中的引号必须是成对出现的。否则就会报错。

那么问题来了,我们如何才能写入我们想要的sql语句呢,既然这里对我们输入的单引号没有进行过滤,那么我们是不是可以在闭合后的语句后面插入我们想要查询的语句,这样就达到了我们的目的。

在这之间,我们需要了解sql语句的基本用法——[myslq基础学习](https://blog.csdn.net/qq_44159028/article/details/114327303?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163875545216780269895046%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163875545216780269895046&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-1-114327303.pc_v2_rank_blog_default&utm_term=mysql&spm=1018.2226.3001.4450)

## 二、漏洞危害

SQL注入漏洞对数据安全的影响:

```
数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。网页篡改:通过操作数据库对特定网页进行篡改。
网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
服务器被远程控制,被安装后门:经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
破坏硬盘数据,瘫痪全系统。
```

## 三、注入流程

 1.判断网站是否存在数据库注入漏洞。
        and 1=1 --> 页面有内容 
        and 1=2 --> 页面没有内容
            ==> 推断出该网站存在数据库注入漏洞。
                原因:我们输入的数据库语句,该网站执行。
2.判断字段(列)数 ,order by ,作用:排序。
    ps:一个网站存在数据库注入漏洞,意味着我们输入的数据库语句都会执行。
        order by 1 --> 页面有内容 --> 说明网站的表里面有1列。
        order by 2 --> 页面有内容 --> 说明网站的表里面有2列。
        order by 3 --> 页面没有内容 --> 说明网站的表里面没有3列,只有2列。
    ps:当and被网站过滤的时候,可以使用order by 来判断。
3.判断回显点。union 作用:能够同时执行两条查询语句。关键点:必须保证前后两条查询的语句【列的个数保持一致】。
        回显点:能够将我们输入的数据库语句,执行,并且将执行的结果显示到页面上。
        and 1=2 union select 1,2
 4.查询数据
        version() # 作用:查询版本号。
        database()# 作用:当前数据库库名。

查询表名:

?id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema=database() limit 0,1

查询列名:
?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 0,1

limit m,n # 从第m+1行开始查询n条数据。  limit 2,2

information_schema 库名,mysql自带的。
tables 表的名字,mysql自带的。 information_schema.tables ,库.表 (指定什么库里面的什么表)
columns 表的名字,mysql自带的。
table_schema 列的名字,存储的是网站管理员创建的库名
table_name 列的名字,存储的是网站管理员创建表的名字
column_name  列的名字 ,存储的是网站管理员创建列的名字
总结来说分为以下几步:

```
一、判断注入点
二、判断字段(列)数
三、判断回显点
四、查询数据  数据库——>表——>列——>列中的数据
```

## 四、SQL注入必备知识

在进行正式的注入前,我们需要了解的知识。

1、数据库的结构:库、表、行、列—(字段)

```
select ··· from ··· where 
        select  翻译:查询
        from  翻译:来自
        where 翻译:条件,当····条件成立的时候
```

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

## 五、SQL注入简单演示

以sqli-labs为例子,假如我是一名黑客,拿到了sqli-labs这个网站,我的老板要求我查出网站里面存储的用户到底有多少,数据库的名字是什么,版本是多少,甚至我还想改数据库的信息。那我应该怎么做呢?

对于sql注入,目前常用的手段分两种,手工注入和工具注入,这里我们选择手工注入,这样能帮助我们更快的了解。

前面说到了加单引号进行闭合后,在后面插入我们想要查询的语句,这里我们来试一试。

第一步,判断注入点

PS:--+表示注释,这里的作用是注释掉后面的语句,只保留我们插入的语句。

观察两个图的区别,当我们输入and 1=1的时候,由于前面的单引号被闭合,最终sql语句识别到的为 '1' and 1=1 恒为真,正确,输出语句,当输入and1=2时,语句变成了'1' and 1=2 为假。错误,没有返回信息。这里就可以判断这里存在注入点。

试想一下,如何将1=1 换成我们插入的语句,那么我们的注入是否就成功了。 这就sql注入的思路。

第二步,判断字段数

当我们进行到order by 4的时候,页面返回错误,得出字段数为3。

第三步、判断回显点

第四步、查询数据

得到数据库名字。然后依次:数据库——>表——>列——>列中的数据,就不依次演示了。建议感兴趣的同学都去试试。

以上就是一个通关sql注入得到数据库信息的一个过程。

## 六、sql注入防范

解决SQL注入问题的关键是对所有可能来自用户输入的数据进行严格的检查、对数据库配置使用最小权限原则。通常修复使用的方案有:

1、分级管理

对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。

2、参数传值

程序员在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量。从而抑制SQL注入。数据输入不能直接嵌入到查询语句中。同时要过滤输入的内容,过滤掉不安全的输入数据。或者采用参数传值的方式传递输入变量,这样可以最大程度防范SQL注入攻击。

3、基础过滤与二次过滤

SQL注入攻击前,入侵者通过修改参数提交and等特殊字符,判断是否存在漏洞,然后通过select、update等各种字符编写SQL注入语句。因此防范SQL注入要对用户输入进行检查,确保数据输入的安全性,在具体检查输入或提交的变量时,对于单引号、双引号、冒号等字符进行转换或者过滤,从而有效防止SQL注入。

当然危险字符有很多,在获取用户输入提交参数时,首先要进行基础过滤,然后根据程序的功能及用户输入的可能性进行二次过滤,以确保系统的安全性。

4、使用安全参数

SQL数据库为了有效抑制SQL注入攻击的影响。在进行SQLServer数据库设计时设置了专门的SQL安全参数。在程序编写时应尽量使用安全参数来杜绝注入式攻击,从而确保系统的安全性。

5、漏洞扫描

为了更有效地防范SQL注入攻击,作为系统管理除了设置有效的防范措施,更应该及时发现系统存在SQL攻击安全漏洞。系统管理员可以采购一些SQL漏洞扫描工具,通过专业的扫描工具,可以及时的扫描到系统存在的相应漏洞。

6、多层验证

现在的网站系统功能越来越庞大复杂。为确保系统的安全,访问者的数据输入必须经过严格的验证才能进入系统,验证没通过的输入直接被拒绝访问数据库,并且向上层系统发出错误提示信息。同时在客户端访问程序中验证访问者的相关输入信息,从而更有效的防止简单的SQL注入。但是如果多层验证中的下层如果验证数据通过,那么绕过客户端的攻击者就能够随意访问系统。因此在进行多层验证时,要每个层次相互配合,只有在客户端和系统端都进行有效的验证防护,才能更好地防范SQL注入攻击。

7、数据库信息加密

上层系统发出错误提示信息。同时在客户端访问程序中验证访问者的相关输入信息,从而更有效的防止简单的SQL注入。但是如果多层验证中的下层如果验证数据通过,那么绕过客户端的攻击者就能够随意访问系统。因此在进行多层验证时,要每个层次相互配合,只有在客户端和系统端都进行有效的验证防护,才能更好地防范SQL注入攻击。

7、数据库信息加密

传统的加解密方法大致分为三种:对称加密、非对称加密、不可逆加密。
 

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

sql注入详解 的相关文章

  • MySQL“LIKE”搜索不起作用

    我通过 LOAD DATA INFILE 在 MySQL 中导入了一个 txt 数据库 一切似乎都正常 唯一的问题是 如果我使用以下查询在数据库上搜索记录 SELECT FROM hobby WHERE name LIKE Beading
  • 将 .MDF SQL Server 数据库与 ASP.NET 结合使用与使用 SQL Server

    我目前正在 ASP NET MVC 中编写一个网站 我的数据库 其中还没有任何数据 只有正确的表 使用 SQL Server 2008 我已将其安装在我的开发计算机上 我使用服务器资源管理器从应用程序连接到数据库 然后使用 LINQ to
  • 有没有办法阻止 SQL Express 2008 空闲?

    我使用 SQL Express 2008 作为 Web 应用程序的后端 问题是 Web 应用程序是在工作时间使用的 因此有时在午餐或休息时间 如果 20 分钟内没有用户登录 SQL Express 将进入空闲状态模式并释放其缓存 我知道这一
  • SQL 中基于下一条记录和上一条记录的复杂排序

    这是一个后续问题根据 SQL 中的下一条记录和上一条记录进行排序 https stackoverflow com questions 30477803 sorting based on next and previous records i
  • 为 Zend 应用程序提供数据库处理程序的“正确”方法是什么

    假设您严格遵守某个组织的惯例Zend应用程序 http framework zend com manual en zend application html 您应该在哪里设置数据库处理程序以供应用程序开发人员访问 我知道如何设置ZendDb
  • Oracle:如何获取刚刚插入的行的序列号?

    如何获取刚刚插入的行的序列号 插入 返回 declare s2 number begin insert into seqtest2 x values aaa returning seq into s2 dbms output put lin
  • Sequelize.js 中的自定义或覆盖连接

    我需要使用创建自定义连接条件Sequelize js http sequelizejs com使用 MSSQL 具体来说 我需要加入TableB基于一个COALESCE中的列的值TableA and TableB并最终得到这样的连接条件 L
  • Reporting Services 在哪里存储其日志文件

    最相关的谷歌结果似乎表明 为了访问日志 我们必须将您自己的日志表部署到数据库并制作报告服务写入它 http technet microsoft com en us library ms157403 aspx 简而言之 Reporting S
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • SQLite中的ROWID是自动设置的吗?

    所以 我在 Ionic 上有这个应用程序 它使用SQLite ngCordova 插件 https github com litehelpers Cordova sqlite storage用于内部存储 在其上 我使用以下命令创建一个表 d
  • 如何识别拼写不同的相似单词

    我想从数据库中过滤掉重复的客户名称 一位客户可能有多个同名但拼写差异不大的系统条目 这是一个示例 名为 Brook 的客户可能有 3 个系统条目 有了这个变化 布鲁克 贝尔塔 布鲁克 贝尔塔 比鲁克 贝尔塔 假设我们将此名称放入一个数据库列
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 什么是时序数据库?

    What is 时间序列数据库例如InfluxDB 我应该何时 何地使用它 请给我它的业务场景示例 检查wiki https en wikipedia org wiki Time series database 时间序列数据库 TSDB 是
  • 如何使用 BigQuery 有效地选择另一个表中匹配子字符串的记录?

    我有一个包含数百万个字符串的表 我想将其与包含大约两万个字符串的表进行匹配 如下所示 standardSQL SELECT record FROM record JOIN fragment ON record name LIKE CONCA
  • 如何使用 SQL Server 2008 将行复制到同一个表中

    A 到目前为止我的方式 sqlCommand CommandText INSERT Table1 column1 column2 column3 SELECT column1 column2 column3 FROM Table1 WHER
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我

随机推荐

  • c++day3

    stack h ifndef STACK H define STACK H include
  • 详解dp - 最长回文子序列

    给定一个字符串 s 找到其中最长的回文子序列 并返回该序列的长度 可以假设 s 的最大长度为 1000 类似问题 最长回文子串 首先找出状态转移方程 table i j table i 1 j 1 2 if s i s j else tab
  • SQLAlchemy链接池的使用

    1 倒入需要的模块 from sqlalchemy import create engine from sqlalchemy orm import sessionmaker from sqlalchemy pool import Queue
  • 关于element-ui的el-dialog页面不居中问题

    el dialog 貌似不设置样式的时候默认不居中显示 如下所示 有很多地方是需要用到居中的 并且比较美观 所以我修改了以下代码 gt gt gt 是为了样式穿透 gt gt gt el dialog display flex flex d
  • canvas实现跟随鼠标和跟随手指粒子特效

    原文出处 https blog csdn net IForDreams article details 75453450 效果图 代码
  • TTL值的含义以及与域名DNS TTL值的区别

    什么是TTL TTL是IP协议包中的一个值 被称为跳数 指定数据报被路由器丢弃之前允许通过的网段数量 在很多情况下数据包在一定时间内不能被传递到目的地 解决方法就是在一段时间后丢弃这个包 然后给发送者一个报文 由发送者决定是否要重发 TTL
  • 【Python 1-8】Python手把手教程之——列表List的管理

    作者 弗拉德 来源 弗拉德 公众号 fulade me 在上一节我们学习了如何创建一个列表 在列表里面插入 删除数据等操作 本节我们学习如何管理列表 遍历列表 在日常开发中 我们经常需要遍历列表的所有元素 对每个元素执行相同的操作 例如 在
  • 什么是 Thread 的中断标志?

    分析 回答 什么是 Thread 的中断标志 中断 interrupt 标志或中断状态是线程中断时设置的内部线程标志 flag 属性 怎么设置中断标志 要设置一个线程的中断标志 只需要简单的在线程对象上调用 thread interrupt
  • radius服务器无响应,radius认证(radius认证超时)

    radius认证 RADIUS是英文 RemoteAuthenticationDialInUserService 的缩写 是网络远程接入设备的客户和包含用户认证与配置信息的服务器之间信息交换的标准客户 服务器模式 它包含有关用户的专门简档
  • Mac系统上配置Vue.js环境

    在Mac系统上配置Vue js环境非常麻烦 幸运地找到了教程http www mamicode com info detail 1786370 html 第一步 Mac OS系统安装 brew 在终端运行 usr bin ruby e cu
  • 纯CSS实现导航栏下拉动画效果

    实现思路 导航栏的下拉效果通过在ul的li里再嵌套一个ul 再通过animation属性改变第二导航栏ul的高度来实现导航栏下拉动画效果 老铁没毛病 实现效果 HTML代码 div class nav ul li a href 奥利给 a
  • PHP-代码执行函数-命令执行函数

    目录 代码执行函数 1 eval 函数 2 assert 函数 3 call user func 函数 4 create function 函数 5 array map 函数 6 call user func array 函数 7 arra
  • 哲理故事300篇(中)

    哲理故事300篇 上 http blog csdn net andylin02 archive 2006 08 23 1109314 aspx 哲理故事300篇 下 http blog csdn net andylin02 archive
  • LeetCode动态规划—跳跃游戏从跳到头到跳最少下跳到头(45、55)

    跳跃游戏 跳跃游戏 跳跃游戏 跳跃游戏 一个下标对应的值为3 那证明这个位置可以跳到前后3个位置的下标处 3均可达 如果依次遍历完这个数组 有下标在跳跃过程中最远位置仍然不可达 即证明无法到达最后一个位置 可以对每一个能作为 起跳点 的格子
  • 通讯录管理系统(C++)

    目录 1 功能分析与实现步骤 2 代码编写 2 1 联系人和通讯录结构体设计 2 2 通讯录页面 2 3 添加联系人 2 4 显示所有联系人 2 5 检测联系人 2 6 删除指定联系人 2 7 查找指定联系人 2 8 更改指定联系人 2 9
  • onu光功率多少是正常_发射光功率和接收灵敏度对光模块有什么影响

    我们在选购光模块需要留意发射光功率和接收灵敏度这两个参数 因为这两项参数是确保光模块正常通信关键因素之一 下面易天光通信 ETU LINK 就给大家介绍发射光功率和接收灵敏度分别是什么 以及如何测试光模块的光功率在正常范围呢 深圳易天光通信
  • python ssh登录偶然认证失败_paramiko.ssh_异常.AuthenticationException:身份验证失败

    import paramiko class SSHConnection object def init self host username password port 22 self sftp None self sftp open Fa
  • TypeScript--类型问题汇总

    学过js你认识的类型 boolean number string undefined null symbol object 你可能不认识的类型 void any unknown never 类型声明是TS非常重要的一个特点 通过类型声明可以
  • ORL Faces Database介绍

    ORL人脸数据集共包含40个不同人的400张图像 是在1992年4月至1994年4月期间由英国剑桥的Olivetti研究实验室创建 此数据集下包含40个目录 每个目录下有10张图像 每个目录表示一个不同的人 所有的图像是以PGM格式存储 灰
  • sql注入详解

    sql注入详解 SQLI介绍 SQLI sql injection 我们称之为sql注入 sql Structured Query Language 叫做结构化查询语句 在我们的应用系统使用 sql 语句进行管理应用数 据库时 往往采用拼接