VAPT Report: company-c.example.com
Comprehensive Vulnerability Assessment & Penetration Testing Report
🛡 1. Executive Summary
company-c.example.com operates a much larger infrastructure than initially visible. Deep OSINT and JS bundle analysis uncovered a live backend API server, a payment processing UI with Razorpay integration, and a portfolio of 12+ registered domains.
Infrastructure Overview
- Main domain (
company-c.example.com): Static React + Vite SPA on Fastly CDN (IP:10.0.3.1). Marketing/waitlist landing page. - Backend API (
redacted-api.vercel.app): LIVE Express.js API on Vercel with active payment endpoints including Razorpay integration. Contains hardcoded PII. - Payment Frontend (
redacted-ui.vercel.app): React app on Vercel with Razorpay checkout and split payment UI. - Canva Marketing Site (
company-cments.my.canva.site/main): Older marketing page with company details. - 12+ registered domains: All on Linode OpenResty servers showing "Coming Soon".
- Subdomains (
*.company-c.example.com): Wildcard DNS resolves ALL subdomains to 5 Linode servers running OpenResty/xxx.xxx.xxx.xxx (nginx-based). These serve a generic "Coming Soon" page that dynamically reflects the subdomain name in the HTML, creating a potential attack vector.
Overall Risk Assessment
| Component | Risk Level | Rationale |
|---|---|---|
| Backend API (company-c-api-prototype-server) | CRITICAL | Live payment endpoints, no auth, PII exposure, wildcard CORS |
| Payment Frontend (company-c-pay-ui) | HIGH | Public source code, Razorpay integration, API URL exposed |
| Domain Portfolio (12+ domains) | HIGH | Massive attack surface, all on 5 Linode servers |
| Subdomain infrastructure | MEDIUM-HIGH | Wildcard DNS + hostname reflection + HSTS disabled |
| Main domain (company-c.example.com) | LOW | Static SPA, no server-side processing |
Can an Attacker...
| Attack Scenario | Possible? | Details |
|---|---|---|
| Access the backend API without auth? | YES | Live Express.js API at redacted-api.vercel.app — zero authentication on all payment endpoints |
| Steal personal information (PII)? | YES | Name, phone, email, address hardcoded in API response — accessible to anyone |
| Abuse payment endpoints? | YES | Payment initiation, status, and capture endpoints are unauthenticated with wildcard CORS |
| Hack the database / SQL injection? | UNTESTED | The API crashes (500 errors) when called — could not verify if SQL injection reaches a database. The main company-c.example.com site has no database |
| Inject pornographic/malicious content on homepage? | Static files on CDN — no server-side rendering, no content injection point | |
| Deface the website? | INDIRECT | Cannot modify CDN-served files without Fastly credentials; BUT subdomain wildcard could be exploited for phishing/deception |
| Take the site down (DDoS)? | POSSIBLE | Fastly CDN provides DDoS mitigation, but no rate limiting — sustained attack with cache-busting could degrade performance. Subdomain Linode servers are more vulnerable |
| Perform XSS attacks? | PARTIAL | Main site doesn't reflect any input; subdomains reflect hostname in HTML but browser DNS restrictions limit direct XSS |
| Steal user data? | No user data is collected, stored, or processed currently | |
| Perform clickjacking? | YES | No X-Frame-Options or CSP frame-ancestors — site can be embedded in attacker-controlled iframes |
| Perform subdomain takeover? | POSSIBLE | Wildcard DNS + multiple Linode servers — if any server is decommissioned, subdomain takeover is trivial |
| Exploit a backdoor? | No backdoors, admin panels, or debug endpoints found | |
| Intercept payments? | No payment processing currently active |
📋 2. Finding Summary Table
Severity Distribution
Overall Risk Level
| # | Finding | Severity | CVSS 3.1 | What Happens If Exploited |
|---|---|---|---|---|
| F18 | PII Hardcoded in Live API Response | CRITICAL | 9.1 | Founder's phone/email/address harvested; SIM-swap attacks, identity theft, targeted phishing against leadership |
| F19 | Wildcard CORS (*) on Backend API | CRITICAL | 8.6 | Any malicious website can silently call your payment API from a victim's browser; fake payments, data theft at scale |
| F20 | Razorpay Key Undefined in Production | CRITICAL | 8.2 | Payment flow is broken; if key is later set without fix, it leaks to every visitor enabling fraudulent transactions |
| F21 | Payment API — Zero Authentication | CRITICAL | 9.4 | Attacker initiates/captures/verifies payments freely; financial fraud, unauthorized refunds, payment manipulation |
| F22 | x-powered-by: Express Exposed | MEDIUM | 5.3 | Attacker knows exact framework; targets Express-specific CVEs to gain RCE on the API server |
| F23 | GitHub Repo Exposes Source Code | MEDIUM | 5.0 | Attacker reads full payment flow logic; finds hidden endpoints, business logic flaws, and crafts targeted exploits |
| F24 | 12+ Domains on 5 Linode Servers | HIGH | 7.2 | Compromise one server = control multiple domains; host phishing under your brand; massive reputational damage |
| F25 | API Error Messages Leak Internals | MEDIUM | 5.3 | Attacker learns server region, architecture, function IDs; uses info to craft targeted infrastructure attacks |
| F01 | Missing Content-Security-Policy (CSP) | HIGH | 6.1 | When forms/payment go live: attacker injects malicious scripts that steal every credit card number entered |
| F02 | Wildcard Subdomain + Hostname Reflection | HIGH | 6.5 | Attacker creates secure-payment.company-c.example.com phishing page; victims trust it because it's your real domain |
| F03 | Subdomain HSTS Disabled (max-age=0) | HIGH | 7.4 | Attacker on public WiFi intercepts subdomain traffic via SSL stripping; steals credentials/session tokens in transit |
| F04 | OpenResty Version Disclosure | MEDIUM | 5.3 | Attacker looks up known CVEs for OpenResty xxx.xxx.xxx.xxx; exploits unpatched vulns to gain server shell access |
| F05 | Missing X-Frame-Options (Clickjacking) | MEDIUM | 4.3 | Attacker embeds your site in invisible iframe; tricks users into clicking "Confirm Payment" |
| F06 | No Rate Limiting — Main Domain | MEDIUM | 5.3 | Attacker floods CDN with cache-busting requests; inflates your Fastly bill by thousands; degrades site for real users |
| F07 | No Rate Limiting — Subdomain Servers | MEDIUM | 5.3 | Attacker DDoSes bare Linode servers directly; servers go offline; all 12+ domains become unreachable |
| F08 | Shared SSL Certificate (100+ SANs) | LOW | 3.7 | Attacker discovers all 100+ sites sharing your certificate; compromises a weaker co-tenant to pivot toward your infrastructure |
| F09 | Missing X-Content-Type-Options | LOW | 3.1 | Browser misinterprets uploaded file as executable; malicious file disguised as image runs as JavaScript |
| F10 | Missing Referrer-Policy | LOW | 3.1 | When payment URLs contain order/transaction IDs, these leak to Google Fonts and other third parties via Referer header |
| F11 | Missing Permissions-Policy | LOW | 2.6 | Malicious ad/script on page silently accesses camera, microphone, or payment API without user knowing |
| F12 | SPA Catch-All 200 + TRACE Enabled | LOW | 3.1 | Security scanners can't distinguish real vs fake endpoints; TRACE method could enable Cross-Site Tracing |
| F13 | Excessive Google Fonts (25+ families) | LOW | 2.0 | Google tracks every visitor; if Google Fonts CDN is compromised, malicious CSS/fonts execute on your site |
| F14 | CDN Infrastructure Disclosure | INFO | 0.0 | Attacker learns you're on Fastly Kolkata PoP; targets that specific edge node |
| F15 | Business Email Uses Gmail | INFO | 0.0 | Attacker spoofs redacted-c@gmail.com; sends fake invoices to your clients |
| F16 | Privacy Policy & Terms Missing | INFO | 0.0 | RBI rejects PA/PG license; DPDPA non-compliance leads to fines up to Rs 250 crore |
| F17 | No security.txt / robots.txt | INFO | 0.0 | Security researchers can't report vulnerabilities responsibly |
⚠️ 2A. Exploitability Scores & India Threat Landscape
India Cybercrime Context — Why This Matters NOW
| Statistic | Value | Source |
|---|---|---|
| Cybercrime cases in India (2025) | 28.15 lakh (24% increase from 2024) | NCRB / I4C |
| Financial losses from cyber fraud (2025) | Rs 22,845 crore | National Cyber Crime Reporting Portal |
| Projected annual cyber fraud losses | Rs 1.2 lakh crore (2025) | I4C |
| UPI fraud incidents (FY 2024-25) | 1.1 million+ (85% increase YoY) | NPCI |
| Cyberattacks per week on Indian orgs | 2,011 (higher than global average) | Check Point Research 2025 |
| Data breach incidents in India (2025) | ~8,500 identity theft/breach cases | NCRB State Data |
| Online fraud incidents (2025) | ~71,500 nationwide | IndiaDataMap Analysis |
| DPDPA maximum penalty per violation | Rs 250 crore | DPDPA 2023, Section 33 |
| API attacks in banking/fintech (India 2025) | Surging — banking/utilities top targets | Dark Reading India Report |
| CORS misconfiguration as initial attack vector | 90% of successful API attacks | CybelAngel API Threat Report 2025 |
| Organizations with API security problems | 95% have issues; 23% suffered actual breaches | Traceable State of API Security 2025 |
| Apps with broken access control | 100% of tested apps had some form | OWASP Top 10:2025 |
| Apps with security misconfiguration | 90% of tested apps had some form | OWASP Top 10:2025 |
In this context: Company C, a fintech startup handling payment infrastructure, has 4 CRITICAL vulnerabilities that are trivially exploitable. India saw Rs 22,845 crore lost to cybercrime in 2025 alone. An unprotected payment API is a magnet for attackers.
Exploitability Scorecard — Every Finding Rated
The Exploitability Score rates how easy it is for an attacker to exploit the vulnerability:
- 10/10 = A script kiddie with Google can do it in 5 minutes
- 7-9/10 = An average attacker with basic tools can do it in under an hour
- 4-6/10 = Requires moderate skill, some setup, or specific conditions
- 1-3/10 = Requires advanced expertise, insider access, or rare conditions
| # | Finding | Exploitability | Skill Level | Tools Needed | Attack Success Rate | India Incidents (2025) |
|---|---|---|---|---|---|---|
| F18 | PII in API Response | None — just visit a URL | Web browser | 100% — data is served on request | 8,500+ identity theft cases | |
| F19 | Wildcard CORS on API | Basic — 10 lines of JavaScript | Browser + any website | 90% of API breaches start with CORS misconfig | 35 financial APIs compromised (Jan 2025) | |
| F20 | Razorpay Key Undefined | Basic — when key is set, it's auto-exposed | Browser | High — Twilio Authy leak exposed 33.4M phone numbers | UPI fraud: 1.1M incidents in FY25 | |
| F21 | Unauthenticated Payment API | None — curl command | Terminal/browser | 100% attack surface is open | API attacks surging in India banking | |
| F22 | Express Version Disclosure | Medium — need to find matching CVE | CVE databases + exploit tools | Moderate | Part of 2,011 weekly attacks | |
| F23 | Public GitHub Repo | None — click a link | Web browser | 100% — code is public | OSINT is #1 recon method | |
| F24 | 12+ Domains on Linode | Medium — monitor for IP release | Linode account + monitoring | High — subdomain takeover automated at scale | Top-10 bug bounty finding | |
| F25 | API Error Message Leaks | Basic — trigger errors, read responses | curl / browser | High — error-based recon is step 1 | Part of every targeted attack | |
| F01 | Missing CSP | Medium — need XSS vector (future) | XSS payload | 94% of apps have broken access control | Supply chain attacks rising 300% | |
| F02 | Wildcard Subdomain Reflection | Basic — create a phishing link | Social engineering | High — phishing is #1 attack vector in India | 13.7 lakh phishing complaints | |
| F03 | Subdomain HSTS Disabled | Medium — need MITM position | SSL stripping tools | Moderate — common on public networks | Free WiFi attacks common in India | |
| F04 | OpenResty Version Disclosure | Medium — need to find & exploit CVE | CVE scanner + exploit kit | Moderate | Part of 2,011 weekly attacks | |
| F05 | Missing X-Frame-Options | Basic-Medium — create iframe page | HTML + social engineering | Moderate | Part of UPI fraud (1.1M incidents) | |
| F06 | No Rate Limiting (Main) | Basic — loop curl commands | Any HTTP tool / botnet rental ($50) | High — DDoS-for-hire costs Rs 500/hour | 19+ hours of DDoS during Op Sindoor | |
| F07 | No Rate Limiting (Subdomains) | Basic — direct IP, no CDN protection | curl / LOIC / any flood tool | Very High — bare servers with no protection | Linode servers have no DDoS shield | |
| F08 | Shared SSL Certificate | Medium — need to exploit co-tenant | Certificate transparency logs | Low-Moderate | Informational | |
| F09 | Missing X-Content-Type-Options | Medium — need file upload + MIME confusion | Crafted file upload | Low | N/A currently | |
| F10 | Missing Referrer-Policy | Low — passive data leakage | No tools needed (automatic) | Low | Contributes to tracking/profiling | |
| F11 | Missing Permissions-Policy | Low — need malicious script on page | XSS prerequisite | Low | N/A currently | |
| F12 | Catch-All 200 + TRACE | Medium — TRACE exploitation rare | Cross-Site Tracing tools | Very Low | Informational | |
| F13 | Excessive Google Fonts | Advanced — need to compromise Google CDN | Nation-state level | Very Low | Supply chain attacks rising 300% | |
| F14 | CDN Info Disclosure | Low — passive information gathering | Browser dev tools | N/A — recon aid only | Part of every attack chain | |
| F15 | Gmail for Business | Basic — spoof email (no DMARC) | Email spoofing tools | High | 13.7 lakh phishing complaints | |
| F16 | No Privacy/Terms | N/A — regulatory | Complaint to CERT-In / DPB | Certain — non-compliance is binary | DPDPA fines up to Rs 250 crore | |
| F17 | No security.txt/robots.txt | N/A — informational | N/A | N/A | N/A |
Exploitability Distribution
Key takeaway: 13 out of 25 findings (52%) have an exploitability score of 7/10 or higher, meaning they can be exploited by an attacker with basic skills and freely available tools. The 4 CRITICAL findings (F18, F19, F20, F21) are literally exploitable by visiting a URL in a web browser — no hacking tools, no special knowledge needed.
How Company C Compares to Industry Benchmarks
| Benchmark | Industry Average | Company C Status | Verdict |
|---|---|---|---|
| OWASP Top 10 coverage | Most apps have 2-3 categories | Company C has issues in 5 out of 10 categories | |
| API authentication | 77% of APIs require auth | 0% of Company C APIs require auth | |
| CORS configuration | 10% have wildcard CORS | 100% of Company C APIs have wildcard CORS | |
| Security headers score | Average: 4/10 headers present | Company C: 1/10 headers present (only HSTS) | |
| Rate limiting | 68% of production APIs have rate limiting | 0% of Company C endpoints have rate limiting | |
| PII exposure | Avg breach exposes 4 data types | Company C exposes 4 data types unauthenticated | |
| Time to exploit | Avg targeted attack: 4-7 days | Company C CRITICAL vulns: < 5 minutes |
India-Specific Threat Intelligence for Company C
| Threat | Relevance to Company C | Likelihood | Annual India Impact |
|---|---|---|---|
| UPI Payment Fraud | Company C builds UPI payment infrastructure; exposed API makes it a target | VERY HIGH | 1.1 million UPI fraud cases (FY25, +85% YoY) |
| Fintech Data Breaches | PII already exposed via API; similar to Nupay breach affecting 38 banks | VERY HIGH | 8,500+ identity theft cases; Zoomcar leaked 8.4M users |
| API-Based Attacks | Unauthenticated payment APIs are prime targets; India banking API attacks surging | VERY HIGH | Banking/utilities API attacks top category |
| DDoS Extortion | Unprotected Linode servers are easy targets; DDoS-for-hire costs Rs 500/hr | HIGH | 19+ hrs DDoS on govt sites; 2,011 attacks/week |
| Phishing via Subdomain | Wildcard *.company-c.example.com enables branded phishing at zero cost | HIGH | 13.7 lakh phishing complaints (2025) |
| Regulatory Action | DPDPA active; DPB can investigate; no privacy policy = guaranteed violation | HIGH | DPDPA fines: up to Rs 250 crore; 72-hour breach notification required |
| SIM Swap Attacks | Founder's phone number exposed in API response | HIGH | SIM swap is top method for UPI fraud in India |
| Investment Scam Impersonation | Attackers could use Company C brand for fake investment schemes | MEDIUM | 75% of cyber fraud losses from investment scams |
Real-World Parallels — "This Has Happened Before in India"
| Incident | What Happened | Similarity to Company C |
|---|---|---|
| Nupay Breach (2025) | Fintech partner's misconfiguration exposed data from 38 banking institutions | Company C has misconfigured API with PII exposure — same pattern |
| Zoomcar Breach (June 2025) | 8.4 million users' names, emails, phones, trip data leaked | Company C already leaks founder PII; customer data would follow at scale |
| Twilio Authy (2024) | Unauthenticated API endpoint leaked 33.4 million phone numbers | Company C has identical pattern — unauthenticated endpoint leaking phone number |
| Operation Sindoor DDoS (May 2025) | 19 hours of DDoS on Indian government sites; power grid probed 200K times | Company C's Linode servers have zero DDoS protection |
| Fintech KYC Exposure (2025) | Startup stored KYC in plain text; researcher flagged it; DPB imposed penalty | Company C stores PII in API responses — even worse (actively served) |
The pattern is clear: Every vulnerability found in Company C has been exploited against Indian companies in 2025. This is not theoretical — these attacks are happening daily at scale in India.
💰 2B. Business Impact & Real-World Attack Scenarios
This section explains in plain language what a real attacker could do with each vulnerability, what the business stands to lose, and how it would play out step-by-step.
1 Founder Identity Theft & Social Engineering (F18)
Vulnerability exploited: PII hardcoded in API response
How the attack plays out:
- Attacker visits
https://redacted-api.vercel.app/api/razorpayPayment(no login needed) - Gets founder's full name, phone number (
XXXXXXXXXX), email, and city (Hyderabad) - Uses phone number to perform a SIM swap attack — calls the carrier pretending to be the founder, gets a new SIM issued
- With control of the phone number, resets passwords on email, banking, and Razorpay accounts
- Drains the Razorpay merchant account; accesses business email to send fake invoices to clients
🚨 Business losses:
- Direct financial theft from merchant/bank accounts
- Loss of control over business communications
- Reputational destruction — clients receive fraudulent messages from "your" email
- Legal liability under IT Act 2000 for failing to protect personal data
- Estimated damage: Rs 5-50 lakhs+ depending on account balances
2 Fraudulent Payments via Unauthenticated API (F21 + F19)
Vulnerabilities exploited: No authentication on payment API + Wildcard CORS
How the attack plays out:
- Attacker reads the public GitHub repo (F23) and understands the full payment flow
- Calls
/api/razorpayPayment?order_id=ATTACKER_ORDER— injects their own order ID into the Razorpay checkout - Since CORS is
*, the attacker builds a website that silently makes API calls to your backend from any visitor's browser - When Razorpay key is eventually set (F20), attacker uses it to create fake payment orders, initiate refunds, and enumerate transactions
- Attacker creates a fake storefront using your Razorpay credentials — customers pay the attacker thinking they're paying you
🚨 Business losses:
- Razorpay account suspended for fraud (they have zero tolerance)
- Chargebacks from fraudulent transactions — you pay the penalty fees
- RBI blacklisting if payment fraud is reported
- Loss of ability to process payments — business operations halt
- Legal action from defrauded customers
- Estimated damage: Rs 10 lakhs - Rs 1 crore+ depending on scale
3 Brand Destruction via Subdomain Takeover (F02 + F24)
Vulnerabilities exploited: Wildcard subdomain + 5 Linode servers + 12+ domains
How the attack plays out:
- Attacker discovers that
*.company-c.example.comresolves to Linode servers - If any of the 5 Linode servers is shut down or IP is released, attacker provisions a new Linode with that IP
- Attacker now controls
admin.company-c.example.com,payments.company-c.example.com,dashboard.company-c.example.com - Hosts a pornographic website or crypto scam on
payments.company-c.example.com - Since there's no HSTS on subdomains (F03), attacker can also intercept traffic via MITM
- Google indexes
login.company-c.example.comwith malicious content — your brand is now associated with malware
Even without server takeover: Attacker simply shares links like urgent-security-alert.company-c.example.com or free-cashback.company-c.example.com in phishing campaigns. These domains RESOLVE and show "Coming Soon" with your branding.
🚨 Business losses:
- Brand reputation destroyed — "company-c" associated with scams/adult content in Google results
- Loss of investor confidence (early stage startup — reputation is everything)
- Domain blacklisted by browser safe-browsing lists
- Takes 6-12 months to recover brand reputation
- Potential loss of the .in domain if CERT-In gets involved
- Estimated damage: Incalculable for an early-stage payments company
4 Customer Payment Theft via Clickjacking (F05 + F01)
Vulnerabilities exploited: Missing X-Frame-Options + Missing CSP
How the attack plays out (when payment forms go live):
- Attacker creates
win-free-iphone.comwith an invisible iframe loadingcompany-c.example.com - Victim visits the attacker's site, sees "Click here to claim your prize"
- The click actually hits the "Pay Now" or "Confirm Payment" button on your site
- Victim unknowingly authorizes a payment to the attacker
- Without CSP, attacker can also inject a keylogger script that captures every keystroke on your payment form
🚨 Business losses:
- Customer funds stolen — you are legally liable as the payment processor
- RBI enforcement action for inadequate security controls
- Loss of PCI-DSS certification eligibility
- Class action potential if multiple customers affected
- Estimated damage: Rs 5-25 lakhs per incident + regulatory fines
5 DDoS Taking Down Subdomain Infrastructure (F06 + F07)
Vulnerabilities exploited: No rate limiting on main domain and subdomain servers
How the attack plays out:
- Main site (Fastly CDN) is resilient to basic DDoS — but attacker discovers the 5 Linode servers have no CDN protection
- Attacker sends 10,000 requests/second to
api.company-c.example.com(directly hitting Linode IP10.0.3.2) - OpenResty on the Linode server crashes — ALL domains and subdomains on that server go down
- Since multiple domains share the same servers, one attack takes down 6+ services
- Attacker threatens to continue unless ransom is paid (common DDoS extortion)
Without DDoS — CDN cost attack: Attacker sends millions of requests with unique query strings (cache busting). Every request is a cache MISS. Your Fastly bill spikes from Rs 0 to Rs 5-10 lakhs in a single month.
🚨 Business losses:
- Website and all services offline for hours/days
- Fastly/Linode bandwidth overage charges
- Customer-facing downtime during critical periods
- Ransom demands (typically $500-$5000 in crypto)
- Estimated damage: Rs 1-10 lakhs per incident
6 Competitor/Attacker Reconnaissance via Information Leaks (F04 + F14 + F22 + F23 + F25)
Vulnerabilities exploited: Combined information disclosure across all components
How the attack plays out:
- Attacker knows your full tech stack: Frontend: React + Vite on Fastly CDN; Backend: Express.js on Vercel (Mumbai); Infrastructure: 5 Linode servers running OpenResty xxx.xxx.xxx.xxx; Payment: Razorpay integration; Source code: Public on GitHub
- Searches CVE databases for Express.js, OpenResty xxx.xxx.xxx.xxx, and Vercel-specific vulnerabilities
- Reads source code to find business logic flaws (e.g., price manipulation, race conditions in payment capture)
- Crafts targeted attacks that bypass generic WAF rules
- Maps your entire infrastructure for a coordinated multi-vector attack
🚨 Business losses:
- Dramatically reduces the attacker's effort — from weeks to minutes
- Increases success probability of every other attack scenario
- Competitor gains full technical intelligence on your product architecture
- Estimated damage: Force multiplier for all other attacks
7 Regulatory Shutdown (F16 + F18 + F19)
Vulnerabilities exploited: No privacy policy + PII exposure + insecure API
How the attack plays out:
- Security researcher or disgruntled user discovers PII leaking from API
- Files complaint with CERT-In (Indian Computer Emergency Response Team)
- CERT-In investigates, finds: No privacy policy (DPDPA violation), Personal data exposed without consent, No security measures on payment API (IT Act Section 43A), No PCI-DSS compliance
- CERT-In issues directive to fix within 6 hours (standard for critical vulnerabilities)
- RBI is notified — blocks PA/PG license application
- If DPDPA Data Protection Board gets involved: fines up to Rs 250 crore
🚨 Business losses:
- RBI PA/PG license denied — cannot legally process payments in India
- DPDPA fines: up to Rs 250 crore per violation
- CERT-In public advisory naming your company
- Investor due diligence red flag — funding rounds jeopardized
- Estimated damage: Rs 50 lakhs - Rs 250 crore (worst case regulatory)
8 Supply Chain Attack via Third-Party Dependencies (F13 + F01)
Vulnerabilities exploited: 25+ Google Font families + No CSP
How the attack plays out:
- Attacker compromises Google Fonts CDN (or performs DNS hijack of fonts.googleapis.com)
- Modified font file contains embedded CSS that exfiltrates data
- Without CSP, the browser happily loads and executes this
- Every visitor to company-c.example.com sends their session data, keystrokes, and form inputs to the attacker
- Since you load 25+ font families, the attack surface is enormous — any one of them could be the entry point
🚨 Business losses:
- Customer data breach at scale
- Extremely difficult to detect (looks like normal font loading)
- Breach notification required under DPDPA
- Estimated damage: Rs 10-50 lakhs + reputational
Impact Summary for Management
| Risk Category | Worst-Case Financial Impact | Likelihood (Current State) |
|---|---|---|
| Financial fraud (via unauthenticated API) | Rs 10 lakhs - Rs 1 crore | HIGH — endpoints are live and accessible now |
| Identity theft (founder PII exposed) | Rs 5-50 lakhs | HIGH — PII is accessible with a single URL visit |
| Regulatory fines (DPDPA, RBI, CERT-In) | Rs 50 lakhs - Rs 250 crore | MEDIUM — depends on complaint being filed |
| Brand destruction (subdomain takeover) | Incalculable for early-stage startup | MEDIUM — requires Linode server decommission |
| Service disruption (DDoS on Linode) | Rs 1-10 lakhs per incident | HIGH — servers have no protection |
| Customer data breach (when payment goes live) | Rs 10-50 lakhs + legal | HIGH — no CSP, no security headers |
| Competitive intelligence leak | Strategic disadvantage | CERTAIN — source code is public on GitHub |
Bottom line: The combination of an unauthenticated live payment API, exposed PII, wildcard CORS, and public source code creates an immediate and exploitable attack chain. An attacker with moderate skill could cause significant financial and reputational damage today, before the platform even officially launches.
🔒 3. CRITICAL: Discovered Backend API & Payment Infrastructure
3.1 Discovery Method
Analysis of the JavaScript bundle at redacted-ui.vercel.app/static/js/main.0b75b70c.js (referenced via GitHub repo dev-user-1/Company C-UI) revealed a hardcoded backend API URL:
https://redacted-api.vercel.app/api
This API server is LIVE, running Express.js on Vercel, and contains active payment processing endpoints with Razorpay integration.
[F18] CRITICAL PII Hardcoded in Live API Response (CVSS 9.1)
The endpoint GET /api/razorpayPayment returns an HTML page with a Razorpay checkout form containing hardcoded personal information:
| Data Type | Value Exposed | Risk |
|---|---|---|
| Full Name | Amit | Identity disclosure |
| Email Address | redacted-c@gmail.com | Spam, phishing, social engineering |
| Phone Number | XXXXXXXXXX | SIM swap attacks, social engineering, harassment |
| Physical Address | [Redacted City], India | Physical security risk |
This PII is returned to any unauthenticated request from any origin (CORS wildcard). It is visible to every user, bot, or scanner that hits this endpoint.
Remediation:
- Immediately remove hardcoded PII from API responses
- Use environment variables for configuration
- Never prefill personal data in server-rendered checkout pages
- Implement authentication before exposing any payment endpoints
[F19] CRITICAL Wildcard CORS (*) on Backend API (CVSS 8.6)
The API server responds with:
access-control-allow-origin: *
This means any website on the internet can make API calls to the payment backend. An attacker on evil.com can:
- Initiate payment flows on behalf of visitors
- Read API responses including PII
- Abuse payment endpoints from any origin
- Perform CSRF attacks without restriction
Remediation: Restrict CORS to specific allowed origins only (e.g., https://company-c.example.com).
[F20] CRITICAL Razorpay Key Undefined in Production (CVSS 8.2)
The Razorpay checkout options include:
"key" : "undefined"
This indicates the Razorpay API key environment variable is not set on the Vercel deployment. This means:
- The payment checkout will fail silently
- The key was likely in
.envlocally but not configured in Vercel environment - If the key WAS set, it would be exposed in every API response (client-side HTML)
Remediation:
- Set Razorpay keys via Vercel environment variables
- Never expose Razorpay secret key in client-facing responses
- Use server-side order creation, not client-side key exposure
[F21] CRITICAL Payment API — Zero Authentication (CVSS 9.4)
The following payment API endpoints are live and publicly accessible with zero authentication:
| Endpoint | Method | Status | Response |
|---|---|---|---|
/api/razorpayPayment | GET | 200 | Full Razorpay checkout HTML with PII |
/api/razorpayPayment?order_id=ANYTHING | GET | 200 | Checkout with attacker-supplied order_id |
/api/makepayment?payment_method=pm_card_visa | GET | 500 | FUNCTION_INVOCATION_FAILED (crashes) |
/api/makepayment?payment_method=pm_card_mastercard | GET | 500 | FUNCTION_INVOCATION_FAILED (crashes) |
/api/makeupipayment | GET | 500 | FUNCTION_INVOCATION_FAILED (crashes) |
/api/capturepayment | POST | 500 | FUNCTION_INVOCATION_FAILED (crashes) |
/api/paymentstatus | POST | 500 | FUNCTION_INVOCATION_FAILED (crashes) |
/api/upipaymentstatus | GET | 200 | {} (empty JSON) |
/api/verifyupipayment | POST (callback) | 404 | Not found |
/ (root) | GET | 200 | Hello World |
Critical issues:
- No authentication or API keys required to access any endpoint
- No rate limiting — 15 rapid requests all returned 200
- Order ID injection —
order_idparameter is directly injected into Razorpay checkout without validation - Payment method endpoints crash — indicating unhandled exceptions that could leak stack traces
- Server errors expose Vercel function IDs — e.g.,
REDACTED_FUNCTION_ID
[F22] MEDIUM Express Server Information Disclosure
The API server exposes:
x-powered-by: Express
This confirms the backend framework and helps attackers target Express-specific vulnerabilities.
Remediation: Add app.disable('x-powered-by'); or use Helmet.js middleware.
[F25] MEDIUM Error Messages Leak Internal Infrastructure
Server errors return:
A server error has occurred
FUNCTION_INVOCATION_FAILED
REDACTED_FUNCTION_ID
This reveals: Vercel serverless function architecture, deployment region (bom1 = Mumbai), and internal request IDs.
3.8 API Endpoint Map
├── / → "Hello World" (root)
├── /api/
│ ├── razorpayPayment → Razorpay UPI checkout (GET) ← LIVE WITH PII
│ ├── makepayment → Card payment initiation (GET, with ?payment_method=)
│ ├── makeupipayment → UPI payment initiation (GET)
│ ├── capturepayment → Payment capture (POST, with paymentid1/paymentid2)
│ ├── paymentstatus → Card payment status (POST, with paymentid1)
│ ├── upipaymentstatus → UPI payment status (GET)
│ └── verifyupipayment → Razorpay callback URL (POST)
[F23] MEDIUM GitHub Repository Exposes Frontend Source
Repository: github.com/redacted/redacted-ui
| Field | Value |
|---|---|
| Language | JavaScript |
| Framework | Create React App |
| Homepage | redacted-ui.vercel.app |
| Created | 2024-02-18 |
| Author | dev-user-1 |
The public repository exposes the complete frontend source code including API endpoint URLs, payment flow logic, and integration patterns.
🌐 4. CRITICAL: Full Domain Portfolio Discovery
[F24] HIGH Complete Domain Inventory (12+ Domains on 5 Linode Servers)
| Domain | IP Address | Server | Content | Status |
|---|---|---|---|---|
| company-c.example.com | 10.0.3.1 | Fastly CDN | React SPA (main site) | |
| company-c-alt1.example.com | 10.0.3.2 | OpenResty/xxx.xxx.xxx.xxx | "Coming Soon" | Placeholder |
| qr.company-c-alt1.example.com | 10.0.3.3 | OpenResty/xxx.xxx.xxx.xxx | "Coming Soon" | Placeholder |
| company-c-alt2.example.com | 10.0.3.3 | OpenResty/xxx.xxx.xxx.xxx | "Coming Soon" | Placeholder |
| company-c-dev.example.com | 10.0.3.5 | OpenResty/xxx.xxx.xxx.xxx | "Coming Soon" | Placeholder |
| company-c-app.example.com | 10.0.3.3 | OpenResty/xxx.xxx.xxx.xxx | "Coming Soon" | Placeholder |
| company-c-alt3.example.com | 10.0.3.3 | OpenResty/xxx.xxx.xxx.xxx | "Coming Soon" | Placeholder |
| company-c-alt4.example.com | 10.0.3.6 | OpenResty/xxx.xxx.xxx.xxx | "Coming Soon" | Placeholder |
| company-c-alt5.example.com | 10.0.3.6 | OpenResty/xxx.xxx.xxx.xxx | "Coming Soon" | Placeholder |
| company-c-alt6.example.com | 10.0.3.4 | OpenResty/xxx.xxx.xxx.xxx | "Coming Soon" | Placeholder |
| company-c-alt7.example.com | 10.0.3.7 | — | Parked (redirect to /lander) | Domain parking |
| company-c-alt8.example.com | 10.0.3.8 | — | Parked (redirect to /lander) | Domain parking |
| company-c-alt9.example.com | 10.0.3.7 | — | Parked (redirect to /lander) | Domain parking |
| company-c-alt10.example.com | 10.0.3.9 | OpenResty | 403 Forbidden | Blocked |
4.2 Vercel-Hosted Applications (Hidden Infrastructure)
| Application | URL | Technology | Status |
|---|---|---|---|
| Payment Frontend | redacted-ui.vercel.app | React (CRA) + Razorpay | LIVE |
| Backend API | redacted-api.vercel.app | Express.js | LIVE |
| Canva Marketing | company-cments.my.canva.site/main | Canva Sites | LIVE |
4.3 Linode Server Inventory (5 Servers)
| IP Address | Subdomains Hosted | Registered Domains | Software |
|---|---|---|---|
10.0.3.3 | mail, db, postgres, jenkins | company-c-alt3.example.com, company-c-alt2.example.com, company-c-app.example.com, qr.company-c-alt1.example.com | OpenResty/xxx.xxx.xxx.xxx |
10.0.3.4 | dashboard, ci, cd | company-c-alt6.example.com | OpenResty/xxx.xxx.xxx.xxx |
10.0.3.5 | test, internal, redis, mongo, grafana | company-c-dev.example.com | OpenResty/xxx.xxx.xxx.xxx |
10.0.3.2 | api, dev, beta, checkout, prometheus | company-c-alt1.example.com | OpenResty/xxx.xxx.xxx.xxx |
10.0.3.6 | admin, staging, payments | company-c-alt4.example.com, company-c-alt5.example.com | OpenResty/xxx.xxx.xxx.xxx |
4.4 OSINT: Company Intelligence
| Field | Detail |
|---|---|
| Company | Company C |
| Founder | Founder C |
| Background | CBDC Architect at Bank of England; ex-Cardano Foundation, VISA |
| Location | [Redacted City], India + London, UK |
| Team Size | 1-10 employees |
redacted-c@gmail.com | |
twitter.com/zapperombie | |
| WellFound | wellfound.com/company/redacted |
| Products | Split payments, Chat-to-Pay, AI fraud detection, Payment orchestration |
🖥 5. Target Architecture & Reconnaissance
5.1 Technology Stack
| Component | Main Domain (company-c.example.com) | Subdomains (*.company-c.example.com) |
|---|---|---|
| Web Server | Fastly (Varnish) | OpenResty/xxx.xxx.xxx.xxx (nginx) |
| Framework | React 18+ (Vite build) | Static HTML (server-generated) |
| IP Address | 10.0.3.1 (Fastly CDN) | 5 Linode IPs |
| Protocol | HTTP/2, HTTP/3 (h3) | HTTP/2 |
| SSL | Google Trust Services (WR3) | Auto-provisioned |
| HSTS | max-age=31556926 | max-age=0 (DISABLED) |
5.2 Subdomain IP Mapping (5 Linode Servers)
| IP Address | Subdomains Resolved |
|---|---|
10.0.3.3 | mail, db, postgres, jenkins |
10.0.3.4 | dashboard, ci, cd |
10.0.3.5 | test, internal, redis, mongo, grafana |
10.0.3.2 | api, dev, beta, checkout, prometheus |
10.0.3.6 | admin, staging, payments |
CRITICAL NOTE: Subdomains likedb,redis,mongo,postgres,jenkins,grafana,prometheusresolve to live servers. While they currently serve "Coming Soon" pages, the naming suggests these may eventually host sensitive infrastructure. Any of these names becoming active services without proper security is extremely high risk.
5.3 Application Architecture — Main Domain
- Single JS bundle:
/assets/index-BpBEC52j.js(~388KB minified) - Single CSS file:
/assets/index-M5wXO4nG.css - Client-side routing: Anchor-based (
#features,#how-it-works,#integrate,#contact,#early-access) - No backend API:
/api/premium-contentreference in JS returns SPA fallback - No forms: Zero
<form>elements on the page - No user input fields: No text inputs, no search, no login
- No cookies:
document.cookieis empty - No localStorage/sessionStorage: Both empty
- No iframes: None embedded
- External links: LinkedIn (
linkedin.com/company/redacted), mailto (redacted-c@gmail.com) - External reference:
qr.company-c-alt1.example.comdomain (not resolvable)
5.4 DNS Configuration
| Record | Value |
|---|---|
| A Record | 10.0.3.1 (Fastly) |
| Wildcard (*.company-c.example.com) | Round-robin to 5 Linode IPs |
| www.company-c.example.com | Connection refused (not configured) |
| HTTP -> HTTPS | 301 redirect via Varnish |
🔐 6. SSL/TLS Configuration Assessment
6.1 Certificate Details
| Field | Value |
|---|---|
| Subject CN | hynan.tavric.qzz.io (NOT company-c.example.com) |
| Issuer | Google Trust Services (WR3) |
| Valid From | 2026-03-19 19:48:15 UTC |
| Valid To | 2026-06-17 20:45:04 UTC (~90 day cert) |
| Type | DV (Domain Validation) — Shared Multi-SAN |
| SAN Count | 100+ domains (including company-c.example.com) |
6.2 Protocol & Cipher Suite Testing
| Test | Result | Verdict |
|---|---|---|
| SSLv3 | Disabled | |
| TLS 1.0 | Disabled | |
| TLS 1.1 | Disabled | |
| TLS 1.2 | Enabled (ECDHE-RSA-CHACHA20-POLY1305) | |
| TLS 1.3 | Enabled (TLS_AES_128_GCM_SHA256) | |
| NULL cipher (TLS 1.2) | Rejected | |
| EXPORT cipher (TLS 1.2) | Rejected | |
| DES cipher (TLS 1.2) | Rejected | |
| RC4 cipher (TLS 1.2) | Rejected | |
| MD5 cipher (TLS 1.2) | Rejected | |
| aNULL cipher (TLS 1.2) | Rejected | |
| eNULL cipher (TLS 1.2) | Rejected |
Note: Initial testing showed false positives for weak ciphers because TLS 1.3 negotiation ignores the-cipherflag. Re-testing with-tls1_2confirmed all weak cipher suites are properly rejected.
[F08] LOW Shared SSL Certificate (100+ SANs)
The certificate CN is hynan.tavric.qzz.io and lists 100+ unrelated domains as SANs. This reveals all co-hosted domains, enabling attacker reconnaissance.
Impact: Attacker can enumerate co-hosted sites, identify weaker targets on the same infrastructure, and potentially use shared-hosting vulnerabilities.
Remediation: Obtain a dedicated SSL certificate for company-c.example.com and *.company-c.example.com via Fastly's custom certificate or BYOC feature.
🛡 7. Security Headers Analysis
7.1 Complete Header Audit — Main Domain
| Header | Expected | Actual | Status |
|---|---|---|---|
Strict-Transport-Security | max-age=31536000; includeSubDomains | max-age=31556926 | — missing includeSubDomains |
Content-Security-Policy | Strict policy | NOT SET | |
X-Frame-Options | DENY | NOT SET | |
X-Content-Type-Options | nosniff | NOT SET | |
X-XSS-Protection | 0 (CSP preferred) | NOT SET | |
Referrer-Policy | strict-origin-when-cross-origin | NOT SET | |
Permissions-Policy | Restrictive | NOT SET | |
Cache-Control | Appropriate | max-age=3600 | |
Content-Type | With charset | text/html; charset=utf-8 | |
Set-Cookie (flags) | HttpOnly, Secure, SameSite | No cookies set |
[F01] HIGH Missing Content-Security-Policy (CSP)
No CSP header is configured on any response. Without CSP, if ANY XSS vulnerability is introduced in the future, there is zero browser-level mitigation.
Recommended CSP:
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' https://fonts.googleapis.com 'unsafe-inline'; font-src https://fonts.gstatic.com; img-src 'self' data:; connect-src 'self'; frame-ancestors 'none'; base-uri 'self'; form-action 'self'; upgrade-insecure-requests
[F05] MEDIUM Missing X-Frame-Options (Clickjacking)
Neither X-Frame-Options nor CSP frame-ancestors is set. The entire site can be embedded in an iframe on any domain.
Attack scenario (Clickjacking):
- Attacker creates
evil-site.comwith an invisible iframe pointing tocompany-c.example.com - Overlays fake UI elements on top
- User thinks they're clicking on the attacker's page but actually interacts with company-c.example.com
- When "Join Waitlist" or "Book a Demo" functionality becomes active, this could trick users into unintended actions
Remediation: Add X-Frame-Options: DENY and CSP frame-ancestors 'none' via Fastly VCL.
[F09] LOW Missing X-Content-Type-Options
Without nosniff, browsers may MIME-sniff responses and execute content as a different type than declared.
Remediation: X-Content-Type-Options: nosniff
[F10] LOW Missing Referrer-Policy
Full URLs leak via the Referer header to third-party resources (Google Fonts, LinkedIn).
Remediation: Referrer-Policy: strict-origin-when-cross-origin
[F11] LOW Missing Permissions-Policy
Browser features (camera, microphone, geolocation, payment API) are not restricted.
Remediation: Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(self)
💽 8. Injection Attack Testing (XSS, SQLi, Command Injection)
8.1 Cross-Site Scripting (XSS)
8.1.1 Reflected XSS — Main Domain
| # | Payload | HTTP Status | Reflected in HTML? | Vulnerable? |
|---|---|---|---|---|
| 1 | <script>alert(1)</script> | 200 | NO | |
| 2 | "><img src=x onerror=alert(1)> | 200 | NO | |
| 3 | javascript:alert(1) | 200 | NO | |
| 4 | {{7*7}} (SSTI) | 200 | NO | |
| 5 | VAPT_TEST_MARKER_12345 | 200 | NO |
Result: The main domain serves a completely static HTML file. No query parameters, no URL paths, no headers are reflected in the response body. XSS is not possible on the main domain in its current state.
8.1.2 Reflected XSS — Subdomains
| Test | Result |
|---|---|
Hostname reflected in <title>? | YES — <title>ANYTHING.company-c.example.com - Coming Soon</title> |
Hostname reflected in <h1>? | YES — <h1>ANYTHING.company-c.example.com</h1> |
| Can XSS payload be in hostname? | Limited — browsers restrict DNS characters, preventing <script> tags in hostnames |
| Host header injection? | Blocked — OpenResty returns 400 Bad Request for malformed Host headers |
Assessment: The OpenResty wildcard servers reflect the requested subdomain name directly into <h1> and <title> without sanitization. While direct exploitation via browser is limited by DNS character restrictions, this is a design weakness.
8.1.3 Stored XSS
Result: NOT APPLICABLE — No user input storage mechanism exists (no forms, no comments, no database).
8.1.4 DOM-Based XSS
Result: No dynamic URL parameter handling observed. The React SPA uses virtual DOM which inherently prevents most DOM XSS. LOW RISK.
8.2 SQL Injection (SQLi)
| # | Payload | HTTP Status | Response Size | Different from Normal? | Vulnerable? |
|---|---|---|---|---|---|
| 1 | ' OR '1'='1 | 200 | 2553 bytes | NO | |
| 2 | 1; DROP TABLE users-- | 200 | 2553 bytes | NO | |
| 3 | ' UNION SELECT NULL-- | 200 | 2553 bytes | NO | |
| 4 | 1 AND 1=1 | 200 | 2553 bytes | NO | |
| 5 | admin-- | 200 | 2553 bytes | NO | |
| 6 | 1 OR 1=1# | 200 | 2553 bytes | NO |
Result: SQL Injection is NOT POSSIBLE. Every payload returns the identical 2553-byte static HTML file. There is no database and no server-side query processing.
8.3 Command Injection (OS Command Injection)
| # | Payload | HTTP Status | Response Size | Vulnerable? |
|---|---|---|---|---|
| 1 | ; ls -la | 200 | 2553 bytes | |
| 2 | | cat /etc/passwd | 200 | 2553 bytes | |
| 3 | $(whoami) | 200 | 2553 bytes | |
| 4 | `id` | 200 | 2553 bytes | |
| 5 | ; ping -c 1 127.0.0.1 | 200 | 2553 bytes |
Result: Command injection is NOT POSSIBLE. No server-side processing of any parameters.
8.4 Server-Side Template Injection (SSTI)
Payloads {{7*7}}, ${7*7}, {{constructor.constructor('return this')()}} tested. NOT APPLICABLE — No template engine processing server-side.
📄 9. Content Injection & Defacement Testing
9.1 Can Anyone Inject Malicious Content on the Homepage?
| Test | Method | Result | Content Changed? |
|---|---|---|---|
| Parameter reflection | ?q=INJECTED_CONTENT | Static HTML returned | |
| HTML injection via params | ?q=<h1>HACKED</h1> | Not reflected | |
| PUT request with HTML body | PUT / -d '<html>DEFACED</html>' | HTTP 200 but content unchanged | |
| POST request with HTML body | POST / -d '<html>DEFACED</html>' | HTTP 200 but content unchanged | |
| Content verified after PUT/POST | GET / | Original HTML unchanged |
Verdict: It is NOT possible to inject content or deface the homepage via HTTP requests. The site is served from Fastly CDN as cached static files. The only ways to change content are: compromising the deployment pipeline, Fastly credentials, DNS hijacking, or subdomain abuse (see F02).
9.2 Defacement Risk via Subdomain Abuse
This is the most viable attack path for brand damage. Since *.company-c.example.com resolves to servers that display the subdomain name, an attacker who gains control of any of the 5 Linode servers could host malicious content on login.company-c.example.com, create phishing pages on secure-payment.company-c.example.com, or display inappropriate content under the company-c.example.com domain.
Risk Level: MEDIUM-HIGH (depends on server security)
⚡ 10. DDoS & Rate Limiting Assessment
10.1 Rate Limiting Tests — Main Domain (Fastly CDN)
| Test | Requests | Concurrent? | Results | Rate Limited? |
|---|---|---|---|---|
| Sequential burst | 20 | No | All 200 OK | |
| Concurrent burst | 50 | Yes | All 200 OK (100%) | |
| Large concurrent burst | 100 | Yes | All 200 OK (100%) | |
| Cache-busting burst | 100 | Yes (unique query strings) | All 200 OK |
Response times under 100-request burst:
| Request | Response Time |
|---|---|
| 1 | 0.278s |
| 2 | 0.381s |
| 3 | 0.277s |
| 4 | 0.926s |
| 5 | 0.226s |
Subdomain Servers (Linode/OpenResty)
| Test | Requests | Results | Rate Limited? |
|---|---|---|---|
Concurrent burst on api.company-c.example.com | 30 | All 200 OK |
[F06] MEDIUM No Rate Limiting — Main Domain
| Attack Type | Feasibility | Details |
|---|---|---|
| Volumetric DDoS | LOW | Fastly CDN absorbs traffic across global PoPs; would require massive botnet |
| Application-layer DDoS | MEDIUM | No rate limiting means all requests are served; cache-busting forces origin fetches |
| Slowloris / Slow Read | LOW | Fastly/Varnish handles connection management well |
| CDN cost amplification | MEDIUM | Continuous cache-miss requests could increase Fastly billing |
[F07] MEDIUM No Rate Limiting — Subdomain Servers
| Attack Type | Feasibility | Details |
|---|---|---|
| HTTP flood on Linode | HIGH | Bare VPS instances, not behind CDN. Direct IP access. No rate limiting. |
| Connection exhaustion | HIGH | OpenResty default config may not have connection limits |
| Bandwidth exhaustion | MEDIUM | Linode servers have bandwidth limits; sustained traffic could exhaust them |
Remediation:
- Main domain: Enable Fastly Edge Rate Limiting (e.g., 1000 req/min per IP)
- Subdomains: Add nginx
limit_req_zonein OpenResty config. Place behind Cloudflare or similar WAF - All endpoints: Implement progressive rate limiting when APIs go live
🌐 11. Subdomain Security & Takeover Testing
[F02] HIGH Wildcard Subdomain with Hostname Reflection
Discovery: ALL *.company-c.example.com subdomains resolve and serve content. The subdomain name is dynamically injected into the HTML response:
Request: https://anything-you-want.company-c.example.com/
Response: <title>anything-you-want.company-c.example.com - Coming Soon</title>
<h1>anything-you-want.company-c.example.com</h1>
Attack scenarios:
- Phishing:
secure-payment.company-c.example.com,login.company-c.example.com,verify-account.company-c.example.com— all resolve and look semi-legitimate - Social engineering: Attacker sends link to
urgent-security-alert.company-c.example.com - Cookie scope attacks: If
company-c.example.comsets cookies on.company-c.example.com, any subdomain can read/modify them - SEO poisoning: Spammers could create backlinks to
buy-cheap-xyz.company-c.example.com
11.2 Subdomain Takeover Risk
| Subdomain | IP | Server | Takeover Risk |
|---|---|---|---|
db.company-c.example.com | 10.0.3.3 | OpenResty | HIGH if server decommissioned |
jenkins.company-c.example.com | 10.0.3.3 | OpenResty | HIGH if server decommissioned |
grafana.company-c.example.com | 10.0.3.5 | OpenResty | HIGH if server decommissioned |
prometheus.company-c.example.com | 10.0.3.2 | OpenResty | HIGH if server decommissioned |
redis.company-c.example.com | 10.0.3.5 | OpenResty | HIGH if server decommissioned |
If any of these 5 Linode VPS instances is shut down without removing DNS, a Linode customer could potentially claim that IP address and serve content under *.company-c.example.com.
[F03] HIGH Subdomain HSTS Disabled (max-age=0)
| Component | HSTS Value | Meaning |
|---|---|---|
| Main domain | max-age=31556926 | HSTS enabled for ~1 year |
| All subdomains | max-age=0 | HSTS effectively DISABLED |
Impact: Subdomain traffic can be intercepted via MITM on untrusted networks. SSL stripping attacks possible. Main domain HSTS doesn't protect subdomains (missing includeSubDomains directive).
Remediation: Set max-age=31536000; includeSubDomains; preload on ALL responses.
[F04] MEDIUM OpenResty Version Disclosure
All subdomain servers respond with: Server: openresty/xxx.xxx.xxx.xxx
Impact: Attacker knows the exact software version, enabling targeted exploit research.
Remediation: Set server_tokens off; in OpenResty config, or use more_clear_headers 'Server';
🔌 12. Host Header & Cache Poisoning Attacks
| Test | Target | Result | Vulnerable? |
|---|---|---|---|
Host: evil.com | Main domain | HTTP 404 (Fastly rejects unknown host) | |
X-Forwarded-Host: evil.com | Main domain | HTTP 200, no change in content | |
X-Forwarded-Proto: http | Main domain | HTTP 200, no change | |
X-Original-URL: /admin | Main domain | HTTP 200, no change | |
X-Rewrite-URL: /admin | Main domain | HTTP 200, no change | |
Host: <script> injection | Subdomains | HTTP 400 Bad Request (OpenResty blocks) | |
| HTTP Request Smuggling probe | Main domain | HTTP 200, no anomaly |
Result: Host header injection and cache poisoning are NOT exploitable. Fastly properly validates the Host header and returns 404 for unrecognized domains. OpenResty blocks malformed Host headers.
📁 13. File & Directory Enumeration
13.1 Main Domain — Sensitive Path Scanning (27 paths tested)
| Path | HTTP Status | Actual Content | Sensitive Data? |
|---|---|---|---|
/.env | 200 | SPA HTML (2553 bytes) | |
/.git/HEAD | 200 | SPA HTML (2553 bytes) | |
/admin | 200 | SPA HTML (2553 bytes) | |
/login | 200 | SPA HTML (2553 bytes) | |
/signup | 200 | SPA HTML (2553 bytes) | |
/api | 200 | SPA HTML (2553 bytes) | |
/api/v1 | 200 | SPA HTML (2553 bytes) | |
/dashboard | 200 | SPA HTML (2553 bytes) | |
/.well-known/security.txt | 200 | SPA HTML (2553 bytes) | |
/wp-admin | 200 | SPA HTML (2553 bytes) | |
/wp-login.php | 200 | SPA HTML (2553 bytes) | |
/.htaccess | 200 | SPA HTML (2553 bytes) | |
/server-status | 200 | SPA HTML (2553 bytes) | |
/phpinfo.php | 200 | SPA HTML (2553 bytes) | |
/config.json | 200 | SPA HTML (2553 bytes) | |
/package.json | 200 | SPA HTML (2553 bytes) | |
/.gitignore | 200 | SPA HTML (2553 bytes) | |
/manifest.json | 200 | SPA HTML (2553 bytes) | |
/.DS_Store | 200 | SPA HTML (2553 bytes) | |
/backup.zip | 200 | SPA HTML (2553 bytes) | |
/db.sql | 200 | SPA HTML (2553 bytes) | |
/debug | 200 | SPA HTML (2553 bytes) | |
/console | 200 | SPA HTML (2553 bytes) | |
/graphql | 200 | SPA HTML (2553 bytes) | |
/swagger | 200 | SPA HTML (2553 bytes) | |
/api-docs | 200 | SPA HTML (2553 bytes) |
ALL paths return the identical 2553-byte SPA HTML. This confirms the Fastly CDN serves a catch-all response — no sensitive files are exposed.
13.2 Subdomain Servers — Path Scanning
| Path | HTTP Status | Content | Notes |
|---|---|---|---|
api.company-c.example.com/.env | 200 | Empty response (0 bytes) | Interesting — different behavior than root |
api.company-c.example.com/admin | 200 | Coming Soon page | Catch-all |
api.company-c.example.com/nginx-status | 200 | Coming Soon page | Catch-all |
api.company-c.example.com/server-status | 200 | Empty response (0 bytes) | Different behavior |
api.company-c.example.com/status | 200 | Coming Soon page | Catch-all |
Note:/.envand/server-statusreturn empty 0-byte responses on subdomain servers, unlike other paths. This warrants further investigation if these subdomains become active.
13.3 Source Code Exposure
| Check | Result |
|---|---|
Source map (index-BpBEC52j.js.map) | Returns SPA HTML (not actual map) — |
CSS source map (index-M5wXO4nG.css.map) | Returns SPA HTML (not actual map) — |
Environment variables in JS (VITE_*, REACT_APP_*) | None found — |
| API keys / secrets in JS bundle | None found — |
| Hardcoded tokens in JS bundle | None found — |
🔗 14. SSRF, LFI, RFI Testing
14.1 Server-Side Request Forgery (SSRF)
| # | Payload | HTTP Status | Response Size | SSRF Triggered? |
|---|---|---|---|---|
| 1 | ?url=http://xxx.xxx.xxx.xxx/latest/meta-data/ (AWS metadata) | 200 | 2553 bytes | |
| 2 | ?url=http://localhost:8080 | 200 | 2553 bytes | |
| 3 | ?url=file:///etc/passwd | 200 | 2553 bytes |
Result: SSRF is NOT POSSIBLE. All responses are the static SPA. No server-side URL fetching occurs.
14.2 Local File Inclusion (LFI)
| # | Payload | HTTP Status | Response Size | LFI Triggered? |
|---|---|---|---|---|
| 1 | ../../../../etc/passwd | 200 | 2553 bytes | |
| 2 | ....//....//....//etc/passwd | 307 | 62 bytes (redirect) | |
| 3 | %00 (null byte) | 200 | 2553 bytes | |
| 4 | ..%252f..%252f..%252fetc/passwd (double encoding) | 200 | 2553 bytes |
Result: LFI is NOT POSSIBLE. Static CDN serving, no file inclusion mechanism.
14.3 Remote File Inclusion (RFI)
?page=http://evil.com/shell.php — HTTP 200, static SPA (2553 bytes) — NOT VULNERABLE.
🔀 15. CORS & Cross-Origin Testing
| Test | Request | Response Headers | Result |
|---|---|---|---|
| Cross-origin GET | Origin: https://evil.com | No Access-Control-* headers | No CORS policy |
| Preflight OPTIONS | Origin: evil.com + Access-Control-Request-Method: POST | No Access-Control-* headers | No CORS policy |
Result: No CORS headers are returned on the main domain. This is acceptable for a static site with no API endpoints. The browser's same-origin policy provides sufficient protection.
Future concern: When APIs are added, CORS must be configured carefully. A permissive Access-Control-Allow-Origin: * on payment APIs would be catastrophic.
🔑 16. Session & Authentication Analysis
16.1 Current State
| Check | Result |
|---|---|
| Cookies set | None |
| Session tokens | None |
| JWT tokens | None |
| CSRF tokens | None |
| localStorage data | Empty |
| sessionStorage data | Empty |
| Authentication endpoints | None exist |
| Login/signup forms | None exist |
Result: No session management or authentication exists on the current site. This entire attack surface is NOT APPLICABLE currently.
16.2 Pre-Launch Recommendations
When authentication is implemented:
- Use HttpOnly, Secure, SameSite=Strict cookies for session tokens
- Implement CSRF protection on all state-changing endpoints
- Use strong password hashing (bcrypt/argon2)
- Implement account lockout after failed attempts
- Add MFA for admin/dashboard access
- Session timeout after inactivity
- Secure token rotation on privilege escalation
🔃 17. Open Redirect Testing
| Parameter | Payload | HTTP Status | Redirected? | Vulnerable? |
|---|---|---|---|---|
?url= | https://evil.com | 200 | ||
?redirect= | https://evil.com | 200 | ||
?next= | https://evil.com | 200 | ||
?return= | https://evil.com | 200 | ||
?returnTo= | https://evil.com | 200 | ||
?redirect_uri= | https://evil.com | 200 | ||
?continue= | https://evil.com | 200 | ||
?dest= | https://evil.com | 200 | ||
?go= | https://evil.com | 200 | ||
//evil.com (path-based) | Path traversal redirect | 307 | To https://company-c.example.com/evil.com | (safe redirect) |
Result: No open redirect vulnerabilities found. All parameter-based tests return the static SPA.
🔧 18. HTTP Method Abuse Testing
| HTTP Method | Status Code | Behavior | Security Concern |
|---|---|---|---|
| GET | 200 | Normal response | None |
| POST | 200 | Same static HTML | None (currently) |
| PUT | 200 | Same static HTML, content unchanged | Content not modified |
| DELETE | 200 | Same static HTML, content unchanged | Content not deleted |
| PATCH | 200 | Same static HTML | None |
| OPTIONS | 200 | Same static HTML (no Allow header) | Should return proper OPTIONS response |
| TRACE | 200 | Same static HTML | — XST attacks |
[F12] LOW SPA Catch-All Returns 200 + TRACE Enabled
TRACE method returns 200 instead of 405 Method Not Allowed. While the current response doesn't echo the request (mitigating Cross-Site Tracing), TRACE should be disabled as a defense-in-depth measure.
Additionally: All paths returning 200 means security scanners cannot distinguish real endpoints from non-existent ones.
Remediation:
- Block TRACE method:
if (req.method == "TRACE") { return(synth(405, "Method Not Allowed")); } - Return 404 for undefined routes (serve SPA only for
/and/assets/*)
🔍 19. Information Disclosure & OSINT
[F14] INFO CDN Infrastructure Headers
| Header | Value | Information Leaked |
|---|---|---|
x-served-by | cache-ccu830059-CCU | Fastly PoP identifier (CCU = Kolkata) |
x-cache | MISS / HIT | Cache status reveals caching behavior |
x-cache-hits | 0 | Hit count helps understand traffic patterns |
x-timer | S1774124909.980243,VS0,VE247 | Internal timing (VE247 = 247ms origin fetch) |
Server (subdomains) | openresty/xxx.xxx.xxx.xxx | Exact software version |
[F15] INFO Business Email Uses Gmail
Contact email redacted-c@gmail.com is used for "Book a Demo" CTA and footer contact link.
Concerns:
- No SPF/DKIM/DMARC enforcement on receiving side
- Gmail lacks enterprise audit trails
- Customers expect domain-based email from a payment company
- Social engineering risk — easier to impersonate
[F17] INFO No security.txt or robots.txt
Neither file exists (both return SPA HTML).
security.txt (RFC 9116) should provide security contact info for responsible disclosure.
robots.txt should guide search engine crawling.
19.4 JS Bundle Intelligence
| Item Found | Detail | Risk |
|---|---|---|
| LinkedIn page | linkedin.com/company/redacted | Public — informational only |
| QR domain | qr.company-c-alt1.example.com | Not resolvable — likely future service |
| API reference | /api/premium-content | Placeholder — not a real endpoint |
| Sample tokens in code | tok_hdfc, user@upi, ORD-4829 | Example data only — not real credentials |
[F13] LOW Excessive Google Fonts (25+ families)
The site loads 25+ Google Font families, creating unnecessary third-party dependencies, tracking exposure, and a supply chain attack surface.
Remediation: Audit and self-host only the required fonts.
⚖ 20. Compliance & Regulatory Gaps
[F16] INFO Privacy Policy & Terms Not Implemented
Footer links "Privacy" and "Terms" both point to href="#" (non-functional).
Regulatory Requirements for Indian Payment Companies:
| Regulation | Requirement | Current Status |
|---|---|---|
| IT Act 2000, Section 43A | Reasonable security practices for sensitive data | — no privacy policy |
| RBI PA/PG Guidelines (2020) | Privacy policy mandatory for payment aggregators | |
| DPDPA 2023 | Consent notice, data processing transparency | |
| PCI-DSS | Privacy policy required for card data handling | |
| RBI Data Localization | Payment data must be stored in India | currently |
20.2 Pre-Launch Compliance Checklist
- Draft and publish Privacy Policy (DPDPA compliant)
- Draft and publish Terms of Service
- Obtain PCI-DSS certification before handling card data
- Apply for RBI PA/PG license
- Implement data localization (India-only storage)
- Set up breach notification process
- Appoint Data Protection Officer (DPO) if required
- Cookie consent mechanism (when cookies are used)
✅ 21. Positive Findings (What's Good)
| # | Check | Status | Details |
|---|---|---|---|
| 1 | HTTPS enforced | HTTP 301 redirects to HTTPS | |
| 2 | HSTS on main domain | max-age=31556926 (~1 year) | |
| 3 | TLS 1.0/1.1 disabled | Only TLS 1.2 + 1.3 | |
| 4 | SSLv3 disabled | Not supported | |
| 5 | Strong cipher suites | ECDHE-RSA-CHACHA20-POLY1305 (TLS 1.2), AES-128-GCM (TLS 1.3) | |
| 6 | All weak ciphers rejected | NULL, EXPORT, DES, RC4, MD5, aNULL, eNULL all rejected | |
| 7 | No sensitive files exposed | SPA catch-all prevents file access | |
| 8 | No API keys in JS bundle | No hardcoded secrets found | |
| 9 | No source maps exposed | .map files return SPA HTML | |
| 10 | No client-side storage abuse | No cookies, localStorage, or sessionStorage | |
| 11 | HTTP/3 support | Modern protocol via alt-svc | |
| 12 | No mixed content | All resources served over HTTPS | |
| 13 | No SQL injection | No database/backend interaction | |
| 14 | No XSS (main domain) | No input reflection | |
| 15 | No command injection | No server-side processing | |
| 16 | No SSRF/LFI/RFI | Static CDN serving | |
| 17 | No open redirects | No redirect mechanisms | |
| 18 | Host header injection blocked | Fastly returns 404, OpenResty returns 400 | |
| 19 | No cache poisoning | X-Forwarded headers don't affect response | |
| 20 | Content cannot be modified via HTTP | PUT/POST don't alter served content | |
| 21 | React virtual DOM | Inherent XSS protection via framework |
📈 22. Risk Matrix & Prioritized Remediation
P0 — Fix IMMEDIATELY (Today)
| Finding | Action | Effort |
|---|---|---|
| F18 PII in API response | Remove hardcoded name, phone, email, address from API immediately | 30 min |
| F19 Wildcard CORS on API | Restrict access-control-allow-origin to specific domains | 30 min |
| F21 Unauthenticated payment API | Add authentication middleware to all /api/* endpoints | 2-4 hours |
| F20 Razorpay key undefined | Set environment variables properly in Vercel; never expose key client-side | 30 min |
| F23 Public GitHub repo | Make repo private or remove sensitive API URLs | 15 min |
P0.5 — Fix Within 48 Hours
| Finding | Action | Effort |
|---|---|---|
| F01 Missing CSP | Add Content-Security-Policy header via Fastly VCL or hosting config | 1 hour |
| F02 Wildcard subdomain | Remove wildcard DNS; define only needed subdomains explicitly | 30 min |
| F03 Subdomain HSTS disabled | Set max-age=31536000; includeSubDomains; preload on all servers | 1 hour |
| F24 12+ domains on Linode | Audit all domains; decommission unused; secure active ones | 2-4 hours |
| F16 No Privacy/Terms pages | Draft and publish legal pages (regulatory requirement) | 1-2 days |
| F25 API error message leaks | Add proper error handling with generic error responses | 1 hour |
P1 — Fix Within 1 Week
| Finding | Action | Effort |
|---|---|---|
| F04 OpenResty version disclosure | Set server_tokens off; in nginx/OpenResty config | 15 min |
| F05 No X-Frame-Options | Add X-Frame-Options: DENY header | 15 min |
| F06 No rate limiting (main) | Enable Fastly Edge Rate Limiting | 2 hours |
| F07 No rate limiting (subdomains) | Add limit_req_zone in OpenResty config | 1 hour |
| F15 Gmail for business | Set up @company-c.example.com email with SPF/DKIM/DMARC | 2 hours |
P2 — Fix Within 30 Days
| Finding | Action | Effort |
|---|---|---|
| F08 Shared SSL cert | Obtain dedicated certificate | 1 hour |
| F09 No X-Content-Type-Options | Add nosniff header | 15 min |
| F10 No Referrer-Policy | Add strict-origin-when-cross-origin header | 15 min |
| F11 No Permissions-Policy | Add restrictive Permissions-Policy | 15 min |
| F12 TRACE enabled / catch-all 200 | Block TRACE, return proper 404s | 1 hour |
| F13 Excessive fonts | Audit and self-host required fonts only | 2 hours |
P3 — Nice to Have
| Finding | Action | Effort |
|---|---|---|
| F14 CDN info disclosure | Strip x-served-by, x-timer, x-cache-hits headers | 30 min |
| F17 No security.txt/robots.txt | Add both files | 30 min |
HSTS includeSubDomains on main | Add directive to main domain HSTS | 15 min |
| HSTS preload | Submit to HSTS preload list after fixes | 15 min |
www.company-c.example.com not working | Configure www subdomain redirect | 30 min |
🛠 23. Methodology & Tools
23.1 Testing Phases
| Phase | Description | Tools/Methods |
|---|---|---|
| Reconnaissance | Technology fingerprinting, DNS resolution, HTTP header analysis | cURL, Python socket, WebFetch |
| SSL/TLS Assessment | Protocol enumeration, cipher suite testing, certificate analysis | OpenSSL s_client |
| Security Headers | Complete header audit against OWASP recommendations | cURL header inspection |
| XSS Testing | Reflected, stored, DOM-based XSS with 5+ payloads | cURL with encoded payloads |
| SQL Injection | 6 SQLi payloads including UNION, boolean, error-based | Python + cURL |
| Command Injection | 5 OS command injection payloads | Python + cURL |
| Content Injection | HTML injection, parameter reflection, PUT/POST body modification | cURL |
| DDoS Testing | Sequential (20), concurrent (50, 100) request bursts with timing | Bash parallel cURL |
| Rate Limiting | Main domain + subdomain burst testing | Bash parallel cURL |
| Directory Enumeration | 27 sensitive paths on main domain, 5 paths on subdomains | cURL status code analysis |
| Subdomain Enumeration | 20 subdomains tested, IP mapping, content analysis | Python socket, cURL |
| Subdomain Takeover | Dangling CNAME check, IP ownership analysis, content reflection | Python DNS, cURL |
| Host Header Injection | 5 header manipulation techniques tested | cURL with custom headers |
| Cache Poisoning | X-Forwarded-Host, X-Forwarded-Proto, X-Original-URL, X-Rewrite-URL | cURL |
| SSRF | AWS metadata, localhost, file protocol | cURL with encoded payloads |
| LFI/RFI | Path traversal, double encoding, null byte, remote include | cURL |
| CORS | Cross-origin GET + OPTIONS preflight with malicious Origin | cURL |
| Open Redirect | 9 parameter names + path-based redirect | cURL |
| HTTP Methods | 7 methods tested (GET/POST/PUT/DELETE/PATCH/OPTIONS/TRACE) | cURL |
| Application Analysis | JS bundle analysis (388KB), DOM inspection, client-side storage audit | Chrome DevTools, JavaScript execution |
| Cipher Testing | 7 weak cipher suites tested on TLS 1.2 | OpenSSL s_client |
| SSTI | Template injection payloads (Jinja2, Twig patterns) | cURL |
23.2 Total Tests Executed
| Category | Count |
|---|---|
| XSS payloads | 5 |
| SQLi payloads | 6 |
| Command injection payloads | 5 |
| SSRF payloads | 3 |
| LFI payloads | 4 |
| RFI payloads | 1 |
| Open redirect tests | 11 |
| Directory/file paths | 32 |
| Subdomain enumeration | 20 |
| HTTP method tests | 7 |
| Rate limiting requests | 200+ |
| Cipher suite tests | 7 |
| Header injection tests | 6 |
| Content injection tests | 4 |
| Cookie/session checks | 6 |
| TOTAL | 300+ |
📜 24. Disclaimer
This assessment was performed as an external black-box penetration test with documented consent from management and the security team. The scope was limited to the publicly accessible company-c.example.com domain and all discovered subdomains.
Limitations
- No access to source code, server configurations, or internal networks
- No access to Fastly, Linode, or deployment pipeline configurations
- The site is in pre-launch state — most application-layer tests (auth, payment, API) are not yet applicable
- Rate limiting tests were limited to avoid service disruption
- No social engineering or physical security testing performed
Recommendation
A comprehensive grey-box or white-box assessment is strongly recommended before the platform processes any real payments or user data. This should include:
- Source code review
- Infrastructure configuration audit (Fastly VCL, OpenResty configs, Linode firewall rules)
- CI/CD pipeline security review
- API security testing (when endpoints are live)
- PCI-DSS gap assessment