ssl/ezXSS

ezXSS is an easy way for penetration testers and bug bounty hunters to test (blind) Cross Site Scripting.

8
Hotness score
62
Reliability score
2,323
Stars
over 9 years
Age
0
Published reviews
0
Questions

Scores

Hotness and reliability

The two headline scores, measured daily, with 30, 90, and 180 day views.

Hotness score

Jul 19, 2026

Current8

Previous9

Weekly average

100500
Full metrics details

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

180 observed daily rows. Missing days are not fabricated.

Hotness formula

40% Hot today + 40% Hot this week + 20% Breakout.

  • 40% Hot today: 1
  • 40% Hot this week: 6
  • 20% Breakout: 1
  • Stars gained: 1d: 0
  • Stars gained: 7d: 1
  • Stars gained: 14d: 7
  • Stars gained: 30d: 12
  • Stars gained: 90d: 66

Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.

  • Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
  • Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
  • Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
  • Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
  • Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
  • Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score

Reliability score

Jul 19, 2026

Current62

Previous60

Weekly average

100500
Full metrics details

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

180 observed daily rows. Missing days are not fabricated.

Reliability formula

30% Continuity + 30% Closure + 20% Shipping + 10% Liveness + 10% Support burden.

  • 30% Continuity: 43
  • 30% Closure: 100
  • 20% Shipping: 0
  • 10% Liveness: 94
  • 10% Support burden: 97

Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.

  • Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
  • Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
  • Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
  • Support burden = 100 − 2 × open issues per 1,000 stars
  • Liveness = 100 × exp(−pushed days ago ÷ 120)

Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored score

Reliability breakdown

What drives the reliability score

Component scores measured daily from GitHub activity (2026-07-15).

Continuity30% of headline43

Activity on 5 of 90 tracked days in the last 90 and 2 of 30 in the last 30.

Closure30% of headline100

Merged 2 of 1 PRs opened and closed 2 of 2 issues opened over the last 90 tracked days — PR flow carries 55% of this component, issue flow 45%.

Shipping20% of headline0

0 releases in the last 180 days, 0 in the last 90 and 0 in the last 30 — a steady cadence scores highest.

Liveness10% of headline94

Last push 12 days ago — freshness decays as pushes age (roughly halves every 83 days without a push).

Support burden10% of headline97

Open-issue load isn't tracked for this repo yet.

Adoption confidence71

Modeled — how confidently teams are adopting this repo. Stargazers

Maintenance quality63

Modeled from PR/issue responsiveness and upkeep signals. Activity pulse

Risk score12

Modeled — lower is better; adoption and continuity risk. Repository

Stays active (30d)47%

Modeled chance the repo stays active over 30 days. Activity pulse

Stays active (90d)60%

Modeled chance the repo stays active over 90 days. Activity pulse

Release rhythm (180d)0

Regularity of releases over the last 180 days. Releases

Maintainer bus risk (90d)52%

Modeled — lower is better; concentration of commits in few maintainers. Contributors graph

Topics

Explore related topics

Jump into the topic listings this repository belongs to.

Measured history

Project metrics

Weekly GitHub totals with 30, 90, and 180 day views.

Issues opened

Jul 12, 2026

Current0

Previous0

Weekly total

110
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

175 observed daily rows. Missing days are not fabricated.

DateValue

Issues closed

Jul 12, 2026

Current1

Previous0

Weekly total

110
Full metrics details

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

175 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests opened

Jul 12, 2026

Current1

Previous0

Weekly total

110
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

175 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests closed

Jul 12, 2026

Current1

Previous1

Weekly total

110
Full metrics details

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

175 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests merged

Jul 12, 2026

Current1

Previous1

Weekly total

110
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

175 observed daily rows. Missing days are not fabricated.

DateValue

Issue close ratio (daily)

May 21, 2026

Current0.00

Previous0.00

Daily ratio — a gap means nothing was opened that day

How this works: each day's value is issues closed that day ÷ issues opened that day. Days when nothing was opened render as gaps — never a rolling average or a made-up zero. Values above 1 mean the project closed more issues than arrived that day.

1.000.500.00
Full metrics details

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

3 observed daily rows. Missing days are not fabricated.

Per-day formula: issues closed that day ÷ issues opened that day; blank when nothing was opened (a gap, not a zero).

DateIssues openedIssues closedStored score

Project Overview

ezXSS is a self-hosted PHP application that helps you find and document blind cross-site scripting during authorized penetration tests and bug bounty engagements. Blind XSS is the kind you can't see in your own browser: you submit a payload into a form, a support ticket, a user-agent header, or an admin-only log viewer, and it fires somewhere you have no direct access to. ezXSS gives you a callback server that catches those firings and records the proof.

The core idea is simple. You host ezXSS, generate a payload that points back to your instance, and plant it in input fields you suspect get rendered elsewhere. When the script executes in a victim context, it phones home and uploads what it saw — the page URL, DOM snapshot, cookies, origin, screenshot, and more. You review all of it in a dashboard instead of guessing whether an injection landed.

The project is written in PHP and backed by a MySQL database, which means it runs comfortably on the same cheap LAMP hosting most testers already have. It is actively maintained and widely used in the security community, with a large star count reflecting that. Use it only against systems you are explicitly authorized to test — a callback tool like this is for sanctioned engagements, not opportunistic injection.

Licensing is permissive (MIT), so you can self-host and modify it for internal tooling without commercial-license friction.

Key Challenges Addressed

The central problem ezXSS solves is visibility. Reflected XSS is easy to confirm because the payload bounces back to you immediately. Blind XSS hides:

  • You inject into a field whose output renders in a back-office tool you'll never see.
  • The execution may happen hours or days later when a staff member opens a record.
  • You have no way to know which of your dozens of injection points actually worked.

ezXSS addresses each of these with a persistent callback channel. Because the payload reports back asynchronously, you capture executions that happen long after you stopped testing. Because every report is tied to the payload that triggered it, you can trace a firing back to the exact field you injected. And because it collects context — DOM, cookies, local storage, screenshots — you get the evidence a triage team needs to accept the finding rather than a bare "it might be vulnerable."

Getting Started

ezXSS expects a PHP environment with a MySQL/MariaDB database and a web server. A minimal install looks like this:

git clone https://github.com/ssl/ezXSS.git
cd ezXSS
# point your web server's document root at this directory
# create an empty MySQL database for ezXSS to use

From there you open the app in a browser and complete the web installer, which writes the database schema and creates your admin account. After login you generate a payload from the dashboard and place it where you want to test.

Sharp edges you'll hit immediately:

  • If you serve ezXSS over plain HTTP, modern target sites running on HTTPS will block the mixed-content callback and your payloads will silently fail to report. Put a valid TLS certificate on your instance before you generate any payloads.
  • If your callback host is unreachable from the victim's network (internal-only admin panels, egress-filtered environments), the payload executes but never reaches you, and you'll wrongly conclude the field is safe. Confirm your instance is reachable from the public internet first, and note that strictly segmented targets may never be able to call out at all.
  • The default payload references your instance hostname directly, so a Content-Security-Policy with a tight script-src will stop it cold. Check the target's CSP header before assuming a non-firing payload means no vulnerability.

Features and Use Cases

The dashboard is where ezXSS earns its keep. Each captured execution becomes a report containing the firing URL, referrer, user-agent, cookies, local and session storage, the rendered DOM, origin, and an optional screenshot of the page as the victim saw it. That payload of context turns a suspected injection into a documented, reproducible finding.

Realistic scenarios where you'd reach for it:

  • Testing a customer support ticketing system where agents view submissions in an internal console you can't reach.
  • Probing user-agent, referer, or X-Forwarded-For headers that get logged and later rendered in an analytics or admin dashboard.
  • Confirming stored XSS in profile fields that only render for moderators reviewing flagged accounts.

It also supports alerting integrations so you get notified the moment a payload fires, which matters when executions can happen days after you plant them. You can customize payloads per test so you can tell which campaign or client an incoming report belongs to.

Ecosystem and Dependencies

ezXSS sits in the LAMP world: PHP plus MySQL/MariaDB plus any standard web server. There's little to integrate beyond that, which is part of the appeal — it doesn't drag in a heavy framework or a build toolchain.

In a tester's broader toolkit it complements payload resources like payloadbox/xss-payload-list for crafting injection strings, and active scanners like s0md3v/XSStrike that hunt reflected and DOM XSS where ezXSS focuses on the blind, asynchronous case. Notification hooks let it feed into whatever alerting you already run during an engagement.

Architectural Overview

The design has three moving parts: a JavaScript payload, a collection endpoint, and a dashboard.

The payload is the code that runs in the victim's browser. When it executes, it gathers DOM and environment data and posts it back. The collection endpoint receives that data, associates it with the originating payload, and writes a report row to the database. The dashboard reads from the database and renders reports, manages payloads, and handles alerting.

This separation matters because the only component that touches hostile environments is the small payload. Everything heavy — storage, review, configuration — stays server-side on infrastructure you control. The server-rendered PHP dashboard keeps the operational surface small and easy to host, which is the right tradeoff for a tool that needs to be stood up quickly per engagement and torn down afterward.

Pros and Cons

Technical pros:

  • Purpose-built for blind XSS, which most general scanners miss entirely.
  • Rich evidence capture (DOM, cookies, screenshots) that survives triage scrutiny.
  • Trivial to self-host on commodity PHP/MySQL hosting.
  • Permissive MIT license for internal modification.

Technical cons:

  • Requires public reachability and valid TLS, so segmented or egress-filtered targets defeat it.
  • PHP/MySQL stack means you own patching and securing the callback server — a poorly secured instance becomes its own liability holding sensitive captured data.
  • Captured reports can contain victim cookies and session data, so you must handle and dispose of that data responsibly within engagement scope.

Comparison and Alternatives

Measured 90-day trends for this project and its alternatives.

GitHub stars

Weekly star gains

25130
Full metrics details

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

EzXSS

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
epsylon/xsser

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

92 observed daily rows. Missing days are not fabricated.

DateValue

Issues opened

Weekly total

110
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

EzXSS

GitHub API observation. Historical values render only when the source provides a real observation for that day.

175 observed daily rows. Missing days are not fabricated.

DateValue
epsylon/xsser

GitHub API observation. Historical values render only when the source provides a real observation for that day.

81 observed daily rows. Missing days are not fabricated.

DateValue

Issues closed

Weekly total

110
Full metrics details

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

EzXSS

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

175 observed daily rows. Missing days are not fabricated.

DateValue
epsylon/xsser

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

81 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests opened

Weekly total

110
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

EzXSS

GitHub API observation. Historical values render only when the source provides a real observation for that day.

175 observed daily rows. Missing days are not fabricated.

DateValue
epsylon/xsser

GitHub API observation. Historical values render only when the source provides a real observation for that day.

81 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests closed

Weekly total

110
Full metrics details

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

EzXSS

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

175 observed daily rows. Missing days are not fabricated.

DateValue
epsylon/xsser

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

81 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests merged

Weekly total

110
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

EzXSS

GitHub API observation. Historical values render only when the source provides a real observation for that day.

175 observed daily rows. Missing days are not fabricated.

DateValue
epsylon/xsser

GitHub API observation. Historical values render only when the source provides a real observation for that day.

81 observed daily rows. Missing days are not fabricated.

DateValue

Open/closed pull request ratio

Weekly average

100500
Full metrics details

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

EzXSS

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
epsylon/xsser

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

92 observed daily rows. Missing days are not fabricated.

DateValue

Open/closed issues ratio

Weekly average

100500
Full metrics details

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

EzXSS

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
epsylon/xsser

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

92 observed daily rows. Missing days are not fabricated.

DateValue

Releases

Weekly total

110
Full metrics details

GitHub release published_at events bucketed by UTC day; drafts are excluded.

EzXSS

GitHub release published_at events bucketed by UTC day; drafts are excluded.

180 observed daily rows. Missing days are not fabricated.

DateValue
epsylon/xsser

GitHub release published_at events bucketed by UTC day; drafts are excluded.

92 observed daily rows. Missing days are not fabricated.

DateValue

Hotness score

Weekly average

100500
Full metrics details

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

EzXSS

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.

  • Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
  • Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
  • Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
  • Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
  • Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
  • Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score
epsylon/xsser

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

92 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.

  • Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
  • Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
  • Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
  • Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
  • Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
  • Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score

Reliability score

Weekly average

100500
Full metrics details

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

EzXSS

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.

  • Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
  • Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
  • Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
  • Support burden = 100 − 2 × open issues per 1,000 stars
  • Liveness = 100 × exp(−pushed days ago ÷ 120)

Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored score
epsylon/xsser

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

92 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.

  • Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
  • Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
  • Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
  • Support burden = 100 − 2 × open issues per 1,000 stars
  • Liveness = 100 × exp(−pushed days ago ÷ 120)

Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored score

Few tools focus specifically on blind XSS callbacks, but several occupy adjacent ground worth comparing.

Project Repo Hotness (~6mo) PRs merged (~6mo) Star growth (~6mo)
ezXSS https://github.com/ssl/ezXSS 5.67 0 807
XSStrike https://github.com/s0md3v/XSStrike 12.77 0 586
XSSer https://github.com/epsylon/xsser 2.07 0 77
xss-payload-list https://github.com/payloadbox/xss-payload-list metrics pending 0 metrics pending

These tools split into two camps. s0md3v/XSStrike and epsylon/xsser are active scanners that detect reflected and DOM-based XSS during a crawl. payloadbox/xss-payload-list is a payload corpus, not a tool. Only mandatoryprogrammer/xsshunter_express competes head-on with ezXSS as a self-hosted blind XSS callback platform.

The best overall alternative is mandatoryprogrammer/xsshunter_express, because it targets the same blind-XSS callback workflow with mature documentation and an easy self-host path, making it the closest like-for-like swap if you prefer a Node-based stack over PHP.

Conclusion

If you do bug bounty or pentest work and keep missing stored XSS that fires inside admin tooling you can't see, self-host ezXSS and route your payloads through it — the captured DOM and screenshots turn a hunch into an accepted report. Start with the official docs and source at https://github.com/ssl/ezXSS to stand up an instance.

Do not generate payloads from an instance served over plain HTTP: HTTPS targets block the mixed-content callback and your injections will fire without ever reporting, so you'll record false negatives. Do this first — put a valid TLS certificate on your callback host and confirm it's reachable from the public internet before you plant a single payload.

Join the conversation

Reviews · Questions · Posts

Share what you know about ezXSS — write a review from your real experience, ask an implementation question, or publish a post about how you use it.

Share your experience

Write or update your review

Explain what worked, what broke down, and what another team should know before adopting ezXSS.

Write your review now — it saves locally and publishes automatically after you sign in.

Rating
Positive attributes
Negative attributes

Project Q&A

Questions and answers

Browse implementation threads tied directly to ssl/ezXSS. Each question links through to the full answer page.

Q&A No threads yet

Be the first to ask how teams run ezXSS in production. Every question you post becomes a durable, searchable answer page other developers can find.

Ask the first question

Related posts

Posts tagged with the same topics

These posts come from the same topic surface as this repo, so readers can move from project evaluation into practical writeups and migration notes without leaving context.

Posts No topic-linked posts yet

Share how your team uses ezXSS — a migration note, an architecture writeup, or a comparison. Your post reaches everyone browsing these same topics.

Write the first post
Get a weekly email with the hottest new projects in the Vulnerability Scanning and Penetration world.
No Spam. Unsubscribe easily at any time.

Copyright 2018-2026 Awesome Open Source.  All rights reserved.