百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

「Burpsuite练兵场」SQL注入及相关实验(一)

mhr18 2024-10-03 22:38 20 浏览 0 评论

说到SQL注入漏洞,各位小伙伴一定是耳熟能详,作为一种常见的高危漏洞,其对于应用程序的损害是非常严重的。因此这也是一个在渗透测试的过程中具有高优先级的验证目标,所以将与之相关的实验进行优先讲述。

本文是 i 春秋论坛作家「dll_s」表哥原创的Burpsuite练兵场系列文章,公众号旨在为大家提供更多的学习方法与技能技巧,文章仅供学习参考。

SQL注入原理:SQL注入的原理其实并不难理解,Web应用程序后台获取用户输入并将其拼接到SQL查询语句中进行执行,而这里的用户输入就是我们可以构造恶意payload的地方,通过一些技巧使得查询语句按照我们所希望的方式执行即可完成一次成功的SQL注入。正如大多数的Web漏洞一样,究其漏洞本质就是未验证用户输入,没有实现输入数据与程序执行语句的分离。

但是由于存在不同的数据库(如常见的Oracle、SQL Server、Mysql等)所导致的具有微小差异性的SQL语句实现,以及我们无法直接观察到后台的查询逻辑,导致我们在实际的SQL注入漏洞搜寻过程当中往往也要花费不小的精力,同时也非常考察我们对于SQL语句的掌握程度。

话不多说,下面直接进入相关实验及原理的介绍:

实验内容

注意事项:

1、实验仅对SQL注入原理进行简单阐述,读者需要有一定的SQL语言基础;

2、针对SQL注入的专项训练推荐使用sqli-labs开源靶场,阅读源码了解后台逻辑有助于进一步理解SQL注入原理;

3、SQL注入可分为数字型和字符型,不同语句注入的payload不同。

数字型查询语句为:

SELECT * FROM products WHERE category = 1 -- 注入语句为 or 1=1 --

字符型查询语句为:

SELECT * FROM products WHERE category = 'value' -- 注入语句为 'or 1=1 --

本节实验均基于字符型注入。

实验一:检索隐藏数据

首先来看这样一个URL:

https://insecure-website.com/products?category=Gifts

是不是非常熟悉,category为查询参数,后台执行的SQL语句为:

SELECT * FROM products WHERE category = 'Gifts' AND released = 1

当我们把查询参数变更为Gifts'这样,则查询语句变为了:

SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1

原先查询的另一条件released=1就被注释掉了,因此查询会返回所有category = 'Gifts'的数据。

我们进一步将查询参数变更为category=Gifts'+OR+1=1,查询语句变为了:

SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1

结果将会返回products数据表中的所有数据,以此就可进行一次成功的SQL注入。

在这里再介绍一下不同数据库注释语句的差异(可以发现比较好的通用注释方式即为-- )

  • Oracle:REM 单行注释 -- 单行注释 /*多行注释*/
  • MS SQL Server: -- 单行注释 /*多行注释*/
  • MySQL:# 单行注释 -- 单行注释(特别注意,-- 后需跟空格或控制字符) /*多行注释*/
  • PostgreSQL: -- 单行注释 /*多行注释*/

这就是这个实验的SQL注入漏洞原理,下面我们进入到实验环境当中:

通过实验介绍,我们知道完成该实验需要执行一次SQL注入以显示所有产品细节,无论是否满足release=1参数。

为了方便这一系列注入实验的进行,推荐可以安装一个chrome插件Harkbar,注意使用插件后虽然方便直接操作请求,但是需要注意url编码问题,比如 -- 这一注释后的空格是否成功附着到url中,可通过观察地址栏是否为 -- %27进行探查,由于插件本身问题可能存在错误,这时还是推荐使用burpsuite来对请求进行修改。

这一插件具有许多有用的功能,在chrome环境下安装好后按f12后点击Harkbar切换到相应选项卡,点击LOAD加载当前页面url,点击EXECUTE发送请求。

构造如图所示url参数(注意 -- 后的空格),发送请求即可完成sql注入攻击。



成功返回结果,实验结束


实验二:颠覆应用程序逻辑(任意用户登录)


我们在一些SQL注入教程中经常能看到类似'or 1=1这样的注入语句用于绕过用户登录验证,在这个实验中学习的正是这样的背后逻辑。

SELECT * FROM users WHERE username = ''or 1 -- ' AND password = '123'

这一条非常经典的在登录过程中,应用后台的数据库查询语句,通过语句执行后的返回值是否为真判断数据库中是否有匹配的账户存在。


因此,我们只需要构造paylaod使该语句执行结果总为真即可实现任意用户登录,常见的payload如' or 1=1 --

SELECT * FROM users WHERE username = ''or 1 -- ' AND password = '123'

进入实验,实验完成要求:以administrator账号身份登录。


进入account login页面,账号值构造如图所示,密码输入任意值。


成功登录即可完成实验


实验三:从其他数据表中检索数据(联合查询UNION注入)


在进行sql注入攻击时,我们可以通过union语句进行联合查询,获取其他数据表中的数据,这里以Mysql为例,简要介绍下UNION操作符:

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
  • expression1, expression2, ... expression_n:要检索的列;
  • tables:要检索的数据表;
  • WHERE conditions:可选, 检索条件;
  • DISTINCT:可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响;
  • ALL:可选,返回所有结果集,包含重复数据。
SELECT a, b FROM table1 UNION SELECT c, d FROM table2;          -- 从table1中检索a,b并从table2中检索c,d

注意执行union查询需要满足两个条件:

  • 各个查询必须返回相同数量的列;
  • 每个列中的数据类型必须在各个查询之间兼容。

所以我们在进行union注入时需要先确定查询语句中的列数,在这个实验教程中介绍了两种方法。

使用Order By子句

order by子句可以用于对查询结果进行排序,通过接收一个列名为参数或一个简单的能识别特定列的数字。

' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--

通过不断递增指向列的数字,直到返回错误以推断出最大列数。

' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--

使用Union子句

如前所述,联合查询需要每个返回的列数相同,因此若列数不同便会返回错误,通过不断递增列直到返回正确信息。

' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--

接下来进入实验


实验需要我们探测出查询语句中列的正确的数量,并执行SQL注入返回包含null数据的附加列。

使用order by子句进行猜测,使用'order by 3时成功返回结果。

使用'order by 4时返回结果错误,可以推断出查询语句中的列数量为3。

使用union查询进行注入攻击,完成实验。

实验四:通过SQL UNION注入查找有用的数据类型列

比如我们希望寻找一字符串类型的数据列,我们可以先查明正确的列数量,然后通过不断更换union查询子句中字符列的位置来进行确定。

' UNION SELECT 'a',NULL,NULL,NULL--
' UNION SELECT NULL,'a',NULL,NULL--
' UNION SELECT NULL,NULL,'a',NULL--
' UNION SELECT NULL,NULL,NULL,'a'--

实验完成条件:实验提供了一个随机的字符串,在查询结果中显示该字符串以完成实验。

实验生成的随机字符串

首先通过order by子句确定列数为3,执行union查询,不断替换字符串位置直到返回正确结果。

返回了有效结果

使用实验给出的字符串进行替换,发送请求完成实验。

实验五:通过SQL UNION注入检索感兴趣的数据

这一实验需要我们通过SQL注入获取到users表中所有的username和password数据,由于实验已经告诉我们所需的数据位于该web应用后台数据库中的莫具体表及字段当中,所以可以直接使用语句进行查询。但在我们实际的渗透测试过程中,存在哪些让人感兴趣的数据是需要通过多次SQL注入进行推断的,其具体细节留在后面章节再具体介绍。

实验完成条件:通过SQL注入获取账号和密码,并以administrator身份登录。

首先使用order by子句判断查询列数,数量为2。

使用union查询,获取账号信息。

使用administrator账号登录,完成实验。

实验六:通过字符串连接将多个值返回在一个列中

在上一个实验中,我们使用了'union select username,password -- 这一payload,其成功执行的条件为原先的查询列数也为两列,且数据类型均为字符串类型。但在这一次的实验中,通过‘union select 'a',NULL -- 测试可以发现仅第二列为字符串类型,因此我们需要将两个查询参数合并到一列中。

使用连接字符串将两个查询参数合并在一起,其返回结果构造类似administrator~s3cure。

' UNION SELECT username || '~' || password FROM users--

当然不同数据库的字符串连接方式也不同。

  • Oracle: 'foo'||'bar'
  • SQL Server: 'foo'+'bar'
  • Mysql: 'foo' 'bar'(空格) CONCAT('foo','bar')
  • PostgreSQL: 'foo'||'bar'

实验要求:通过SQL注入获取账号和密码,并以administrator身份登录。

判断字符串位置

构造payload获取账号密码

使用administrator成功登录,完成实验。

总结

本节实验介绍了基础的手动SQL注入实验,汇总一下使用到的注入语句与技巧。

'or 1=1   -- 注入点判断(语句永真)
'or order by 3 -- 判断查询语句列的数量
'union select NULL,'a' -- 判断特定数据类型列的位置
'union select NULL,username||'~'||password  -- 连接字符串以返回单一行

想要掌握SQL注入光理解原理是不行的,在学习中还是应该多进行实际的动手操作。

以上是今天要分享的内容,大家看懂了吗?

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: