hacktricks/network-services-pentesting/pentesting-web/code-review-tools.md

26 KiB

Révision du code source / Outils SAST

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Orientation et listes d'outils

Outils multi-langages

Naxus - AI-Gents

Il existe un forfait gratuit pour la révision des PR.

Semgrep

C'est un outil Open Source.

Langages pris en charge

Catégorie Langages
GA C# · Go · Java · JavaScript · JSX · JSON · PHP · Python · Ruby · Scala · Terraform · TypeScript · TSX
Beta Kotlin · Rust
Experimental Bash · C · C++ · Clojure · Dart · Dockerfile · Elixir · HTML · Julia · Jsonnet · Lisp ·

Démarrage rapide

{% code overflow="wrap" %}

# Install https://github.com/returntocorp/semgrep#option-1-getting-started-from-the-cli
brew install semgrep

# Go to your repo code and scan
cd repo
semgrep scan --config auto

{% endcode %}

Vous pouvez également utiliser l'extension semgrep VSCode pour obtenir les résultats dans VSCode.

SonarQube

Il existe une version gratuite installable.

Démarrage rapide

{% code overflow="wrap" %}

# Run the paltform in docker
docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest
# Install cli tool
brew install sonar-scanner

# Go to localhost:9000 and login with admin:admin or admin:sonar
# Generate a local project and then a TOKEN for it

# Using the token and from the folder with the repo, scan it
cd path/to/repo
sonar-scanner \
-Dsonar.projectKey=<project-name> \
-Dsonar.sources=. \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.token=<sonar_project_token>

{% endcode %}

CodeQL

Il existe une version gratuite installable, mais selon la licence, vous ne pouvez utiliser la version gratuite de CodeQL que dans les projets Open Source.

Installation

{% code overflow="wrap" %}

# Download your release from https://github.com/github/codeql-action/releases
## Example
wget https://github.com/github/codeql-action/releases/download/codeql-bundle-v2.14.3/codeql-bundle-osx64.tar.gz

# Move it to the destination folder
mkdir ~/codeql
mv codeql-bundle* ~/codeql

# Decompress it
cd ~/codeql
tar -xzvf codeql-bundle-*.tar.gz
rm codeql-bundle-*.tar.gz

# Add to path
echo 'export PATH="$PATH:/Users/username/codeql/codeql"' >> ~/.zshrc

# Check it's correctly installed
## Open a new terminal
codeql resolve qlpacks #Get paths to QL packs

{% endcode %}

Démarrage rapide - Préparer la base de données

{% hint style="success" %} La première chose que vous devez faire est de préparer la base de données (créer l'arborescence du code) afin que les requêtes puissent être exécutées dessus ultérieurement. {% endhint %}

  • Vous pouvez permettre à codeql d'identifier automatiquement le langage du dépôt et de créer la base de données

{% code overflow="wrap" %}

codeql database create <database> --language <language>

# Example
codeql database create /path/repo/codeql_db --source-root /path/repo
## DB will be created in /path/repo/codeql_db

{% endcode %}

{% hint style="danger" %} Cela générera généralement une erreur indiquant que plus d'un langage a été spécifié (ou détecté automatiquement). Vérifiez les options suivantes pour résoudre ce problème ! {% endhint %}

  • Vous pouvez le faire manuellement en indiquant le repo et le langage (liste des langages)

{% code overflow="wrap" %}

codeql database create <database> --language <language> --source-root </path/to/repo>

# Example
codeql database create /path/repo/codeql_db --language javascript --source-root /path/repo
## DB will be created in /path/repo/codeql_db

{% endcode %}

  • Si votre dépôt utilise plus d'une langue, vous pouvez également créer 1 base de données par langue en indiquant chaque langue.

{% code overflow="wrap" %}

export GITHUB_TOKEN=ghp_32849y23hij4...
codeql database create <database> --source-root /path/to/repo --db-cluster --language "javascript,python"

# Example
export GITHUB_TOKEN=ghp_32849y23hij4...
codeql database create /path/repo/codeql_db --source-root /path/to/repo --db-cluster --language "javascript,python"
## DBs will be created in /path/repo/codeql_db/*

{% endcode %}

  • Vous pouvez également permettre à codeql d'identifier toutes les langues pour vous et de créer une base de données par langue. Vous devez lui fournir un GITHUB_TOKEN.

{% code overflow="wrap" %}

export GITHUB_TOKEN=ghp_32849y23hij4...
codeql database create <database> --db-cluster --source-root </path/to/repo>

# Example
export GITHUB_TOKEN=ghp_32849y23hij4...
codeql database create /tmp/codeql_db --db-cluster --source-root /path/repo
## DBs will be created in /path/repo/codeql_db/*

{% endcode %}

Démarrage rapide - Analyser le code

{% hint style="success" %} Maintenant, il est enfin temps d'analyser le code {% endhint %}

N'oubliez pas que si vous avez utilisé plusieurs langages, une base de données par langage aurait été créée dans le chemin que vous avez spécifié.

{% code overflow="wrap" %}

# Default analysis
codeql database analyze <database> --format=<format> --output=</out/file/path>
# Example
codeql database analyze /tmp/codeql_db/javascript --format=sarif-latest --output=/tmp/graphql_results.sarif

# Specify QL pack to use in the analysis
codeql database analyze <database> \
<qls pack> --sarif-category=<language> \
--sarif-add-baseline-file-info \ --format=<format> \
--output=/out/file/path>
# Example
codeql database analyze /tmp/codeql_db \
javascript-security-extended --sarif-category=javascript \
--sarif-add-baseline-file-info --format=sarif-latest \
--output=/tmp/sec-extended.sarif

{% endcode %}

Démarrage rapide - Scripté

{% code overflow="wrap" %}

export GITHUB_TOKEN=ghp_32849y23hij4...
export REPO_PATH=/path/to/repo
export OUTPUT_DIR_PATH="$REPO_PATH/codeql_results"
mkdir -p "$OUTPUT_DIR_PATH"
export FINAL_MSG="Results available in: "

echo "Creating DB"
codeql database create "$REPO_PATH/codeql_db" --db-cluster --source-root "$REPO_PATH"
for db in `ls "$REPO_PATH/codeql_db"`; do
echo "Analyzing $db"
codeql database analyze "$REPO_PATH/codeql_db/$db" --format=sarif-latest --output="${OUTPUT_DIR_PATH}/$db).sarif"
FINAL_MSG="$FINAL_MSG ${OUTPUT_DIR_PATH}/$db.sarif ,"
echo ""
done

echo $FINAL_MSG

{% endcode %}

Vous pouvez visualiser les résultats sur https://microsoft.github.io/sarif-web-component/ ou en utilisant l'extension VSCode SARIF viewer.

Vous pouvez également utiliser l'extension VSCode pour obtenir les résultats dans VSCode. Vous devrez toujours créer une base de données manuellement, mais ensuite vous pourrez sélectionner n'importe quel fichier et cliquer sur Clic droit -> CodeQL: Exécuter les requêtes dans les fichiers sélectionnés

Snyk

Il existe une version gratuite installable.

Démarrage rapide

# Install
sudo npm install -g snyk

# Authenticate (you can use a free account)
snyk auth

# Test for open source vulns & license issues
snyk test [--all-projects]

# Test for code vulnerabilities
## This will upload your code and you need to enable this option in: Settings > Snyk Code
snyk test code

# Test for vulns in images
snyk container test [image]

# Test for IaC vulns
snyk iac test

Vous pouvez également utiliser l'extension snyk VSCode pour obtenir des résultats dans VSCode.

Insider

C'est Open Source, mais semble non maintenu.

Langages pris en charge

Java (Maven et Android), Kotlin (Android), Swift (iOS), .NET Full Framework, C# et Javascript (Node.js).

Démarrage rapide

# Check the correct release for your environment
$ wget https://github.com/insidersec/insider/releases/download/2.1.0/insider_2.1.0_linux_x86_64.tar.gz
$ tar -xf insider_2.1.0_linux_x86_64.tar.gz
$ chmod +x insider
$ ./insider --tech javascript  --target <projectfolder>

DeepSource

Gratuit pour les dépôts publics.

NodeJS

  • yarn
# Install
brew install yarn
# Run
cd /path/to/repo
yarn audit
npm audit
  • pnpm
# Install
npm install -g pnpm
# Run
cd /path/to/repo
pnpm audit
  • nodejsscan: Outil de balayage de code de sécurité statique (SAST) pour les applications Node.js alimenté par libsast et semgrep.
# Install & run
docker run -it -p 9090:9090 opensecurity/nodejsscan:latest
# Got to localhost:9090
# Upload a zip file with the code
  • RetireJS: L'objectif de Retire.js est de vous aider à détecter l'utilisation de versions de bibliothèques JS avec des vulnérabilités connues.
# Install
npm install -g retire
# Run
cd /path/to/repo
retire --colors

Electron

  • electronegativity: C'est un outil pour identifier les mauvaises configurations et les anti-patterns de sécurité dans les applications basées sur Electron.

Python

  • Bandit: Bandit est un outil conçu pour trouver les problèmes de sécurité courants dans le code Python. Pour ce faire, Bandit traite chaque fichier, construit un AST à partir de celui-ci et exécute les plugins appropriés sur les nœuds AST. Une fois que Bandit a terminé de scanner tous les fichiers, il génère un rapport.
# Install
pip3 install bandit

# Run
bandit -r <path to folder>
  • safety: Safety vérifie les dépendances Python à la recherche de vulnérabilités de sécurité connues et suggère les mesures correctives appropriées pour les vulnérabilités détectées. Safety peut être exécuté sur les machines des développeurs, dans les pipelines CI/CD et sur les systèmes de production.
# Install
pip install safety
# Run
safety check
  • Pyt: Non maintenu.

.NET

# dnSpy
https://github.com/0xd4d/dnSpy

# .NET compilation
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe test.cs

RUST

Rust is a systems programming language that focuses on safety, speed, and concurrency. It is designed to be memory safe and thread safe, making it a good choice for building reliable and efficient software. Rust's syntax is similar to C++, but it includes modern features such as pattern matching, type inference, and ownership semantics.

Code Review Tools

When performing a code review in Rust, there are several tools that can help identify potential issues and improve code quality. Here are some commonly used code review tools for Rust:

  1. Clippy: Clippy is a linter for Rust that provides helpful suggestions and warnings about common mistakes and bad practices. It can catch issues such as unused variables, unnecessary code, and potential performance problems.

  2. Rustfmt: Rustfmt is a tool for formatting Rust code according to the official Rust style guidelines. It automatically formats code to improve readability and consistency, making it easier to review and maintain.

  3. Cargo-audit: Cargo-audit is a tool that checks Rust dependencies for known vulnerabilities. It scans the Cargo.lock file and compares it against a database of known vulnerabilities, helping to identify potential security risks.

  4. Rust-analyzer: Rust-analyzer is an integrated development environment (IDE) extension that provides code analysis and navigation features for Rust. It offers features such as code completion, documentation lookup, and jump-to-definition, making it easier to review and understand code.

  5. Rustdoc: Rustdoc is a tool for generating documentation from Rust source code. It can be used to generate API documentation for libraries and projects, making it easier to review and understand the code's functionality and usage.

Using these code review tools can help ensure that Rust code is well-written, secure, and follows best practices. By identifying and addressing potential issues early on, code quality can be improved and the risk of bugs and vulnerabilities can be reduced.

# Install
cargo install cargo-audit

# Run
cargo audit

#Update the Advisory Database
cargo audit fetch

Java

Java est un langage de programmation orienté objet largement utilisé pour le développement d'applications. Il est populaire en raison de sa portabilité, de sa sécurité et de sa facilité d'utilisation. Lors de l'audit du code Java, il est important d'utiliser des outils de révision de code pour identifier les vulnérabilités potentielles et les erreurs de programmation. Voici quelques-uns des outils de révision de code les plus couramment utilisés pour le code Java :

  • FindBugs : FindBugs est un outil d'analyse statique qui recherche les erreurs de programmation courantes, telles que les fuites de mémoire, les erreurs de gestion des exceptions et les problèmes de performance.

  • Checkstyle : Checkstyle est un outil qui vérifie si le code Java respecte les conventions de codage définies. Il peut détecter les erreurs de style, les problèmes de formatage et les violations des bonnes pratiques de codage.

  • PMD : PMD est un outil d'analyse statique qui recherche les erreurs de programmation courantes, les problèmes de performance et les violations des bonnes pratiques de codage. Il peut également détecter les duplications de code et les problèmes de complexité.

  • SonarQube : SonarQube est une plateforme d'analyse continue du code qui fournit des informations détaillées sur la qualité du code. Il peut détecter les vulnérabilités de sécurité, les erreurs de programmation, les problèmes de performance et les violations des bonnes pratiques de codage.

  • FindSecBugs : FindSecBugs est un plugin FindBugs spécialement conçu pour détecter les vulnérabilités de sécurité dans le code Java. Il peut identifier les problèmes tels que les injections SQL, les fuites d'informations sensibles et les erreurs de configuration de sécurité.

Ces outils de révision de code peuvent être utilisés pour améliorer la qualité et la sécurité du code Java. Ils peuvent aider à identifier les vulnérabilités potentielles et les erreurs de programmation, ce qui permet de les corriger avant qu'ils ne soient exploités par des attaquants.

# JD-Gui
https://github.com/java-decompiler/jd-gui

# Java compilation step-by-step
javac -source 1.8 -target 1.8 test.java
mkdir META-INF
echo "Main-Class: test" > META-INF/MANIFEST.MF
jar cmvf META-INF/MANIFEST.MF test.jar test.class
Tâche Commande
Exécuter le Jar java -jar [jar]
Décompresser le Jar unzip -d [répertoire de sortie] [jar]
Créer le Jar jar -cmf META-INF/MANIFEST.MF [jar de sortie] *
Base64 SHA256 sha256sum [fichier] | cut -d' ' -f1 | xxd -r -p | base64
Supprimer la signature rm META-INF/.SF META-INF/.RSA META-INF/*.DSA
Supprimer du Jar zip -d [jar] [fichier à supprimer]
Décompiler la classe procyon -o . [chemin vers la classe]
Décompiler le Jar procyon -jar [jar] -o [répertoire de sortie]
Compiler la classe javac [chemin vers le fichier .java]

Aller

https://github.com/securego/gosec

PHP

Psalm et PHPStan.

Plugins Wordpress

https://www.pluginvulnerabilities.com/plugin-security-checker/

Solidity

JavaScript

Découverte

  1. Burp:
  • Spider et découvrir le contenu
  • Sitemap > filtrer
  • Sitemap > clic droit sur le domaine > Outils d'engagement > Trouver des scripts
  1. WaybackURLs:
  • waybackurls <domain> |grep -i "\.js" |sort -u

Analyse statique

Déminifier/Embellecer

Déobfusquer/Décompresser

Note: Il peut ne pas être possible de déobfusquer complètement.

  1. Trouver et utiliser les fichiers .map:
  • Si les fichiers .map sont exposés, ils peuvent être utilisés pour déobfusquer facilement.
  • Couramment, foo.js.map correspond à foo.js. Recherchez-les manuellement.
  • Utilisez JS Miner pour les rechercher.
  • Assurez-vous d'effectuer une analyse active.
  • Lisez 'Conseils/Notes'
  • Si vous en trouvez, utilisez Maximize pour déobfusquer.
  1. Sans fichiers .map, essayez JSnice:
  • Références: http://jsnice.org/ & https://www.npmjs.com/package/jsnice
  • Conseils:
  • Si vous utilisez jsnice.org, cliquez sur le bouton d'options à côté du bouton "Nicify JavaScript" et désélectionnez "Infer types" pour réduire l'encombrement du code avec des commentaires.
  • Assurez-vous de ne laisser aucune ligne vide avant le script, car cela peut affecter le processus de déobfuscation et donner des résultats inexacts.
  1. Utilisez console.log();
  • Trouvez la valeur de retour à la fin et changez-la en console.log(<packerReturnVariable>); pour que le js déobfusqué soit affiché à la place d'être exécuté.
  • Ensuite, collez le js modifié (et toujours obfusqué) dans https://jsconsole.com/ pour voir le js déobfusqué affiché dans la console.
  • Enfin, collez la sortie déobfusquée dans https://prettier.io/playground/ pour l'embellir en vue de l'analyse.
  • Note: Si vous voyez toujours du js empaqueté (mais différent), il peut être empaqueté de manière récursive. Répétez le processus.

Analyser

Références: https://medium.com/techiepedia/javascript-code-review-guide-for-bug-bounty-hunters-c95a8aa7037a

Recherchez:

  • Chargement anti-débogage
  • Angular: enableProdMode
  • Secrets
  • Utilisez:
  • JS Miner
  • RegHex patterns
  • gf patterns
  • Recherchez des motifs pertinents dans le dictionnaire:
  • pass, user, admin
  • auth, login, sign, challenge, 2fa
  • key, apikey, api_key, api-key, jwt, token
  • secret, security, secure
  • ...
  • Examen manuel
  • Si une clé API est trouvée, vérifiez ici la syntaxe d'utilisation potentielle: https://github.com/streaak/keyhacks.
  • Fonctions vulnérables
  • InnerHTML() - Si vous trouvez cela, cela signifie qu'il y a une chance potentielle de XSS si aucune désinfection appropriée n'a lieu. Même si votre charge utile est désinfectée, ne vous inquiétez pas. Suivez le code pour savoir où se trouve la désinfection. Étudiez-le et essayez de contourner la désinfection.
  • Postmessage() - Si vous avez lu mon précédent article (https://medium.com/techiepedia/what-are-sop-cors-and-ways-to-exploit-it-62a5e02100dc), vous remarquerez que Postmessage() peut entraîner un problème potentiel de CORS. Si le deuxième paramètre de la fonction est défini sur *, vous êtes chanceux. Consultez mon article précédent pour en savoir plus sur le mécanisme derrière.
  • String.prototype.search() - Cette fonction semble normale. Pourquoi serait-elle une fonction dangereuse ? Eh bien, c'est parce que certains développeurs l'utilisent pour trouver l'occurrence d'une chaîne à l'intérieur d'une autre chaîne. Cependant, "." est traité comme un caractère générique dans cette fonction. Donc, si cette fonction est utilisée comme vérification de désinfection, vous pouvez simplement la contourner en entrant ".". Consultez le rapport de Filedescryptor sur hackerone: https://hackerone.com/reports/129873
  • Points d'extrémité et paramètres
  • Utilisez LinkFinder & JS Miner.
  • Bibliothèques et dépendances vulnérables
  • Utilisez Retire.js et NPM (faites défiler jusqu'à la section sécurité > lien toutes les versions).
  • URLs Cloud
  • Utilisez JS Miner.
  • Sous-domaines
  • Utilisez JS Miner.
  • Vulnérabilités de logique
  • Acquérir une connaissance de la situation:
  • use strict;?
  • Recherchez des contrôles côté client:
  • disable, enable, hidden, hide, show
  • catch, finally, throw, try
  • input, validate, verify, valid, correct, check, confirm, require, ..
  • Recherchez des non-primitifs:
  • function , =>
  • class

Analyse dynamique

Références

Outils

Références moins utilisées

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥