interactsh
Async client for polling out-of-band interaction servers. Generate unique URLs, inject them into payloads, and correlate DNS/HTTP interactions back to the original probe. Used for detecting blind XSS, SSRF, SQL injection, and other vulnerabilities where the target makes outbound requests.
interactsh is async. Add tokio to your Cargo.toml before copy-pasting the example:
[]
= "0.2"
= { = "1", = ["macros", "rt-multi-thread", "time"] }
use ;
use Duration;
async
Why this exists
Blind vulnerabilities require out-of-band detection. You inject a URL into a payload. If the target is vulnerable, it makes a request back to that URL. Most tools either lack OOB detection entirely or embed hardcoded interactsh logic that cannot be reused.
This crate provides an async client that handles URL generation with cryptographic nonces, correlation ID management, and interaction polling. It works with public interactsh servers or self-hosted instances.
URL generation
Each generated URL contains:
- A correlation ID (configurable length, default 14 chars)
- A unique nonce (configurable length, default 16 chars)
- The server hostname
The combination ensures global uniqueness while letting you correlate interactions back to specific probes.
let url = client.generate_url?;
// URL format: {correlation_id}{nonce}.{server}
// Example: abc123def456ghi.oast.pro
Context tracking
Attach metadata to URLs for later correlation:
let context = new
.with_attribute
.with_attribute;
let url = client.generate_url?;
When polling returns interactions, the context is restored from the nonce mapping.
Polling
The poll() method retrieves all interactions for your correlation ID:
let interactions = client.poll.await?;
for item in interactions
Unknown interactions (wrong correlation ID or forgotten nonces) are filtered out automatically. Empty poll responses are treated as Ok(vec![]), including servers that return null for interaction arrays.
Configuration
use ClientConfig;
let config = ClientConfig ;
Load from TOML:
let config = from_toml_str?;
Error handling
Errors are typed by stage:
ConfigProblem::Empty: Missing required fieldsConfigProblem::MustBeGreaterThanZero: Invalid length settingsTransportStage::Send: Network failureTransportStage::Timeout: Request timeoutTransportStage::ReadBody: Response body read failure
Self-hosted servers
Point at your own interactsh instance:
let config = ClientConfig ;
Contributing
Pull requests are welcome. There is no such thing as a perfect crate. If you find a bug, a better API, or just a rough edge, open a PR. We review quickly.
License
MIT. Copyright 2026 CORUM COLLECTIVE LLC.