blitzstrike 2.4.152 → 2.4.153
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/index.js +5 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,18 @@ All notable changes to Blitz Strike are documented here.
|
|
|
5
5
|
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
7
|
|
|
8
|
+
## [2.4.153] — 2026-10-11
|
|
9
|
+
|
|
10
|
+
### Fixed — blind_oracle/confirm trailing-slash redirect false-negative
|
|
11
|
+
|
|
12
|
+
- Real-target bug: `baseUrl.replace(/\/+$/,"")` stripped the trailing slash, so a
|
|
13
|
+
path-based endpoint (e.g. /Less-8) hit a 301 redirect and the probe hashed the
|
|
14
|
+
redirect body instead of the real response — causing false negatives that a
|
|
15
|
+
flat mock lab never exposed. Now the base keeps a trailing slash and fetches
|
|
16
|
+
follow redirects. Verified against sqli-labs Less-8 (boolean blind) and Less-9
|
|
17
|
+
(time blind): blind_oracle flags sql context, blind_sqli_confirm reports
|
|
18
|
+
CONFIRMED via boolean (706b vs 722b) + time (~5001ms vs ~2ms) differentials.
|
|
19
|
+
|
|
8
20
|
## [2.4.152] — 2026-10-11
|
|
9
21
|
|
|
10
22
|
### Added — autonomous blind SQLi confirmation (blind_sqli_confirm)
|
package/dist/index.js
CHANGED
|
@@ -62357,7 +62357,7 @@ function classifyBlindProbe(input) {
|
|
|
62357
62357
|
return { same_as_baseline: same, signal, reason };
|
|
62358
62358
|
}
|
|
62359
62359
|
async function blindOracle(baseUrl, param, value, opts = {}) {
|
|
62360
|
-
const base = baseUrl.replace(/\/+$/, "");
|
|
62360
|
+
const base = baseUrl.replace(/\/+$/, "") + "/";
|
|
62361
62361
|
const sinks = opts.sinks ?? ["sql", "ssti", "xss"];
|
|
62362
62362
|
const timeDbms = opts.timeDbms ?? "mysql";
|
|
62363
62363
|
const marker = `zz${Math.random().toString(36).slice(2, 10)}zz`;
|
|
@@ -62368,7 +62368,7 @@ async function blindOracle(baseUrl, param, value, opts = {}) {
|
|
|
62368
62368
|
let baselineSize = 0;
|
|
62369
62369
|
let baselineStatus = 0;
|
|
62370
62370
|
try {
|
|
62371
|
-
const r = await fetch(build(value), { headers, redirect: "
|
|
62371
|
+
const r = await fetch(build(value), { headers, redirect: "follow", signal: AbortSignal.timeout(timeoutMs) });
|
|
62372
62372
|
baselineStatus = r.status;
|
|
62373
62373
|
const body = await r.text();
|
|
62374
62374
|
baselineHash = sha256(body);
|
|
@@ -62389,7 +62389,7 @@ async function blindOracle(baseUrl, param, value, opts = {}) {
|
|
|
62389
62389
|
for (const p of probes) {
|
|
62390
62390
|
const t0 = Date.now();
|
|
62391
62391
|
try {
|
|
62392
|
-
const r = await fetch(build(p.payload), { headers, redirect: "
|
|
62392
|
+
const r = await fetch(build(p.payload), { headers, redirect: "follow", signal: AbortSignal.timeout(timeoutMs) });
|
|
62393
62393
|
const timing = Date.now() - t0;
|
|
62394
62394
|
const status = r.status;
|
|
62395
62395
|
const body = await r.text();
|
|
@@ -62444,7 +62444,7 @@ async function blindOracle(baseUrl, param, value, opts = {}) {
|
|
|
62444
62444
|
};
|
|
62445
62445
|
}
|
|
62446
62446
|
async function confirmBlindSqli(baseUrl, param, value, dbms = "mysql") {
|
|
62447
|
-
const base = baseUrl.replace(/\/+$/, "");
|
|
62447
|
+
const base = baseUrl.replace(/\/+$/, "") + "/";
|
|
62448
62448
|
const p = blindSqli(dbms);
|
|
62449
62449
|
if (!p)
|
|
62450
62450
|
return { error: `no blind-SQLi playbook for '${dbms}'`, known: ["mysql", "postgresql", "mssql", "oracle", "sqlite"] };
|
|
@@ -62452,7 +62452,7 @@ async function confirmBlindSqli(baseUrl, param, value, dbms = "mysql") {
|
|
|
62452
62452
|
const build = (payload) => `${base}?${encodeURIComponent(param)}=${encodeURIComponent(payload)}`;
|
|
62453
62453
|
const fetchSize = async (payload) => {
|
|
62454
62454
|
try {
|
|
62455
|
-
const r = await fetch(build(payload), { headers, redirect: "
|
|
62455
|
+
const r = await fetch(build(payload), { headers, redirect: "follow", signal: AbortSignal.timeout(9000) });
|
|
62456
62456
|
const body = await r.text();
|
|
62457
62457
|
return { ok: true, status: r.status, size: body.length };
|
|
62458
62458
|
} catch (e) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blitzstrike",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.153",
|
|
4
4
|
"description": "Blitz Strike — a universal MCP security-audit toolbelt. BLITZ sweeps the attack surface, EAGLE-EYE traces source-to-sink, STRIKE verifies live. 57 attack chains, 130-tool catalog, intelligence data layer. One server, every agent.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|