本项目仅用于已获得明确授权的安全测试与学习场景,严禁用于违法操作负责后果自己承担。插件的检测结果是辅助信号,不能代替人工复现和漏洞确认。
本项目基于 xia SQL 3.3 二次开发。
- 原版发布地址:xia SQL 3.3
- 原版仓库:smxiazi/xia_sql
感谢原作者及原项目贡献者。
原版主要通过在参数末尾追加一个单引号与两个单引号,并比较响应长度差异来标记疑似 SQL 注入:
id=1'
id=1''
本版本将内置引号测试扩展为四组连续对照:
id=1'
id=1''
id=1'''
id=1''''
只有满足以下严格规则时,主表才显示:
end! 强疑似 SQLi:引号奇偶性
- 一个与三个单引号(奇数引号)均表现异常;
- 两个与四个单引号(偶数引号)均恢复为与原始响应兼容的状态;
- 两个奇数引号的异常表现一致;
- 两个偶数引号的表现一致;
- 四次请求都成功获得响应。
其中“异常”和“兼容”综合以下证据判断:
- HTTP 响应状态码;
- 响应正文长度(不再将 HTTP Header 的波动纳入长度判断);
- 注入响应中新出现的明确数据库报错特征。
同一个数据库关键词的宽松规则:当 ' 与 ''' 同时命中同一个数据库报错关键词(如 SQL syntax error)时,即使两条错误页面正文长度不同(例如因回显 payload 长度不同),仍视为同类异常,不会因此否决结论。无数据库关键词的普通长度/状态差异仍要求长度一致。
若两个偶数引号的 HTTP 状态、正文长度和正文内容都与原始响应一致,会显示更强的结论:
高度可信:出现关键词[SQL syntax error]→大概率是SQL注入,偶数引号匹配原始响应
对于参数名明确表示排序语义的参数(如 order、orderby、order_by、sort、sort_by、sort_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 以及超出查询字段数的位置可能导致数据库错误。因此它只能用于疑似排序表达式入口,绝不能用于 limit、offset、page、page_size、per_page、cursor 等分页或结果窗口参数。插件会对这些名称强制跳过此规则。
为避免错改复杂请求,目前 ORDER BY 专用探针不参与 JSON(尤其是嵌套/数组 JSON)参数测试。
当前状态:为控制请求量(每个候选参数额外发送 4 个请求,容易造成卡顿),ORDER BY 专用探针在代码中默认禁用(
BurpExtender.java中runOrderByProbes调用处已注释)。如需启用,取消该处注释并重新编译即可。以下 ORDER BY 相关描述仅在启用后生效。
修复了原版"测试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 字符串中时,奇数个单引号更可能造成字符串未闭合或语法错误;偶数个单引号则可能重新形成可解析的字符串。通过 1/3 与 2/4 两组重复对照,结果比仅比较 1 与 2 个单引号更可靠。
通用数字 -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 注入判定。因为这些异常发生在参数绑定和数据转换阶段,尚未到达数据库。
识别类型列表:
| 类别 | 匹配特征 |
|---|---|
| 数字类型转换 | NumberFormatException、java.lang.Integer、Long、Double、Float、Short、Byte、Boolean、Number、BigDecimal、BigInteger、For input string: |
| 日期/解析 | DateTimeParseException、ParseException、TextParseException、java.util.Date |
| Spring 参数绑定 | MethodArgumentTypeMismatchException、BindException |
| 校验 | ConstraintViolationException、IllegalArgumentException |
| JSON 反序列化 | JsonMappingException、JsonParseException |
| 类型转换 | ClassCastException、cannot be cast to |
这些异常(例如 Spring MVC 收到
id=1'后尝试转为 Integer 失败)是应用层行为,不表示 SQL 注入。插件在判定时会优先检查数据库报错关键词;只有在完全没有数据库报错的情况下,才会因命中上述类型转换特征而跳过判定。
响应长度判断只统计 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,1 或 1,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 秒。 |
- 下载本仓库中的
xia_sql-3.3.jar; - 打开 Burp Suite,点击顶部
Extender→Extensions→Add; - 类型选择
Java,文件选择下载的xia_sql-3.3.jar,点击Next; - 加载成功后,Burp 顶部会出现
xia SQL标签页。
- 在
xia SQL标签页中按需勾选开关:- 启动插件:总开关,默认开启;
- 监控Repeater / 监控Proxy:勾选后自动捕获对应工具的流量并扫描;
- 值是数字则进行-1、-0:对纯数字参数额外做数字型注入对照(默认开启);
- 测试Cookie:勾选后对 Cookie 参数注入测试;
- 测试Referer:勾选后对请求头中的
Referer字段注入测试(默认关闭);
- 也可以不走监听,直接在 Repeater / Proxy 中右键 →
Send to xia SQL手动发起扫描; - 白名单:填入域名(多个用英文逗号隔开)并点击"启动白名单",插件只扫描白名单内的 URL;
- 自定义 payload:勾选"自定义payload"后文本域变为可编辑,修改后点击"加载/重新加载payload"生效(会同时保存到插件目录下的
xia_SQL_diy_payload.ini); - 查看结果:
- 左侧主表:每次扫描的 URL、返回包长度和状态,状态列出现
✔⚠(高度可信)、✔(疑似)即有发现; - 右侧详情表:点击主表某一行,展示该次扫描每个参数 × 每个 payload 的请求,"变化"列为检测结论(悬停可看完整内容);
- 下方 Request/Response 选项卡查看选中请求的原始报文。
- 左侧主表:每次扫描的 URL、返回包长度和状态,状态列出现
如需修改源码自行编译:
-
获取 Burp Extender API 包
burp-extender-api.jar:- 方式一:从 Burp Suite 安装目录复制(
burpsuite_pro.jar同级或extender相关目录下); - 方式二:从 PortSwigger 官网 Extender API 页面 下载(需与你的 Burp 版本匹配);
- 方式一:从 Burp Suite 安装目录复制(
-
将其放入项目根目录的
lib/文件夹(目录不存在则手动创建); -
在项目根目录执行编译:
javac -encoding UTF-8 -cp lib/burp-extender-api.jar -d build BurpExtender.java
-
将编译产物更新进 jar(或重新打包):
cd build && jar uf ../xia_sql-3.3.jar burp/
-
在 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、分页、偏移量与游标参数;它只能提示排序表达式入口可疑,不能确认漏洞。