适用情况

如果一个网站存在基于时间的盲注,而恰好sleep这类核心函数被过滤的话,我们便可以使用。

笛卡尔积

数学表示:

  • A = {a1, a2, …, am}
  • B = {b1, b2, …, bn}

那么笛卡尔积为

  • A×B = {(a1, b1), (a1, b2), …, (a1, bn), (a2, b1), …, (am, bn)}

数据库中:

若执行:

SELECT * FROM TableA, TableB;

TableA:

1
2
3
4
| id | name |
|----|------|
| 1 | Alice|
| 2 | Bob |

TableB:

1
2
3
4
| id | age |
|----|-----|
| 1 | 25 |
| 2 | 30 |

执行 SELECT * FROM TableA, TableB; 后的结果将是:

1
2
3
4
5
6
| TableA.id | TableA.name | TableB.id | TableB.age |
|-----------|-------------|-----------|------------|
| 1 | Alice | 1 | 25 |
| 1 | Alice | 2 | 30 |
| 2 | Bob | 1 | 25 |
| 2 | Bob | 2 | 30 |

可以看到查询结果是两个表的笛卡尔积。

利用笛卡尔积进行延时注入

原理

如果查询的表中含有大量数据,数据库进行计算时需要一段时间,进而产生延时的效果。我们便可以通过是否有延时来判断某个条件是否正确。

示例

select * from admin where id = 1 and (条件语句) and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C);
通过是否有延时效果产生来判断条件语句是否正确。

自动化脚本编写

原理

根据是否产生延时(可通过不同个查询结果的笛卡尔积来控制)来判断条件语句是否正确

基本函数

**time.time():**它返回自1970年1月1日00:00:00 (UTC) 至当前时间的秒数,这是一个浮点数。这个值通常被称为“Unix时间戳”。可用于计算延时时间。

**requests.get(url):**requests.get 是 requests库中的一个函数,用于执行HTTP GET请求

示例

这里以sql-lib less5(虽然这题布尔盲注也能做:) )为例

爆库名长度

1737534128492

为8

爆库名

1737534277746

爆表名

1737534388694

以此类推,只要改变条件语句便能得到想要的信息。