This project demonstrates various SQL injection vulnerabilities in C++ code that can be detected by SonarQube's taint analysis engine. It serves as a test case for security analysis tools and educational purposes.
This code contains intentional security vulnerabilities and should NEVER be used in production environments. It is designed solely for testing static analysis tools and educational purposes.
sql_injection_cpp_project/
├── src/
│ ├── main.cpp # Main demo application
│ ├── database_manager.cpp # Database operations with SQL injection vulnerabilities
│ ├── user_service.cpp # User service with various injection patterns
│ └── vulnerable_queries.cpp # Query building functions with vulnerabilities
├── include/
│ ├── database_manager.h # Database manager header
│ ├── user_service.h # User service header
│ └── vulnerable_queries.h # Vulnerable queries header
├── CMakeLists.txt # CMake build configuration
├── sonar-project.properties # SonarQube configuration
├── .sonarcloud.properties # SonarCloud configuration
├── build.sh # Build script
├── analyze.sh # SonarQube analysis script
└── README.md # This file
- Direct string concatenation in SQL queries
- User input directly embedded in WHERE clauses
- Vulnerable login bypass scenarios
- UNION-based injection
- Boolean-based blind injection
- Time-based blind injection
- Error-based injection
- Second-order injection
- ORDER BY clause injection
- LIKE operator injection
- JSON parameter injection
- Web request parameter injection
- API parameter injection
- User input flowing through multiple functions
- Data transformation that preserves taint
- Cross-function vulnerability propagation
- C++ Compiler: GCC 7+ or Clang 6+
- CMake: Version 3.10 or higher
- SQLite3: Development libraries
- pkg-config: For dependency management
- SonarQube Server: 8.9+ (Community Edition or higher)
- SonarQube Scanner: Latest version
- Build Wrapper: For C++ analysis (optional but recommended)
sudo apt-get update
sudo apt-get install build-essential cmake libsqlite3-dev pkg-configbrew install cmake sqlite3 pkg-config# macOS
brew install sonar-scanner
# Ubuntu/Debian
sudo apt-get install sonar-scanner
# Or download from: https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/./build.shmkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
make -j$(nproc)# Build and run
./build.sh --run
# Or run manually
./build/sql_injection_demoSonarCloud can automatically analyze your C++ code without requiring build compilation:
# For SonarCloud automatic analysis, simply push to GitHub
# SonarCloud will automatically detect and analyze your code
git push origin mainConfiguration files:
sonar-project.properties- Simplified for automatic analysis.sonarcloud.properties- SonarCloud-specific settings
# Set environment variables
export SONAR_HOST_URL=https://sonarcloud.io
export SONAR_TOKEN=your_sonarcloud_token
# Run manual analysis (uses sonar-project-manual.properties)
./analyze.sh# Start SonarQube server (if running locally)
# Then run analysis (uses sonar-project-manual.properties)
./analyze.sh# With build wrapper (recommended)
build-wrapper-linux-x86-64 --out-dir build-wrapper-output make -C build clean all
sonar-scanner
# Without build wrapper (using compile_commands.json)
sonar-scanner -Dsonar.cfamily.compile-commands=build/compile_commands.jsonWhen analyzed with SonarQube, this project should generate the following types of security findings:
- SQL Injection vulnerabilities in
database_manager.cpp - Taint analysis violations in
user_service.cpp - Security hotspots for string concatenation in SQL queries
getUserByIdVulnerable()- Direct ID injectionsearchUsersVulnerable()- LIKE clause injectionloginUser()- Authentication bypassexecuteRawQueryVulnerable()- Direct query executionbuildLoginQuery()- Query construction vulnerabilitiesprocessWebRequest()- Web parameter injectionhandleApiCall()- API parameter injection
- cpp:S2077: SQL queries should not be vulnerable to injection attacks
- cpp:S3649: Database queries should not be vulnerable to injection attacks
- cpp:S5131: Endpoints should not be vulnerable to injection attacks
Key configurations for C++ analysis:
- Enables taint analysis:
sonar.cfamily.taint.enable=true - Security hotspot detection:
sonar.security.hotspots.enable=true - Build wrapper integration:
sonar.cfamily.build-wrapper-output
- Generates
compile_commands.jsonfor SonarQube - Links SQLite3 libraries
- Sets debug flags for better analysis
The project includes both vulnerable and safe implementations:
// VULNERABLE: Direct string concatenation
std::string query = "SELECT * FROM users WHERE id = " + user_id;
return executeQuery(query);// SAFE: Parameterized query
sqlite3_stmt* stmt;
const char* query = "SELECT * FROM users WHERE id = ?";
sqlite3_prepare_v2(db, query, -1, &stmt, nullptr);
sqlite3_bind_int(stmt, 1, user_id);This project is useful for:
- Security Training: Understanding SQL injection patterns
- Tool Testing: Validating static analysis tools
- CI/CD Integration: Testing security gates in pipelines
- Compliance: Demonstrating security scanning capabilities
# Check dependencies
pkg-config --exists sqlite3 && echo "SQLite3 found" || echo "SQLite3 missing"
# Clean build
rm -rf build build-wrapper-output
./build.sh# Check scanner installation
sonar-scanner --version
# Verify project configuration
cat sonar-project.properties
# Check build wrapper output
ls -la build-wrapper-output/- Missing SQLite3: Install development libraries
- Build wrapper not found: Download from SonarQube server
- No vulnerabilities detected: Check taint analysis is enabled
- Authentication errors: Verify SONAR_TOKEN
This is a demonstration project. If you find additional vulnerability patterns that should be included:
- Add the vulnerable code following existing patterns
- Document the vulnerability type
- Ensure SonarQube can detect it
- Update this README
This project is provided for educational and testing purposes only. Use at your own risk and never in production environments.
The vulnerabilities in this code are intentional and designed for testing purposes. The authors are not responsible for any misuse of this code or any security incidents that may result from its use.
Remember: This code demonstrates security vulnerabilities. Always use parameterized queries and proper input validation in real applications!