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注入详解 的相关文章

  • postgresql:插入...(选择*...)

    我不确定它是否是标准 SQL INSERT INTO tblA SELECT id time FROM tblB WHERE time gt 1000 我正在寻找的是 如果 tblA 和 tblB 位于不同的数据库服务器中怎么办 Postg
  • Oracle SQL 函数中可以有 commit 语句吗

    在 SQL 函数中使用 COMMIT 语句是否可能 有意义 从技术上来说 答案是肯定的 你can请执行下列操作 create or replace function committest return number as begin upd
  • IIF(...) 不是公认的内置函数

    我正在尝试在 Microsoft SQL Server 2008 R2 中使用它 SET SomeVar SomeOtherVar IIF SomeBool value when true value when false 但我收到一个错误
  • dbms_xmlgen.getxml - 如何设置日期格式

    我们使用 dbms xmlgen getxml 实用程序通过 SQL 查询生成 xml 该查询从几乎 10 15 个相关表中获取数据 默认情况下 日期格式生成于dd MMM yy格式 有什么方法可以在 dbms xmlgen getxml
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • 在Oracle中使用IW和MM

    我使用 IW 表示每周结果 使用 MM 表示每月结果 但我总是收到错误 ORA 00979 not a GROUP BY expression 00979 00000 not a GROUP BY expression 我的疑问是这些 We
  • ORA-12728: 正则表达式中的范围无效

    我想检查表中是否插入了有效的电话号码 所以我的触发代码在这里 select start index into mob index from gmarg mobile operators where START INDEX substr ne
  • postgresql 不同的不工作

    我使用以下代码从数据库获取值 但是当我编写这段代码时 测试看看问题出在哪里 我注意到查询没有从数据库中获取不同的值 这是查询 select distinct ca id as id acc name as accName pIsu name
  • 插入具有只读主键列的表

    我正在使用一个使用 sql server 数据库的应用程序 我试图在表中插入一行 如下所示 该表有一个主键 prodNum 这是自动生成的密钥 当我尝试向表中插入一行时 如下所示 在行中intResult oSglProdTableAdap
  • 如果 Oracle SQL 中存在视图,则删除视图[重复]

    这个问题在这里已经有答案了 我是 Oracle 数据库系统的新手 Oracle 12c 中以下 SQL 语句的等效项是什么 DROP VIEW IF EXIST
  • ALTER TABLE 语句与 FOREIGN KEY 约束冲突

    为什么要添加外键tblDomare表导致此错误 ALTER TABLE 语句与 FOREIGN KEY 约束 FK tblDomare PersN 5F7E2DAC 冲突 冲突发生在数据库 almu0004 表 dbo tblBana 列
  • SQL Server 查询中 UNION ALL 与 OR 条件

    我必须根据表上不存在的条件选择一些行 如果我使用如下的 union all 它会在不到 1 秒的时间内执行 SELECT 1 FROM dummyTable WHERE NOT EXISTS SELECT 1 FROM TABLE t WH
  • Ruby ActiveRecord 和 sql 元组支持

    ActiveRecord 是否支持 where 子句中的元组 假设底层数据库支持 结果 where 子句看起来像这样 where name address in John 123 Main St I tried Person where n
  • 无法与重定向器建立连接。确保“sql browser”服务正在运行

    所以我尝试这个 sql server 2012 由于这个错误我无法打开任何 ssis 包 无法与重定向器建立连接 确保 sql browser 服务正在运行 我的 Sql 浏览器肯定正在运行 我尝试在本地服务 本地系统和网络下更改它 仍然没
  • 向带有检查约束 SQL 的表添加列

    我想向表中添加一列 然后添加一个检查约束以确保其大于 0 我似乎无法让它在 oracle sl Developer 中运行 Alter TABLE store101 add column Base salary Number 7 2 con
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 具有不同组合的产品和产品包的数据库模型

    您将如何设计数据库来实现此功能 考虑一个场景 我们想要创建一个产品关系 封装 假设我们创建一个产品表 prod id prod name prod fee 1 prepaid A 19 usd 2 prepaid B 29 usd 3 pr
  • 需要在 SQL Server 中透视字符串值

    我有一个包含值的表 描述为 Occupation String Name String Developer A Developer B Designer X Coder Y Coder Z 我需要数据透视格式的值 Designer Deve
  • 总和和不同不会改变结果?

    我是一个新手 试图在这里解决这个问题 到目前为止还没有运气 非常感谢任何帮助 Select Distinct AB agency no ab branch no AS AGENCY BRANCH count AB agency no ab

随机推荐

  • 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 语句进行管理应用数 据库时 往往采用拼接