Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

xia SQL(瞎注)二开版

本项目仅用于已获得明确授权的安全测试与学习场景,严禁用于违法操作负责后果自己承担。插件的检测结果是辅助信号,不能代替人工复现和漏洞确认。

原版项目

本项目基于 xia SQL 3.3 二次开发。

感谢原作者及原项目贡献者。

二开改进:四引号奇偶性判断

原版主要通过在参数末尾追加一个单引号与两个单引号,并比较响应长度差异来标记疑似 SQL 注入:

id=1'
id=1''

本版本将内置引号测试扩展为四组连续对照:

id=1'
id=1''
id=1'''
id=1''''

只有满足以下严格规则时,主表才显示:

end! 强疑似 SQLi:引号奇偶性
  1. 一个与三个单引号(奇数引号)均表现异常;
  2. 两个与四个单引号(偶数引号)均恢复为与原始响应兼容的状态;
  3. 两个奇数引号的异常表现一致;
  4. 两个偶数引号的表现一致;
  5. 四次请求都成功获得响应。

其中“异常”和“兼容”综合以下证据判断:

  • HTTP 响应状态码;
  • 响应正文长度(不再将 HTTP Header 的波动纳入长度判断);
  • 注入响应中新出现的明确数据库报错特征。

同一个数据库关键词的宽松规则:当 '''' 同时命中同一个数据库报错关键词(如 SQL syntax error)时,即使两条错误页面正文长度不同(例如因回显 payload 长度不同),仍视为同类异常,不会因此否决结论。无数据库关键词的普通长度/状态差异仍要求长度一致。

若两个偶数引号的 HTTP 状态、正文长度和正文内容都与原始响应一致,会显示更强的结论:

高度可信:出现关键词[SQL syntax error]→大概率是SQL注入,偶数引号匹配原始响应

二开改进:ORDER BY / sort 排序参数判断

对于参数名明确表示排序语义的参数(如 orderorderbyorder_bysortsort_bysort_field),插件会额外执行专用的 ORDER BY 探测。此规则使用完整替换参数值,不是在原始值后追加后缀:

sort=1,1
sort=1,0
sort=1,2
sort=1,999

仅当四次响应表现为以下严格、可重复的规律时,主表才显示:

end! 强疑似 SQLi:ORDER BY 排序序列
替换值 预期表现
1,1 与原始响应兼容(正常)
1,0 相对原始响应异常 / 出现数据库错误
1,2 与原始响应兼容(正常)
1,999 相对原始响应异常 / 出现数据库错误

除了“正常、异常、正常、异常”的顺序外,两个正常探针必须彼此表现一致,两个异常探针也必须彼此表现一致;任一请求无响应、异常不一致或基线本身已有数据库错误时,均不会给出该结论。

该逻辑利用 MySQL ORDER BY 可按多个字段位置排序的行为:字段位置从 1 开始,0 以及超出查询字段数的位置可能导致数据库错误。因此它只能用于疑似排序表达式入口,绝不能用于 limitoffsetpagepage_sizeper_pagecursor 等分页或结果窗口参数。插件会对这些名称强制跳过此规则。

为避免错改复杂请求,目前 ORDER BY 专用探针不参与 JSON(尤其是嵌套/数组 JSON)参数测试。

当前状态:为控制请求量(每个候选参数额外发送 4 个请求,容易造成卡顿),ORDER BY 专用探针在代码中默认禁用BurpExtender.javarunOrderByProbes 调用处已注释)。如需启用,取消该处注释并重新编译即可。以下 ORDER BY 相关描述仅在启用后生效。

二开改进:Referer 头测试

修复了原版"测试Referer"复选框只有 UI、没有任何实际检测逻辑的问题。勾选后,插件会对请求头中的 Referer 字段进行注入测试:

  • Burp 的参数 API 不会将 Referer 头解析为参数,因此本功能直接在请求字节流的头部区域完成替换(在 \r\n\r\n 之前的头部内匹配 Referer:,正文原样保留,避免误改 body);
  • 注入的 payload 与参数测试保持一致:四次引号奇偶性对照('''''''''')、''' 的响应长度对照、自定义 payload 的 time > 3 延时检测;结果写入详情表(参数名列显示 Referer),严格命中时主表状态标记与参数测试一致;
  • 请求头中不存在 Referer 时自动跳过;Referer 值为乱码/超长(复用乱码参数过滤规则)时跳过;
  • 自定义 payload 中含换行符(\r / \n)的行不参与 Referer 注入,防止构造出畸形请求;
  • 开启该功能时,去重指纹为 MD5(URL + 参数名 + HTTP 方法 + referer),即开关状态不同的组合各自扫描一次,同一组合不会重复扫描;
  • 默认不勾选,不开启时零额外请求,不影响扫描性能。

改进优势

更低的误报率

普通的单、双引号响应长度差异,可能来自参数校验、业务分支、WAF 拦截、动态内容或服务端波动。四引号方案要求“奇数异常、偶数恢复”的重复模式,减少仅因一次响应变化就误报的情况。

更符合引号未闭合的 SQL 语法特征

当输入被直接拼接到 SQL 字符串中时,奇数个单引号更可能造成字符串未闭合或语法错误;偶数个单引号则可能重新形成可解析的字符串。通过 1/3 与 2/4 两组重复对照,结果比仅比较 1 与 2 个单引号更可靠。

ORDER BY 场景的专用覆盖

通用数字 -1 / -0 后缀容易把业务数据差异误判为注入。新的排序规则只对语义明确的 order/sort 参数做完整值替换,并要求两次正常、两次异常的交替模式,能够避免把 limit 或分页参数误按排序表达式解释。

数据库报错识别与可信度分级

插件会扫描每个注入响应的 HTTP 正文,区分真正的数据库报错和 Java 应用层类型转换错误,进行可信度分级。

高度可信 — 数据库报错关键词:响应中出现以下明确数据库报错特征时,详情表标记为高度可信,主表显示 高度可信:出现关键词[xxx]→大概率是SQL注入

识别关键词列表:

关键词 匹配内容
SQLSTATE 标准 SQL 状态码
SQLException Java SQL 异常
PDOException PHP PDO 异常
SQL syntax error MySQL you have an error in your sql syntax
MariaDB server version MariaDB 报错信息
PostgreSQL PostgreSQL 异常
PG::SyntaxError PostgreSQL Ruby 驱动报错
ORA- Oracle 报错码
SQLite error SQLite 异常
unclosed quotation mark SQL Server 引号未闭合
SQL Server SQL Server OLE DB 异常

大概率误报 — 类型转换错误:响应中只出现以下 Java/Spring 框架级异常,没有任何数据库报错关键词时,详情表标记 大概率误报:类型转换错误[xxx]主表不会显示 SQL 注入判定。因为这些异常发生在参数绑定和数据转换阶段,尚未到达数据库。

识别类型列表:

类别 匹配特征
数字类型转换 NumberFormatExceptionjava.lang.IntegerLongDoubleFloatShortByteBooleanNumberBigDecimalBigIntegerFor input string:
日期/解析 DateTimeParseExceptionParseExceptionTextParseExceptionjava.util.Date
Spring 参数绑定 MethodArgumentTypeMismatchExceptionBindException
校验 ConstraintViolationExceptionIllegalArgumentException
JSON 反序列化 JsonMappingExceptionJsonParseException
类型转换 ClassCastExceptioncannot be cast to

这些异常(例如 Spring MVC 收到 id=1' 后尝试转为 Integer 失败)是应用层行为,不表示 SQL 注入。插件在判定时会优先检查数据库报错关键词;只有在完全没有数据库报错的情况下,才会因命中上述类型转换特征而跳过判定。

使用正文而非完整 HTTP 包判断长度

响应长度判断只统计 HTTP 正文,降低 Date、Cookie、缓存头、服务端追踪头等响应 Header 变化造成的干扰。

结果仅在严格命中后展示

详情表的“变化”列在未确认时保持空白:仅四次引号规则、ORDER BY 规则或数字型规则严格命中后,才会回填对应探测行的可读结论。单次长度/状态差异、单次数据库关键词或类型转换提示都不会显示在“变化”列中,避免干扰。

数字型 -1 / -0 仅当 -0 响应中出现原始基线中不存在的真实数据库报错关键词(例如 SQL syntax error)时,才将数字型异常写入主表状态和详情变化列。

严格命中结果标红与文本换行

主表“状态”列和详情表“变化”列中,包含 高度可信强疑似 SQLi→大概率是SQL注入 的行在未选中时显示为红色文字 + 浅红背景,方便快速定位。被选中行保留 Burp 默认选中配色。两个表格的结论列均使用多行换行渲染,确保长消息完整可读。

修复影响结果稳定性的实现问题

本次二开还修正了扫描路径中的部分问题:

  • 引号与 payload 比较使用内容/位置判断,不再依赖 Java 字符串引用比较;
  • 每轮 payload 从原始参数值单独构造,避免“参数值置空”选项影响后续 payload;
  • 请求耗时使用 long 保存,避免整数时间戳溢出;
  • 详情表按扫描标识的字符串内容关联,提高结果展示稳定性;
  • 响应基线在单次扫描内保存,避免并发扫描时共用响应长度造成交叉影响。

结果说明

详情表中的“变化”列可能出现:

显示内容 含义
奇数引号出现关键词[SQL syntax error]→大概率是SQL注入 奇数引号响应命中数据库报错关键词,高度可信。
奇数引号大概率误报:类型转换错误[NumberFormatException] 响应中只有 Java 类型转换异常,非数据库报错。
奇数引号异常:状态码 500 奇数引号导致 HTTP 状态码发生变化。
奇数引号异常:正文长度变化 N 奇数引号导致正文长度变化。
偶数引号与原始响应一致 偶数引号的状态、正文长度与正文内容均与原始响应一致。
偶数引号正常(状态/正文长度一致) 偶数引号与原始响应兼容,但正文可能含动态内容。
高度可信:出现关键词[SQL syntax error]→大概率是SQL注入 命中严格四引号规则且奇数引号触发真实数据库报错。
强疑似 SQLi:奇数引号异常,偶数引号匹配原始响应 命中严格四引号规则但未触发数据库报错关键词。
ORDER BY 正常探针:与原始响应兼容 1,11,2 替换值的状态码和正文长度与原始响应兼容。
ORDER BY 异常探针出现关键词[ORA-]→大概率是SQL注入 ORDER BY 异常探针命中数据库报错关键词,高度可信。
ORDER BY 异常探针大概率误报:类型转换错误[java.lang.Integer] ORDER BY 异常探针只出现类型转换异常,主表不判定。
高度可信:出现关键词[ORA-]→大概率是SQL注入 命中 ORDER BY 严格规则且异常探针触发真实数据库报错。
强疑似 SQLi:ORDER BY 排序序列 命中 ORDER BY 严格规则但未触发数据库报错关键词。
数字型异常:出现关键词[SQL syntax error]→大概率是SQL注入 数字 -0 响应命中数据库报错关键词。
diy payload 已发送自定义 payload。
time > 3 自定义 payload 请求耗时至少 3 秒。

安装使用

安装插件

  1. 下载本仓库中的 xia_sql-3.3.jar
  2. 打开 Burp Suite,点击顶部 ExtenderExtensionsAdd
  3. 类型选择 Java,文件选择下载的 xia_sql-3.3.jar,点击 Next
  4. 加载成功后,Burp 顶部会出现 xia SQL 标签页。
91bb05eb1949ac9e47350937f01fa8b8 8e2ed4fe3240ed4e7e3cc2b2a0f47f6b

基本使用

  1. xia SQL 标签页中按需勾选开关:
    • 启动插件:总开关,默认开启;
    • 监控Repeater / 监控Proxy:勾选后自动捕获对应工具的流量并扫描;
    • 值是数字则进行-1、-0:对纯数字参数额外做数字型注入对照(默认开启);
    • 测试Cookie:勾选后对 Cookie 参数注入测试;
    • 测试Referer:勾选后对请求头中的 Referer 字段注入测试(默认关闭);
  2. 也可以不走监听,直接在 Repeater / Proxy 中右键 → Send to xia SQL 手动发起扫描;
  3. 白名单:填入域名(多个用英文逗号隔开)并点击"启动白名单",插件只扫描白名单内的 URL;
  4. 自定义 payload:勾选"自定义payload"后文本域变为可编辑,修改后点击"加载/重新加载payload"生效(会同时保存到插件目录下的 xia_SQL_diy_payload.ini);
  5. 查看结果:
    • 左侧主表:每次扫描的 URL、返回包长度和状态,状态列出现 ✔⚠(高度可信)、(疑似)即有发现;
    • 右侧详情表:点击主表某一行,展示该次扫描每个参数 × 每个 payload 的请求,"变化"列为检测结论(悬停可看完整内容);
    • 下方 Request/Response 选项卡查看选中请求的原始报文。
311b44c38f856c4131a708fa11661bee

编译方法

如需修改源码自行编译:

  1. 获取 Burp Extender API 包 burp-extender-api.jar

    • 方式一:从 Burp Suite 安装目录复制(burpsuite_pro.jar 同级或 extender 相关目录下);
    • 方式二:从 PortSwigger 官网 Extender API 页面 下载(需与你的 Burp 版本匹配);
  2. 将其放入项目根目录的 lib/ 文件夹(目录不存在则手动创建);

  3. 在项目根目录执行编译:

    javac -encoding UTF-8 -cp lib/burp-extender-api.jar -d build BurpExtender.java
  4. 将编译产物更新进 jar(或重新打包):

    cd build && jar uf ../xia_sql-3.3.jar burp/
  5. 在 Burp 中移除旧扩展后重新加载 xia_sql-3.3.jar 即可生效。

注:若你的 Burp 使用 Java 16+,建议使用对应版本的 JDK 编译,避免兼容性问题。

原有功能

  • 支持 GET、POST Body、JSON 参数测试;
  • 支持 Cookie 参数测试;
  • 支持 Referer 头测试(默认关闭,勾选"测试Referer"开启);
  • 支持纯数字参数额外测试 -1-0(仅命中数据库报错关键词时输出);
  • 支持对明确 order / sort 参数进行 ORDER BY 专用完整替换探测;
  • 支持自定义 payload;
  • 支持自定义 payload 参数值置空;
  • 支持 Proxy 与 Repeater 流量监听;
  • 支持右键菜单发送至插件扫描;
  • 支持 URL 白名单;
  • 使用 MD5(不带参数的 URL + 参数名 + HTTP 方法 [+referer]) 降低重复扫描(开启 Referer 测试时计入 referer 标记)。

注意事项

  • 强疑似 SQLi 不代表漏洞已确认。请在授权范围内,使用重复请求、布尔条件、错误特征和时间对照等方式人工验证。
  • 动态页面、WAF、输入校验、认证状态变化、限流和网络波动仍可能导致误报或漏报。
  • 嵌套 JSON 采用原有请求构造方式;当插件无法确定只修改了一个嵌套字段时,不会将该请求用于四引号奇偶性或 ORDER BY 严格结论。
  • ORDER BY 探测仅面向名称明确的排序参数,且强制排除 limit、分页、偏移量与游标参数;它只能提示排序表达式入口可疑,不能确认漏洞。

About

Burp SQLi plugin | Secondary development of xia‑sql3.3, four‑quote parity rule, order‑by probe, referer header injection test, distinguish database error & application type‑convert exception.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages