BUG: UrlConverter preserves forward slashes by default, preventing path payload evasion

Fermée
#3,401 0 commentaires 0 réactions 1 personne assignée Voir sur GitHub

Les mainteneurs répondent en général sous 2 jours

@Kaap10 y travaille déjà.

Depuis le 22/10/2026.

  • #3402 par @Kaap10 — fusionnée

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
25/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
À l'abandon
Stack technique
python
Domaine
security

Piste de recherche

Start by locating UrlConverter and its tests, then check how it calls urllib.parse.quote and how converter options are exposed. The issue includes a reproducer and expected output: forward slashes should encode as %2F by default, while callers can configure safe. An open pull request is already linked, so check its status before starting.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Describe the bug

UrlConverter encodes text prompts to URL-encoded representations for red teaming and evasion testing. Currently, it delegates directly to urllib.parse.quote(prompt) without constructor configuration.

Because Python's standard library urllib.parse.quote(string, safe='/') defaults to safe='/':

  1. Path traversal payloads (../../etc/passwd) encode to ../../etc/passwd with all path slashes preserved literally.
  2. SSRF and open redirect payloads (https://attacker.com/steal) encode to https%3A//attacker.com/steal, preserving all slashes.

In adversarial evaluations and WAF evasion testing, red-teamers specifically encode forward slashes as %2F to bypass path normalization and WAF rules. Because UrlConverter exposes no parameters and hardcodes the stdlib default, callers cannot produce %2F without an explicit safe configuration parameter.

Steps/Code to Reproduce
import asyncio
from pyrit.converter import UrlConverter

async def main():
    converter = UrlConverter()
    result = await converter.convert_async(prompt="../../etc/passwd")
    print("Encoded payload:", result.output_text)
    print("Contains literal slash:", "/" in result.output_text)

asyncio.run(main())
Expected Results

Path traversal payloads should have forward slashes encoded as %2F by default (..%2F..%2Fetc%2Fpasswd), and callers should be able to configure safe characters if they wish to preserve specific characters (e.g. UrlConverter(safe="/")).

Actual Results
Encoded payload: ../../etc/passwd
Contains literal slash: True
Langage dominant
Python
Étoiles
4.7k
Forks
1k
Merge moyen
2 j 4 h
PR mergées (30 j)
484

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

  • Aucun Dockerfile ni fichier Docker Compose
  • Propose un modèle de pull request
  • Aucun guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de microsoft/PyRIT

Toutes les issues de microsoft/PyRIT

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.