Learn Security by Breaking Things

    Read Code Like a Hacker

    Master vulnerability identification through interactive code review challenges. Review multi-file codebases, pinpoint the vulnerable line, and develop the instincts of a security researcher.

    20+
    Challenges
    8
    Languages
    100%
    Hands-On
    Supports:
    SOL
    +more

    Why CodeHunter?

    Develop the instincts of a security researcher through hands-on challenges based on real-world vulnerabilities.

    Code Review

    Hunt vulnerabilities across multi-file projects. Identify the exact line where security breaks down.

    Real-World Vulnerabilities

    Learn from CVE-documented vulnerabilities. Every challenge is based on real-world security incidents.

    Skill Progression

    From rookie to elite. Progress through difficulty tiers as you master vulnerability identification.

    Try It Now

    Can You Spot the Vulnerability?

    Click the line you think is vulnerable, then check your answer. This is a real challenge from our Code Review mode.

    Scenario: A cinema booking app added detailed error handling to debug production issues. When bookings fail, something in the error response is giving away more than it should.

    Cinema Booking
    EASYInformation Disclosure

    Look at what information is returned to the client when a booking operation fails.

    1const express = require('express');
    2const router = express.Router();
    3const db = require('../config/database');
    4const paymentService = require('../services/paymentService');
    5
    6router.post('/book', async (req, res) => {
    7 try {
    8 const { movieId, seats, payment } = req.body;
    9 const userId = req.user.id;
    10
    11 const booking = await db.query(
    12 'INSERT INTO bookings (movie_id, seats, user_id, status) VALUES ($1, $2, $3, $4) RETURNING *',
    13 [movieId, seats, userId, 'pending']
    14 );
    15
    16 await paymentService.processPayment(payment, booking.rows[0].id);
    17 res.json({ success: true, bookingId: booking.rows[0].id });
    18 } catch (err) {
    19 res.status(500).json({ success: false, error: err.message, stack: err.stack, details: err });
    20 }
    21});
    22
    23router.get('/my-bookings', async (req, res) => {
    24 const userId = req.user.id;
    25 const result = await db.query('SELECT * FROM bookings WHERE user_id = $1', [userId]);
    26 res.json(result.rows);
    27});
    28
    29module.exports = router;

    Ready to Hunt Vulnerabilities?

    Sign in to track your progress, earn points, and compete on the leaderboard.