「Burpsuite练兵场」SQL注入及相关实验(一)
sinye56 2024-09-22 08:31 2 浏览 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注入光理解原理是不行的,在学习中还是应该多进行实际的动手操作。
以上是今天要分享的内容,大家看懂了吗?
相关推荐
- RHEL8和CentOS8怎么重启网络
-
本文主要讲解如何重启RHEL8或者CentOS8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错,当我们安装好RHEL8或者CentOS8,重启启动网络时,会出现以下报错:...
- Linux 内、外网双网卡路由配置
-
1.路由信息的影响Linux系统中如果有多张网卡的情况下,如果路由信息配置不正确,...
- Linux——centos7修改网卡名
-
修改网卡名这个操作可能平时用不太上,可作为了解。修改网卡默认名从ens33改成eth01.首先修改网卡配置文件名(建议将原配置文件进行备份)...
- CentOS7下修改网卡名称为ethX的操作方法
-
?Linux操作系统的网卡设备的传统命名方式是eth0、eth1、eth2等,而CentOS7提供了不同的命名规则,默认是基于固件、拓扑、位置信息来分配。这样做的优点是命名全自动的、可预知的...
- Linux 网卡名称enss33修改为eth0
-
一、CentOS修改/etc/sysconfig/grub文件(修改前先备份)为GRUB_CMDLINE_LINUX变量增加2个参数(net.ifnames=0biosdevname=0),修改完成...
- CentOS下双网卡绑定,实现带宽飞速
-
方式一1.新建/etc/sysconfig/network-scripts/ifcfg-bond0文件DEVICE=bond0IPADDR=191.3.60.1NETMASK=255.255.2...
- linux 双网卡双网段设置路由转发
-
背景网络情况linux双网卡:网卡A(ens3)和网卡B(...
- Linux-VMware设置网卡保持激活
-
Linux系统只有在激活网卡的状态下才能去连接网络,进行网络通讯。修改配置文件(永久激活网卡)...
- VMware虚拟机三种网络模式
-
01.VMware虚拟机三种网络模式由于linux目前很热门,越来越多的人在学习linux,但是买一台服务放家里来学习,实在是很浪费。那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有v...
- 2023年最新版 linux克隆虚拟机 解决网卡uuid重复问题
-
问题描述1、克隆了虚拟机,两台虚拟机里面的ip以及网卡的uuid都是一样的2、ip好改,但是uuid如何改呢?解决问题1、每台主机应该保证网卡的UUID是唯一的,避免后面网络通信有问题...
- Linux网卡的Vlan配置,你可能不了解的玩法
-
如果服务器上连的交换机端口已经预先设置了TRUNK,并允许特定的VLAN可以通过,那么服务器的网卡在配置时就必须指定所属的VLAN,否则就不通了,这种情形在虚拟化部署时较常见。例如在一个办公环境中,办...
- Centos7 网卡绑定
-
1、切换到指定目录#备份网卡数据cd/etc/sysconfig/network-scriptscpifcfg-enp5s0f0ifcfg-enp5s0f0.bak...
- Linux搭建nginx+keepalived 高可用(主备+双主模式)
-
一:keepalived简介反向代理及负载均衡参考:...
- Linux下Route 路由指令使用详解
-
linuxroute命令用于显示和操作IP路由表。要实现两个不同子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)