4、SQLMap检测与识别:检测注入点、识别数据库类型、识别用户与权限、识别当前数据库
好,咱们进入正题。这一章讲的是SQLMap最核心的活儿——检测与识别。说白了,就是让工具帮我们搞清楚三件事:目标到底有没有洞?是什么数据库?我们能拿到什么权限?
我刚开始用SQLMap的时候,上来就一把梭,结果跑了一下午啥也没出来。后来才明白,检测阶段才是整个渗透测试的基石。你想想看,连注入点都没找准,后面再花哨的操作都是白搭。
4.1 检测注入点——找到那个突破口
SQLMap检测注入点,核心就一条命令:
sqlmap -u "http://example.com/page?id=1"
这条命令会做三件事:
- 发送测试请求:给目标URL加各种特殊字符,比如单引号、双引号、括号
- 分析响应差异:看页面返回的内容、状态码、响应时间有没有变化
- 判断注入类型:是布尔盲注、时间盲注,还是报错注入
关键点:SQLMap默认只检测GET参数。如果是POST请求,得加 --data 参数。
举个例子,一个登录表单:
sqlmap -u "http://example.com/login" --data="username=admin&password=123"
我个人习惯,第一次跑的时候加个 --batch 参数,让工具自动选择默认选项。这样能快速知道有没有戏。
小技巧:如果目标有WAF(Web应用防火墙),可以加 --random-agent 和 --delay=2,降低被拦截的概率。
4.2 识别数据库类型——知己知彼
找到注入点之后,下一步就是搞清楚对面是什么数据库。这很重要,因为不同数据库的语法和特性差别很大。
SQLMap会自动识别,但如果你想手动确认,可以用这个参数:
sqlmap -u "http://example.com/page?id=1" --banner
--banner 会返回数据库的版本信息,比如:
MySQL 5.7.34
Microsoft SQL Server 2019
PostgreSQL 13.2
我记得有一次项目,目标返回的banner是 MariaDB 10.3,但实际底层是MySQL。这种情况虽然少见,但遇到了别慌,SQLMap会自动适配。
常见的数据库指纹特征:
| 数据库类型 | 典型banner | 默认端口 |
|---|---|---|
| MySQL | 5.x, 8.x | 3306 |
| Oracle | Oracle Database 19c | 1521 |
| SQL Server | Microsoft SQL Server 2019 | 1433 |
| PostgreSQL | PostgreSQL 13.2 | 5432 |
注意:有些数据库管理员会修改banner信息来迷惑攻击者。别完全依赖banner,结合后续的注入行为综合判断。
4.3 识别用户与权限——搞清楚你是谁
知道数据库类型后,下一步就是搞清楚当前连接的用户是谁,有什么权限。这决定了你能干什么。
查看当前用户:
sqlmap -u "http://example.com/page?id=1" --current-user
查看用户权限:
sqlmap -u "http://example.com/page?id=1" --privileges
输出结果大概长这样:
current user: 'root@localhost'
privileges: FILE, SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE
嗯,这里要注意。如果看到 FILE 权限,意味着你可以读写文件。如果看到 SUPER 权限,那基本上可以为所欲为了。
我曾经遇到一个目标,当前用户是 app_user@%,权限只有 SELECT, INSERT, UPDATE。这种情况下,想拿shell基本没戏,但数据还是能拖出来的。
4.4 识别当前数据库——锁定目标
最后一步,搞清楚当前连接的是哪个数据库。这就像你进了大楼,得先知道自己在哪一层。
sqlmap -u "http://example.com/page?id=1" --current-db
返回结果:
current database: 'wordpress'
拿到数据库名之后,就可以用 --tables 和 --columns 进一步探索了。但那是下一章的内容,咱们先不展开。
实战建议:我一般会先跑 --current-db,确认目标数据库后,再用 --dbs 列出所有数据库。这样效率更高,因为有些目标数据库很多,全列出来要花不少时间。
知识体系总览
下面这张图,把本章的核心逻辑串起来了。你照着这个流程走,基本不会漏东西。
这张图把整个检测流程串起来了。你照着这个顺序走,基本不会漏掉关键信息。我个人的经验是,别急着跳步,每一步都确认清楚了再往下走。否则后面发现问题再回头,反而更浪费时间。
核心总结:检测与识别阶段,说白了就是回答四个问题——有没有洞?什么库?谁在连?能干嘛? 这四个问题搞清楚了,后面的渗透测试才有方向。