29 hackerone reporting
Skill 0xGhostCAT/claude-ai-cyber-security-skills/skills/29-hackerone-reporting
Write production-grade HackerOne reports — title formula, impact-led writing, CVSS 3.1 scoring, complete PoC formatting, attached files, and submission etiquette. Use AFTER triage-validation passes and you're ready to submit on HackerOne.From its SKILL.md
npx -y skills add 0xGhostCAT/claude-ai-cyber-security-skills --skill 29-hackerone-reportingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
SKILL.md
12.1 KB, ~3.1k tokens by cl100k_base, as published. Nobody here has run it
HackerOne Reporting
A great report turns a $1,500 medium into a $3,500 medium-with-warm-relationship.
When to invoke
Trigger phrases:
- "write H1 report"
- "HackerOne template"
- "submit on HackerOne"
- "format for H1"
Prerequisites
- Passed
[[triage-validation]]7-Question Gate - Working PoC, reproduced from cold start
- Clear severity in mind (don't inflate)
HackerOne report structure (the template)
**Summary:**
[1-2 sentence executive summary — what's the bug, what's the impact]
**Description:**
[3-5 sentences on the affected feature, root cause, and how it was discovered]
**Steps To Reproduce:**
1. [first step]
2. [next step]
3. [next step]
4. [observed outcome]
**Supporting Material/References:**
- Screenshot: attached as `screenshot-1.png`
- Video: attached as `poc-recording.mp4`
- HAR file: attached as `repro.har`
- Burp requests: included inline below
**Impact:**
[3-5 sentences. Concrete. Concrete. Concrete.]
- What does this allow an attacker to do?
- How many users / records / dollars are affected?
- What's the worst-case scenario?
- Is there a chain to a higher-severity attack?
The default H1 template has these fields. Fill all of them.
Title formula
Format: <Severity-implication>: <Vuln-class> in <endpoint/feature> enables <impact>
Examples:
# Good titles
Critical: IDOR in GraphQL `user` query enables PII disclosure of all 2M+ users
High: Stored XSS via SVG avatar upload leads to session theft on profile view
High: SSRF in document import URL → AWS IAM credential disclosure
High: Race condition in coupon redemption enables unlimited single-use coupon abuse
Critical: alg=none JWT acceptance enables authentication bypass to any user
Critical: Web cache poisoning via X-Forwarded-Host injects phishing link on /home
# Avoid
XSS ← too vague
IDOR found on website ← no impact
Possible XSS in search ← weak language
Vulnerability ← useless
The title sells the report. It's the first thing the triager sees on their dashboard.
The full report (production-grade example)
**Summary:**
The `/api/v3/user/{user_id}/notifications` endpoint does not validate that the requesting user matches the path's `user_id`, allowing any authenticated user to read any other user's notifications. Notifications contain email addresses, internal IDs, and message previews, enabling PII enumeration of all 2M+ user accounts.
**Description:**
While reviewing the user dashboard's network traffic, I observed a request to `/api/v3/user/{user_id}/notifications` that returned the user's own notifications. The endpoint uses the `user_id` from the URL path rather than from the authenticated session. By substituting another user's ID (obtained via UUID enumeration from referrer headers in past disclosed bugs), I was able to retrieve their notifications without authorization.
The root cause appears to be missing authorization middleware on this specific REST route — other routes under `/api/v3/user/*` correctly compare `request.user.id === request.params.user_id`.
**Steps To Reproduce:**
1. Create two test accounts:
- Account A (attacker): `[email protected]` — user_id `AAAA-1111-2222-3333-4444`
- Account B (victim): `[email protected]` — user_id `BBBB-5555-6666-7777-8888`
2. Log in as Account A in a clean browser, capture the `session_cookie`:
session_cookie=eyJhbGc... (32-character session token)
3. Send the following request:
```http
GET /api/v3/user/BBBB-5555-6666-7777-8888/notifications HTTP/1.1
Host: app.target.com
Cookie: session_cookie=eyJhbGc...
Accept: application/json
-
Response (200 OK) — contains Account B's notifications:
{ "user_id": "BBBB-5555-6666-7777-8888", "email": "[email protected]", "notifications": [ { "id": 47239, "type": "invoice_paid", "subject": "Your invoice #5039 has been paid", "preview": "Hello Test User B...", "received_at": "2026-06-01T10:14:55Z", "read": false }, ...8 more notifications... ] } -
Repeated with arbitrary user IDs (UUID brute or via leaked IDs from features like @-mentions in comments) returns each user's data.
Supporting Material/References:
- screenshot-1.png — Browser developer tools showing the IDOR request and response
- video-repro.mp4 — 90-second walkthrough of reproduction from scratch
- repro.har — HAR file of the entire reproduction session
- attached.curl — raw curl command for one-line reproduction
Impact:
Any authenticated user (signup is free and immediate) can enumerate the notifications of every registered user on the platform. Notifications contain:
- Email addresses (PII — GDPR/CCPA scope)
- Invoice IDs (which are sequential and let attackers infer total order volume)
- Message previews (may include internal mentions or task descriptions)
- Notification timestamps (activity patterns)
Concrete impact:
- Mass PII collection: With 2.3M+ users (per the "About" page), an attacker can scrape emails + activity metadata for all of them.
- GDPR exposure: Email + activity metadata pairing is identifiable personal data; compliance breach.
- Phishing setup: Attackers learn what notifications look like (subject lines, sender), enabling indistinguishable phishing emails.
- Chain potential: Combined with the
emailexposure here, password reset (email-only flow per the Help Center) becomes a viable ATO vector — see also report #XXXXXX [reference past dupe if any].
Suggested Fix:
Add an authorization check at the controller for /api/v3/user/{user_id}/notifications:
// pseudo
if (req.session.user_id !== req.params.user_id && !req.session.is_admin) {
return res.status(403).json({ error: 'forbidden' });
}
Audit other endpoints under /api/v3/user/* for the same pattern — initial review suggests /profile, /billing, and /sessions may have the same issue.
Test accounts and artifacts will be retained for verification or removed upon request.
## Best practices
### 1. Lead with impact
Hooks the triager: "*This bug allows ATO of any user with one request.*" — triager pays attention.
### 2. Use exact requests and responses
Copy-paste the actual HTTP traffic. Don't summarize. Triagers verify by replaying.
### 3. Reproduction with TWO accounts
For any cross-user bug (IDOR, ATO, multi-tenant): provide both account credentials or use the program's test accounts.
### 4. Attachments
- **Screenshots:** Annotated with arrows/circles. Show the affected vs expected behavior.
- **Videos:** Keep under 2 minutes. Start with the bug demo, not the long setup.
- **HAR files:** Use Burp's "Save HAR" or browser dev tools. Includes everything triager needs.
- **Burp requests:** Copy raw HTTP to make replay trivial.
### 5. Severity & CVSS
Use the CVSS field with a vector string:
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N → 6.5 (Medium)
Match the program's table. Conservative scoring builds trust.
### 6. Don't bury the lead
Triagers spend < 60 seconds on first read. The Summary section is everything. If it's vague, the report is closed.
### 7. Single-bug per report
One issue per submission. If you found 3 IDORs, file 3 reports (or 1 with "found on multiple endpoints" — varies by program).
### 8. Markdown formatting
H1 supports markdown. Use it:
- `**bold**` for emphasis
- Code blocks with triple-backticks
- Lists (`-` and `1.`)
- Headers (`##`)
### 9. Don't include exploit binaries
Attach text PoCs. Triage may sandbox; binaries trigger security flags.
### 10. Authorization context (note for offensive demos)
"For PoC, I created Account A and B (both test accounts in my control). No real user data was accessed."
## Severity → bounty mapping (typical H1)
Critical: $2,000 - $30,000+ (CVSS 9.0-10.0) High: $700 - $5,000 (CVSS 7.0-8.9) Medium: $200 - $1,500 (CVSS 4.0-6.9) Low: $50 - $400 (CVSS 0.1-3.9) Informative: $0 (acknowledgment only)
Match against the program's stated table.
## After submission — etiquette
### Wait for triage (be patient)
- Most H1 programs: 24-48h first response
- Don't ping unless > 7 days with no update
- If pinged for clarification: respond fast, specific
### Negotiation tactics
**Triager says "severity Medium":**
- Don't argue tone. Argue specifics.
- ✗ "This is clearly High, you don't understand."
- ✓ "Thanks for the assessment. I'd like to push back on the severity given:
1. Affects all 2M+ users (not 'some')
2. No authentication required (unauth class)
3. PII disclosed (GDPR scope)
By the CVSS:3.1 vector AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N = 7.5 (High).
Could you reconsider with these in mind?"
**Triager says "duplicate":**
- Ask politely for the original report ID
- Verify it's actually the same bug (or just same class)
- If not actually a dupe: explain why
**Triager closes as Informative:**
- Ask what would change their mind
- Often: more impact framing, chain demo, or stronger PoC
### If awarded
Thank the team. Briefly. Don't gush.
### If disputed
Stay calm. State facts. Reference the original PoC. Most disputes resolve via more PoC.
## Cross-references
- `[[triage-validation]]` — run before this
- `[[bugcrowd-reporting]]` — Bugcrowd variant
- `[[program-selection]]` — choose programs with fair triage history
- All vuln-class skills — back-reference for impact statements
## Common pitfalls
1. **Wall of text Summary.** Keep it 1-2 sentences.
2. **PoC that requires triager to assume / fill in.** Be explicit.
3. **No attachments.** Triagers love HAR + screenshots.
4. **Inflated severity.** Hurts your H1 reputation score.
5. **Multiple bugs in one report.** Confuses triage, may get partial bounty.
## Hot tips
- **Get H1 verified.** Verified researchers get faster triage.
- **Stay in the Top X% of resolvers.** Reputation = priority queue.
- **Public disclosure later.** Once paid + fixed, request disclosure → builds your portfolio.
- **Link to your past disclosed reports** in the description (if relevant chain) — shows depth.
## H1 metadata fields
H1 form has these structured fields:
- **Title** — see formula above
- **Weakness** — CWE category (e.g., CWE-639 for IDOR, CWE-79 for XSS)
- **Severity** — your CVSS-implied severity
- **Affected URL(s)** — comma-separated
- **Asset Identifier** — match to the in-scope asset from program scope
- **Attachments** — drop-zone for PNG/MP4/PDF/HAR
Fill all of them. Missing structured fields can delay triage.
## Quick markdown report skeleton
Copy-paste this into the H1 report form, then fill:
```markdown
## Summary
[1-2 sentences — what + impact in plain English]
## Description
[3-5 sentences — affected feature, root cause hypothesis]
## Steps To Reproduce
1. Create test accounts:
- Account A (attacker): `<email>` user_id `<id>`
- Account B (victim): `<email>` user_id `<id>`
2. As Account A, send:
```http
<full request including cookies>
-
Response (200 OK):
<response showing the IDOR / bypass / leak> -
Reproducibility: tested in Chrome 124, Firefox 125; works fresh.
Supporting Material
- screenshot-1.png — [what it shows]
- video-repro.mp4 — [90 second walkthrough]
- repro.har — [HAR file of session]
Impact
[Concrete, business-grade impact.]
- Users affected: [number]
- Data class: [PII / financial / system]
- Chain potential: [yes/no, what next]
Suggested Fix
[Specific, actionable. Show code if possible.]
CVSS
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N (7.5 High)
Notes
- Tested with my own test accounts only
- No real user data was accessed
- Test accounts will be retained / deleted as needed
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.