首页 > 数据库 >#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)

时间:2024-12-22 19:29:12浏览次数:6  
标签:函数 时间延迟 sleep 延时 SQL 注入

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。

目录

一、基于时间延迟的SQL注入概述

(一)原理

(二)应用场景

示例

常见延时函数

二、涉及的函数

三、工具使用

时间延迟SQL注入的防御策略

1. 使用参数化查询

示例(PHP + MySQL)

2. 输入验证和清理

示例(PHP)

3. 使用ORM(对象关系映射)

4. 最小化数据库权限

示例(MySQL)

5. 实施WAF(Web应用防火墙)

6. 日志记录和监控

7. 安全培训和代码审查

8. 使用安全库和框架

结论


一、基于时间延迟的SQL注入概述

基于时间延迟的SQL注入(Time - based SQL Injection),也被称为时间盲注,是SQL注入攻击的一种类型,属于盲注入的范畴。

(一)原理

  • 正常情况下,当对数据库进行查询操作,如果查询的条件不存在,语句执行的时间非常短,基本接近0秒。但是可以利用像 sleep(N)(在MySQL里)这样的函数让查询执行时间变长。例如在 mysql 中,sleep(10) 会使数据库延时10秒返回内容。通过构造包含这种延时函数的SQL语句注入到目标系统中,根据页面响应时间来判断注入条件是否正确。如果响应时间达到或接近设置的延时时间(如注入语句中包含 sleep(10),响应时间至少10秒),则说明注入条件满足,进而判断存在SQL时间注入漏洞。
  • 常常与 if(expr1, expr2, expr3) 语句结合使用。if(expr1, expr2, expr3) 的含义是如果 expr1True,则返回 expr2,否则返回 expr3)。例如:select if(21, sleep(10), 0),这里的21这个部分就是可以构造的注入SQL语句部分。再如 select if(length(database())>1, sleep(5), 0) 这个语句就是查询当前库长度大于1就会延时5秒。

(二)应用场景

  • 当目标系统的注入点无法通过布尔型注入(即不能通过页面返回的正常或错误结果来判断注入是否成功)时,时间延迟注入就可以发挥作用。例如,页面没有回显或者没有报错信息,但是可以根据页面的响应时间来判断注入是否成功。

示例

假设有一个SQL查询如下:

SELECT * FROM users WHERE id = '1';

攻击者可以通过在id参数中插入延时函数来判断是否存在SQL注入漏洞:

如果页面响应时间增加了5秒,说明SQL注入成功。

常见延时函数

不同的数据库管理系统(DBMS)支持不同的延时函数。以下是一些常见的延时函数:

DBMS延时函数
MySQLSLEEP()
PostgreSQLpg_sleep()
Microsoft SQL ServerWAITFOR DELAY

二、涉及的函数

  • sleep()函数:在MySQL中,sleep() 函数用于实现数据库操作的延时。例如 sleep(5) 表示让数据库操作延迟5秒。通过在注入的SQL语句中巧妙使用这个函数,并结合页面响应时间的变化来判断注入是否成功以及获取相关信息。
  • if()函数:如前面所述,if() 函数可以根据条件判断来决定返回值。这在构造复杂的时间延迟注入语句时非常有用,可以根据不同的条件执行不同的操作,如执行延时操作或者不执行延时操作,从而通过页面响应时间的差异来获取数据库中的信息。
  • substring()函数(类似mid()函数):用于截取字符串。例如在查询数据库名称等操作时,可以配合 if() 函数和 sleep() 函数,通过逐位判断字符的方式来获取数据库名称等敏感信息。mid(a,b,c)(或者 substr(a,b,c),二者功能类似,第一个参数为要处理的字符串,start 为开始位置,length 为截取的长度)就是从 b 开始,截取 a 字符串的 c 位。

三、工具使用

在检测和利用基于时间延迟的SQL注入时,可以使用自动化工具,如 sqlmap。使用时通过指定相关参数来进行时间注入检测。例如:

  • -u:表示检测的 url
  • -p:指定的检测参数。
  • -v:显示调试模式。
  • --technique=T:检测方法为时间注入。 通过这样的设置,sqlmap 可以检测目标是否存在基于时间延迟的盲注入,并且在检测为时间注入之后,还可以进一步通过这个注入获取数据库的名、用户权限、表字段等敏感信息。

时间延迟SQL注入的防御策略

时间延迟SQL注入(Time-based SQL Injection)是一种盲注入技术,攻击者通过在SQL查询中插入延时函数(如SLEEP()WAITFOR DELAY),根据页面响应时间来判断注入是否成功。为了防止这种攻击,以下是一些有效的防御策略:

1. 使用参数化查询

参数化查询(Prepared Statements)是防止SQL注入的最佳实践之一。通过预编译SQL语句并使用参数传递用户输入,可以确保用户输入不会被解释为SQL代码。这在各种编程语言和数据库系统中都是通用的做法。

示例(PHP + MySQL)

$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $_GET['id']]);

2. 输入验证和清理

对用户输入进行严格的验证和清理,确保输入符合预期格式。例如,如果输入应该是数字,可以使用正则表达式或其他验证方法来确保输入确实是数字。

示例(PHP)

$id = filter_var($_GET['id'], FILTER_VALIDATE_INT);
if ($id === false) {
    die('Invalid input');
}

3. 使用ORM(对象关系映射)

ORM工具可以自动处理SQL查询的构建和执行,避免手动拼接SQL语句,从而减少SQL注入的风险。常见的ORM工具有Hibernate(Java)、Entity Framework(.NET)和Django ORM(Python)。

4. 最小化数据库权限

为应用程序使用的数据库账户分配最小必要的权限。例如,如果应用程序只需要读取数据,那么数据库账户应该只具有读取权限,而不具有写入或执行权限。

示例(MySQL)

GRANT SELECT ON database_name.table_name  TO 'user'@'host';

5. 实施WAF(Web应用防火墙)

WAF可以实时监控和过滤HTTP流量,识别并阻止潜在的SQL注入攻击。许多云服务提供商(如AWS、Google Cloud)都提供了WAF服务。

6. 日志记录和监控

定期审查应用程序日志,监控异常行为,如频繁的延时请求。这有助于及时发现并响应潜在的攻击。

7. 安全培训和代码审查

定期对开发团队进行安全培训,强调SQL注入的危害和防御措施。同时,实施代码审查制度,确保所有代码都经过安全检查。

8. 使用安全库和框架

选择具有内置安全功能的库和框架,如OWASP ESAPI(企业安全API),这些工具可以提供额外的保护层,防止SQL注入和其他安全漏洞。

结论

通过实施上述防御策略,可以显著降低时间延迟SQL注入的风险,保护应用程序和数据库的安全。定期更新和审查安全措施,确保它们能够应对不断变化的威胁环境。

标签:函数,时间延迟,sleep,延时,SQL,注入
From: https://blog.csdn.net/m0_62828084/article/details/144601157

相关文章

  • 深入解析RuoYi框架中的DataScopeAspect:不同权限类型的SQL语句生成与作用
    目录AOP简介面向切面编程(AOP)的概念AOP在RuoYi框架中的应用DataScopeAspect类的作用类的功能切点选择权限检查​编辑在前端如何给不同的用户设置不同的权限实际代码示例控制层服务层Mapper层DataScopeAspect类1.全部权限2.自定义权限3. 本部门及以下权限4.仅......
  • 渗透测试-前后端加密分析之AES加密下的SQL注入
    本文是高级前端加解密与验签实战的第9篇文章,也是最后一篇文章。本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过前后端加密进行SQL注入。登录输入账号密码,抓包查看数据包,看上去就是一个普通的aes加密:这里热加载代码不算太难,常规的加解密函数就可以了:encryp......
  • 同步mysql数据到ElasticSearch
    同步mysql数据到ElasticSearch|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|----------......
  • 同步mysql数据到ElasticSearch的最佳实践
    同步mysql数据到ElasticSearch的最佳实践|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|......
  • sql注入总结
    sql注入一.什么是注入所谓SQL注入,就是通过把SQL命令插入到WEB表单提交或输入域名或页面请求的查询字符串,最终到达欺骗服务器执行恶意的SQL命令,从而进一步得到相应的数据信息。通过构造一条精巧的语句,来查询到想要得到的信息。二.常规注入步骤1.判断注入点类型提交and1=1和a......
  • MySQL——DQL查询(最重要,最常用) 多表设计
    数据库开发-MySQL在上次学习的内容中,我们讲解了:使用DDL语句来操作数据库以及表结构(数据库设计)使用DML语句来完成数据库中数据的增、删、改操作(数据库操作)我们今天还是继续学习数据库操作方面的内容:查询(DQL语句)。查询操作我们分为两部分学习:DQL语句-单表操作DQL语句-多表......
  • MySQL 数据库优化:分区、分表与索引创建
    MySQL数据库优化:分区、分表与索引创建目录概述MySQL分区(Partitioning)2.1什么是分区?2.2使用场景2.3分区类型2.4分区维护2.5示例:创建分区表MySQL分表(Sharding)3.1什么是分表?3.2使用场景3.3分片键选择3.4示例:手动分表3.5分表的挑战MySQL索引创建4.1什么是......
  • MySQL 主备部署与主库读写分离
    MySQL主备部署与主库读写分离目录概述环境准备主备同步配置主服务器(Master)配置备服务器(Slave)配置主库读写分离常见问题与解决方法总结概述MySQL是一个广泛使用的开源关系型数据库管理系统。为了提高系统的可用性和数据的安全性,通常会采用主备(Master-Slave)架构来部......
  • 【MySQL】--- 数据类型
     Welcometo9ilk'sCodeWorld    (๑•́₃•̀๑) 个人主页:    9ilk(๑•́₃•̀๑) 文章专栏:  MySQL  ......
  • 【MySql】事务管理(下)
    ......