hacktricks/network-services-pentesting/pentesting-web/code-review-tools.md
2024-02-11 01:46:25 +00:00

22 KiB

Przegląd kodu źródłowego / Narzędzia SAST

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Wskazówki i listy narzędzi

Narzędzia wielojęzyczne

Naxus - AI-Gents

Dostępny jest darmowy pakiet do przeglądu PR.

Semgrep

To jest narzędzie Open Source.

Obsługiwane języki

Kategoria Języki
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 ·

Szybki start

{% 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 %}

Możesz również użyć rozszerzenia semgrep dla VSCode, aby otrzymać wyniki wewnątrz VSCode.

SonarQube

Dostępna jest bezpłatna wersja instalacyjna.

Szybki start

{% 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

Istnieje darmowa wersja instalacyjna, ale zgodnie z licencją można jej używać tylko w projektach Open Source.

Instalacja

{% 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 %}

Szybki start - Przygotuj bazę danych

{% hint style="success" %} Pierwszą rzeczą, którą musisz zrobić, jest przygotowanie bazy danych (utworzenie drzewa kodu), aby później można było na niej wykonywać zapytania. {% endhint %}

  • Możesz pozwolić codeql automatycznie zidentyfikować język repozytorium i utworzyć bazę danych

{% 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" %} To zazwyczaj spowoduje błąd, który mówi, że określono więcej niż jeden język (lub wykryto je automatycznie). Sprawdź następujące opcje, aby to naprawić! {% endhint %}

  • Możesz to zrobić ręcznie wskazując repozytorium i język (lista języków)

{% 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 %}

  • Jeśli twoje repozytorium używa więcej niż 1 języka, możesz również utworzyć 1 bazę danych na język, wskazując każdy język.

{% 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 %}

  • Możesz również pozwolić codeql na identyfikację wszystkich języków za Ciebie i utworzenie bazy danych dla każdego języka. Musisz podać 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 %}

Szybki start - Analiza kodu

{% hint style="success" %} Nadszedł wreszcie czas na analizę kodu {% endhint %}

Pamiętaj, że jeśli użyłeś kilku języków, baza danych dla każdego języka została utworzona w podanej ścieżce.

{% 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

{% code overflow="wrap" %}

Szybki start - Skryptowany

{% endcode %}

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 %}

Możesz zwizualizować wyniki na stronie https://microsoft.github.io/sarif-web-component/ lub za pomocą rozszerzenia VSCode SARIF viewer.

Możesz również użyć rozszerzenia VSCode, aby uzyskać wyniki wewnątrz VSCode. Nadal będziesz musiał ręcznie utworzyć bazę danych, ale potem możesz wybrać dowolne pliki i kliknąć Prawy Klik -> CodeQL: Uruchom zapytania w wybranych plikach

Snyk

Dostępna jest darmowa wersja instalacyjna.

Szybki start

# 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

Możesz również użyć rozszerzenia Snyk dla VSCode, aby otrzymać wyniki wewnątrz VSCode.

Insider

Jest to Open Source, ale wygląda na nieutrzymywane.

Obsługiwane języki

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

Szybki start

# 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

Darmowe dla repozytoriów publicznych.

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: Statyczne narzędzie skanujące kod źródłowy (SAST) dla aplikacji Node.js, oparte na libsast i semgrep.
# Install & run
docker run -it -p 9090:9090 opensecurity/nodejsscan:latest
# Got to localhost:9090
# Upload a zip file with the code
  • RetireJS: Celem Retire.js jest pomóc w wykrywaniu użycia wersji bibliotek JS znanymi podatnościami.
# Install
npm install -g retire
# Run
cd /path/to/repo
retire --colors

Electron

  • electronegativity: Jest to narzędzie służące do identyfikacji błędnych konfiguracji i antywzorców bezpieczeństwa w aplikacjach opartych na Electron.

Python

  • Bandit: Bandit to narzędzie zaprojektowane do wykrywania powszechnych problemów związanych z bezpieczeństwem w kodzie Pythona. Aby to zrobić, Bandit przetwarza każdy plik, buduje z niego AST i uruchamia odpowiednie wtyczki na węzłach AST. Po zakończeniu skanowania wszystkich plików Bandit generuje raport.
# Install
pip3 install bandit

# Run
bandit -r <path to folder>
  • safety: Safety sprawdza zależności Pythona pod kątem znanych podatności bezpieczeństwa i sugeruje odpowiednie naprawy dla wykrytych podatności. Safety można uruchamiać na maszynach programistów, w potokach CI/CD oraz na systemach produkcyjnych.
# Install
pip install safety
# Run
safety check
  • Pyt: Nieaktualizowane.

.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 vulnerabilities and improve code quality. Here are some commonly used code review tools for Rust:

  • Clippy: Clippy is a linter for Rust that provides helpful suggestions and warnings to improve code quality. It can catch common mistakes, enforce best practices, and identify potential bugs.

  • Rustfmt: Rustfmt is a tool for formatting Rust code according to the official Rust style guidelines. It helps maintain consistent code formatting across projects and makes code easier to read and understand.

  • 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, providing a report of any insecure dependencies.

  • 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 refactoring support.

  • Rustdoc: Rustdoc is a tool for generating documentation from Rust source code. It can be used to automatically generate API documentation for libraries and projects, making it easier for developers to understand and use the code.

These tools can be integrated into the development workflow to ensure code quality and security in Rust projects. By using these tools, developers can catch potential issues early on and improve the overall reliability and maintainability of their code.

# Install
cargo install cargo-audit

# Run
cargo audit

#Update the Advisory Database
cargo audit fetch

Java

Java jest popularnym językiem programowania, który jest szeroko stosowany w tworzeniu aplikacji internetowych. Podczas przeglądania kodu źródłowego aplikacji Java istnieje kilka narzędzi, które mogą pomóc w identyfikacji potencjalnych luk w zabezpieczeniach. Poniżej przedstawiamy kilka popularnych narzędzi do przeglądu kodu Java:

1. FindBugs

FindBugs jest narzędziem statycznego analizatora kodu, które wykrywa potencjalne błędy i problemy z wydajnością w kodzie Java. Może również pomóc w identyfikacji podatności związanych z bezpieczeństwem, takich jak nieprawidłowe zarządzanie pamięcią, niebezpieczne operacje na plikach i nieprawidłowe użycie kryptografii.

2. PMD

PMD to kolejne narzędzie statycznego analizatora kodu, które może pomóc w identyfikacji potencjalnych problemów w kodzie Java. PMD sprawdza kod pod kątem zgodności z najlepszymi praktykami programistycznymi i wykrywa potencjalne błędy, takie jak nieprawidłowe użycie zmiennych, nieprawidłowe formatowanie kodu i niebezpieczne operacje na plikach.

3. Checkstyle

Checkstyle jest narzędziem, które sprawdza kod Java pod kątem zgodności z określonymi regułami stylu kodowania. Może pomóc w utrzymaniu spójności i czytelności kodu, a także w identyfikacji potencjalnych problemów z bezpieczeństwem, takich jak nieprawidłowe użycie kryptografii i niebezpieczne operacje na plikach.

4. SonarQube

SonarQube to platforma do kontroli jakości kodu, która może być używana do przeglądu kodu Java. SonarQube analizuje kod pod kątem potencjalnych błędów, problemów z wydajnością, zgodności z najlepszymi praktykami programistycznymi i zabezpieczeniami. Może również generować raporty i metryki dotyczące jakości kodu.

5. FindSecBugs

FindSecBugs jest narzędziem specjalnie zaprojektowanym do wykrywania podatności związanych z bezpieczeństwem w kodzie Java. Wykorzystuje on statyczną analizę kodu, aby zidentyfikować potencjalne luki w zabezpieczeniach, takie jak nieprawidłowe uwierzytelnianie, nieprawidłowe zarządzanie sesją i niebezpieczne operacje na plikach.

Przy przeglądzie kodu źródłowego aplikacji Java warto skorzystać z tych narzędzi, aby zidentyfikować potencjalne problemy z bezpieczeństwem i poprawić jakość kodu.

# 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
Zadanie Komenda
Wykonaj Jar java -jar [jar]
Rozpakuj Jar unzip -d [katalog docelowy] [jar]
Utwórz Jar jar -cmf META-INF/MANIFEST.MF [jar docelowy] *
Base64 SHA256 sha256sum [plik] | cut -d' ' -f1 | xxd -r -p | base64
Usuń podpis rm META-INF/.SF META-INF/.RSA META-INF/*.DSA
Usuń z Jar zip -d [jar] [plik do usunięcia]
Dekompiluj klasę procyon -o . [ścieżka do klasy]
Dekompiluj Jar procyon -jar [jar] -o [katalog docelowy]
Skompiluj klasę javac [ścieżka do pliku .java]

Przejdź do

https://github.com/securego/gosec

PHP

Psalm i PHPStan.

Wtyczki Wordpress

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

Solidity

JavaScript

Odkrywanie

  1. Burp:
  • Spider i odkryj zawartość
  • Sitemap > filtr
  • Sitemap > kliknij prawym przyciskiem na domenę > Narzędzia zaangażowania > Znajdź skrypty
  1. WaybackURLs:
  • waybackurls <domena> |grep -i "\.js" |sort -u

Statyczna analiza

Odminifikuj/Upiększ/Upiększ

Deobfuskacja/Odpakowanie

Uwaga: Może być niemożliwe pełne odblokowanie.

  1. Znajdź i użyj plików .map:
  • Jeśli pliki .map są ujawnione, można je łatwo odblokować.
  • Najczęściej, foo.js.map mapuje na foo.js. Ręcznie je wyszukaj.
  • Użyj JS Miner, aby je znaleźć.
  • Upewnij się, że przeprowadzono skanowanie aktywne.
  • Przeczytaj 'Wskazówki/Notatki'
  • Jeśli zostaną znalezione, użyj Maximize, aby je odblokować.
  1. Bez plików .map, spróbuj JSnice:
  • Odwołania: http://jsnice.org/ & https://www.npmjs.com/package/jsnice
  • Wskazówki:
  • Jeśli korzystasz z jsnice.org, kliknij przycisk opcji obok przycisku "Nicify JavaScript" i odznacz "Infer types", aby zmniejszyć zanieczyszczenie kodu komentarzami.
  • Upewnij się, że nie zostawiasz pustych linii przed skryptem, ponieważ może to wpłynąć na proces odblokowywania i dawać nieprecyzyjne wyniki.
  1. Użyj console.log();
  • Znajdź wartość zwracaną na końcu i zmień ją na console.log(<packerReturnVariable>);, aby zamiast wykonywania, wydrukować odblokowany js.
  • Następnie wklej zmodyfikowany (i nadal zaszyfrowany) js do https://jsconsole.com/, aby zobaczyć odblokowany js zapisany w konsoli.
  • Na koniec, wklej odblokowany wynik do https://prettier.io/playground/, aby upiększyć go do analizy.
  • Uwaga: Jeśli nadal widzisz spakowany (ale inny) js, może być rekurencyjnie spakowany. Powtórz proces.

Odwołania

Narzędzia

Mniej używane odwołania

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: