- Add contact form dialog with HTMX integration (hx-post) - Implement browser-only access middleware (blocks curl/Postman/wget) - Add rate limiting (5 requests/hour per IP) for contact endpoint - Implement honeypot and timing-based bot detection - Add input validation (email format, message length 10-5000 chars) - Create contact button in desktop and mobile navigation (last position) Security features: - Browser-only middleware validates User-Agent, Referer/Origin, HX-Request headers - Honeypot field returns fake success to fool bots while logging spam - Timing validation rejects forms submitted < 2 seconds - All security events logged for monitoring Documentation: - docs/SECURITY.md - Comprehensive security documentation - docs/HACK-CHALLENGE.md - "Try to Hack Me!" challenge for security researchers - docs/SECURITY-AUDIT-REPORT.md - Full security audit report - docs/CONTACT-FORM-QUICKSTART.md - Integration guide Form fields: email (required), name, company, subject, message (required)
18 KiB
Try to Hack Me! 🎯
Challenge Site: https://juan.andres.morenorub.io/ Status: ACTIVE Difficulty: ⭐⭐⭐ (Medium to Hard)
🎮 Welcome, Security Researcher!
This CV portfolio site is intentionally opening its doors to security researchers, ethical hackers, and curious developers. I believe the best way to prove security isn't through claims, but through real-world testing.
Why This Challenge?
As a developer who values security, I've implemented defense-in-depth protection across this application. Rather than just documenting these controls, I'm inviting you to test them yourself.
This is a showcase of:
- Production-grade security implementation
- Real-world attack prevention
- Transparent security practices
- Confidence in my code
Your mission (if you choose to accept it): Find vulnerabilities, bypass security controls, or break the application in creative ways.
🎯 Challenge Categories
Category 1: Browser-Only Challenge ⭐⭐⭐
Objective: Submit a contact form message using anything except a web browser.
What's Protected:
- The contact form at
/api/contactONLY accepts browser requests - All automation tools are blocked: curl, wget, Postman, HTTPie, Python requests, etc.
Your Goal:
- Successfully submit a contact form using curl, Postman, or any HTTP client
- OR bypass browser-only validation with a crafted request
Difficulty: Hard
Why This Matters: Browser-only access prevents 95%+ of automated attacks. Can you join the 5% who bypass it?
Hints:
- What headers does a browser send that curl doesn't?
- Can you perfectly impersonate a browser?
- Is there a race condition in the validation?
Category 2: Rate Limit Bypass ⭐⭐
Objective: Exceed the rate limits without getting blocked.
What's Protected:
- Contact form: 5 requests per hour per IP
- PDF export: 3 requests per minute per IP
Your Goal:
- Submit more than 5 contact forms in 1 hour from a single IP
- Generate more than 3 PDFs in 1 minute from a single IP
- OR find a way to reset the rate limiter
Difficulty: Medium
Why This Matters: Rate limiting prevents spam and resource exhaustion. Can you find the loophole?
Hints:
- How does the server identify your IP?
- Can you make the server think you're multiple clients?
- Is the rate limiter stateless or stateful?
Category 3: Injection Challenge ⭐⭐⭐
Objective: Execute code or commands on the server.
What's Protected:
- Email header injection prevention
- XSS protection (HTML escaping)
- Command injection prevention (no shell commands)
- SQL injection (N/A - no database)
Your Goal:
- Inject email headers (Bcc, Cc, Content-Type)
- Execute JavaScript via XSS
- Run shell commands via command injection
- OR find any other injection vulnerability
Difficulty: Hard
Why This Matters: Injection attacks are the #1 web security threat. Can you find a gap in our input validation?
Hints:
- What characters are allowed in each field?
- How is user input sanitized?
- Are there any differences between client and server validation?
Category 4: Bot Detection Bypass ⭐⭐
Objective: Submit a contact form as a bot without getting detected.
What's Protected:
- Honeypot field (hidden from humans, visible to bots)
- Timing validation (must take at least 2 seconds)
- Server-side timestamp verification
Your Goal:
- Submit a form with the honeypot filled (bot behavior)
- Submit a form in less than 2 seconds
- OR bypass timing validation without waiting
Difficulty: Medium
Why This Matters: Bot detection prevents spam and automated abuse. Are you smarter than the bot detector?
Hints:
- Where is the timestamp set?
- Can you manipulate the timestamp?
- Is there a way to predict valid honeypot values?
Category 5: CSRF Challenge ⭐⭐⭐
Objective: Submit a valid CSRF-protected request from an external site.
What's Protected:
- CSRF tokens (32-byte cryptographically secure)
- Token expiration (24 hours)
- Constant-time comparison (timing attack resistant)
Your Goal:
- Submit a contact form without a valid CSRF token
- Reuse an expired CSRF token
- Predict or forge a CSRF token
- OR exploit a timing attack in token comparison
Difficulty: Hard
Why This Matters: CSRF allows attackers to perform actions on behalf of users. Can you break the token system?
Hints:
- How are tokens generated?
- Where are tokens stored?
- Are tokens predictable or brute-forceable?
Category 6: Denial of Service ⭐
Objective: Make the site unavailable to legitimate users.
What's Protected:
- Rate limiting (5 contact forms/hour, 3 PDFs/minute)
- Origin validation (prevents external hotlinking)
- Resource limits (request timeouts, connection limits)
Your Goal:
- Exhaust server resources (CPU, memory, connections)
- Trigger a crash or panic
- Make the site unresponsive to legitimate users
- OR find a resource leak
Difficulty: Easy to Medium
Why This Matters: DoS attacks can take down services. How robust is this application?
Hints:
- Which endpoints are most resource-intensive?
- Are there any unbounded operations?
- Can you trigger a memory leak?
🏆 Bonus Challenges
Bonus 1: Data Extraction ⭐⭐⭐
Objective: Extract sensitive data from the server.
Examples:
- Environment variables
- Server file paths
- Configuration details
- Email addresses or contact form submissions
Difficulty: Hard
Bonus 2: Privilege Escalation ⭐⭐⭐⭐
Objective: Gain unauthorized access or elevated privileges.
Examples:
- Access admin endpoints (if they exist)
- Modify application configuration
- Execute arbitrary code
- Read/write files outside the web root
Difficulty: Very Hard
Bonus 3: Creative Attack ⭐-⭐⭐⭐⭐
Objective: Surprise me with something I didn't think of!
Examples:
- Novel attack vectors
- Chained exploits
- Social engineering combined with technical attacks
- Zero-day vulnerabilities in dependencies
Difficulty: Variable
Why This Matters: The best vulnerabilities are the ones nobody thought to test for.
📋 Rules of Engagement
✅ What's Allowed
- Automated scanning - Use OWASP ZAP, Burp Suite, Nikto, etc.
- Fuzzing - Test all inputs with unexpected data
- Load testing - Test rate limits and resource exhaustion
- Source code review - The code is open source
- Social engineering - Email me attack vectors (no actual exploitation)
- Creative thinking - Try anything not explicitly forbidden
❌ What's NOT Allowed
- Physical attacks - Don't attack the server infrastructure
- Social engineering end users - Don't phish my site visitors
- Destructive attacks - Don't delete data or destroy the site
- Third-party attacks - Don't attack my hosting provider or CDN
- Illegal activity - Follow all applicable laws
- Spam - Don't send actual spam through the contact form
🤝 Good Faith
This challenge operates on good faith:
- Test the security controls, not the infrastructure
- Report findings before exploiting them maliciously
- Don't cause harm to the site or its visitors
- Respect the responsible disclosure process
If you're unsure if something is allowed, ask first!
🎁 What You Get
Recognition
Hall of Fame: Valid findings will be acknowledged in the project repository (with your permission).
Categories:
- 🥇 Critical Findings - Remote code execution, data breaches, authentication bypass
- 🥈 High Severity - CSRF bypass, XSS, injection attacks, sensitive data exposure
- 🥉 Medium Severity - Rate limit bypass, DoS vulnerabilities, information disclosure
- 📝 Low Severity / Informational - Security improvements, best practice violations
What Qualifies as a Valid Finding?
Valid:
- ✅ Actual security vulnerabilities (reproducible)
- ✅ Bypasses of implemented security controls
- ✅ Data leakage or information disclosure
- ✅ Denial of Service (reproducible, not infrastructure-level)
- ✅ Novel attack vectors I haven't considered
Invalid:
- ❌ Already documented behavior (see SECURITY.md)
- ❌ Out-of-scope findings (e.g., GitHub account security)
- ❌ Social engineering without technical component
- ❌ Attacks on infrastructure (hosting provider, DNS, etc.)
- ❌ Features, not bugs (e.g., "site allows long names")
📧 Responsible Disclosure
Found something? Here's how to report it:
1. Document Your Finding
Include:
- Description - What did you find?
- Impact - What can an attacker do with this?
- Reproduction Steps - How can I reproduce it?
- Proof of Concept - curl commands, screenshots, code samples
- Suggested Fix - (Optional) How should this be fixed?
2. Send Your Report
Email: Create issue on GitHub
Subject: [SECURITY] Brief description of finding
Please DO NOT:
- ❌ Publicly disclose the vulnerability before I've had a chance to fix it
- ❌ Exploit the vulnerability for personal gain
- ❌ Share the vulnerability with others before resolution
3. What Happens Next?
Response Time:
- Initial Response: Within 48 hours
- Triage: Within 1 week
- Fix: Varies by severity (1 day to 1 month)
- Public Disclosure: After fix is deployed (coordinated with you)
Severity Timelines:
- 🔴 Critical: 24-48 hours
- 🟠 High: 1 week
- 🟡 Medium: 2 weeks
- 🟢 Low: 1 month
4. Recognition
If you'd like to be acknowledged:
- Hall of Fame entry in repository
- Thank you in release notes
- Social media shoutout (with your permission)
Privacy: You can choose to remain anonymous!
🛡️ What You're Up Against
Security Layers Implemented
┌────────────────────────────────────────┐
│ Layer 1: Browser-Only Access │
│ Blocks: curl, Postman, automation │
└────────────────────────────────────────┘
▼
┌────────────────────────────────────────┐
│ Layer 2: CSRF Protection │
│ 32-byte cryptographic tokens │
└────────────────────────────────────────┘
▼
┌────────────────────────────────────────┐
│ Layer 3: Rate Limiting │
│ 5 forms/hour, 3 PDFs/minute │
└────────────────────────────────────────┘
▼
┌────────────────────────────────────────┐
│ Layer 4: Bot Detection │
│ Honeypot + Timing validation │
└────────────────────────────────────────┘
▼
┌────────────────────────────────────────┐
│ Layer 5: Input Validation │
│ Email injection, XSS, injection tests │
└────────────────────────────────────────┘
▼
┌────────────────────────────────────────┐
│ Layer 6: Security Logging │
│ All events tracked in structured JSON │
└────────────────────────────────────────┘
Known Protections
You'll have to bypass:
- Origin/Referer validation
- X-Requested-With header checks
- User-Agent validation
- CSRF token generation & validation
- Rate limiting (per-IP tracking)
- Honeypot field detection
- Timing validation (2-second minimum)
- Email header injection prevention
- HTML escaping (XSS protection)
- Input length limits
- Character whitelist validation
See SECURITY.md for full details on security controls.
💡 Hints & Tips
Getting Started
- Review the source code: GitHub Repository
- Read the security documentation: SECURITY.md
- Inspect the contact form: View source of the form
- Try basic attacks: XSS, SQL injection, command injection
- Use automated tools: OWASP ZAP, Burp Suite, Nikto
Testing Endpoints
Primary Targets:
GET /- Main pagePOST /api/contact- Contact form (heavily protected)GET /export/pdf?lang=en- PDF generation (rate limited)POST /toggle/*- Preference togglesPOST /switch-language- Language switcher
Common Attack Patterns
XSS:
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
Email Header Injection:
test@test.com\nBcc: attacker@evil.com
test@test.com\r\nContent-Type: text/html
Command Injection:
data; ls -la
data | cat /etc/passwd
data`whoami`
SQL Injection (N/A but try it):
' OR 1=1 --
Robert'; DROP TABLE users; --
Advanced Techniques
- Race conditions - Submit multiple requests simultaneously
- Unicode tricks - Use Unicode characters to bypass validation
- Encoding bypasses - Try URL encoding, double encoding, hex encoding
- Header manipulation - Craft custom headers to bypass validation
- Timing attacks - Measure response times to leak information
🏅 Hall of Fame
Status: No vulnerabilities reported yet!
Be the first to find a valid security issue and get recognized here.
Past Findings
This section will be updated as vulnerabilities are found and fixed.
Format:
[Date] [Severity] [Reporter] - Description
Example:
2025-11-30 | HIGH | @researcher | CSRF bypass via race condition
📊 Challenge Statistics
Current Stats:
- Total Attempts: Not tracked (privacy-respecting)
- Valid Findings: 0
- Invalid Reports: 0
- Average Time to First Finding: N/A
Most Tested:
- Contact form submission
- Rate limit bypass attempts
- Browser-only access bypass
Least Tested:
- Creative/novel attack vectors
- Chained exploits
- Social engineering components
🤔 FAQ
Q: Is this a real production site?
A: Yes! This is my actual CV portfolio site. It's production-ready and serves real traffic.
Q: Will you actually fix vulnerabilities I find?
A: Absolutely! Valid findings will be prioritized and fixed according to severity.
Q: Can I use automated tools?
A: Yes! OWASP ZAP, Burp Suite, Nikto, and other scanners are welcome.
Q: What if I accidentally break something?
A: Don't panic! Just report it immediately. The site has backups and graceful error handling.
Q: Can I test in production?
A: Yes, but please be responsible. Don't spam, don't DoS, and don't cause harm to legitimate users.
Q: Is there a monetary reward?
A: No cash bounty (this is a personal project), but you'll get recognition and my eternal gratitude!
Q: Can I stay anonymous?
A: Absolutely! You can report anonymously and choose whether to be acknowledged publicly.
Q: How do I know you won't use my finding maliciously?
A: This is a personal CV site with no sensitive data. The worst case is someone sends me spam emails. I'm committed to transparent, ethical security practices.
Q: What if I find something in a dependency, not your code?
A: Still valid! Report it, and I'll coordinate disclosure with the upstream project.
Q: Can I write a blog post about my findings?
A: Yes! But please wait until after the fix is deployed. Coordinated disclosure protects everyone.
🎓 Learning Resources
New to security testing? Here are some resources to get started:
Beginner
Intermediate
Advanced
Tools
- OWASP ZAP - Free web app scanner
- Burp Suite - Professional testing toolkit
- Nikto - Web server scanner
- SQLMap - SQL injection testing
🚀 Ready to Hack?
Target: https://juan.andres.morenorub.io/
Source Code: https://github.com/juanatsap/cv-site
Documentation: SECURITY.md
Report Findings: GitHub Security Advisory
Good luck, and happy hacking! 🎯
Remember:
- Be ethical
- Be responsible
- Be creative
- Have fun!
Last Updated: 2025-11-30 Challenge Status: ACTIVE Next Review: 2026-03-01
P.S. - If you manage to bypass the browser-only access using curl, I'll be genuinely impressed. That one's tough. 😉