Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2021-35042 — Un'analisi di base su CVE-2021-35942. Iniezione SQL in Django. | Kitploit
Strumenti/GitHubGitHub/zer0qs/cve-2021-35042
Analisi delle VulnerabilitàExploitSicurezza WebPaper e RicercaApprendimento e Formazione
GitHubzer0qs/cve-2021-35042

CVE-2021-35042

Un'analisi di base su CVE-2021-35942. Iniezione SQL in Django.

Vedi Repository
2114 anni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2021-35042: Vulnerabilità di SQL injection in Django

I. Panoramica

Django è un framework per applicazioni web open source, scritto in Python e costruito secondo il modello MVC (Model - View - Controller). Inizialmente è stato creato per gestire i siti web di contenuti di notizie di proprietà del gruppo editoriale Lawrence, come software CMS (Content Management System).

Le versioni di Django 3.1.x -> 3.1.13 e 3.2.x -> 3.2.5 presentano una vulnerabilità di SQL injection.

La causa di questa vulnerabilità è che la funzione di filtraggio dei dati di input controllati dall'utente in QuerySet.order_by() non è sufficiente a prevenire gli attacchi di SQL injection. Questa vulnerabilità può essere sfruttata per consentire a un attaccante di eseguire azioni non autorizzate che portano alla divulgazione di dati sensibili.

CVE - IDCVE-2021-35042
Severità9.8 - CRITICA
CWE - IDCWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
Data di pubblicazione della vulnerabilità1/7/2021
Software interessato3.1.x < 3.1.13, 3.2.x < 3.2.5
Richiede autenticazioneNon richiesta

II. Panoramica x2

0x01. Il modello di Django

In Django, la creazione di tabelle e la definizione dei campi nel database viene eseguita dichiarando una classe modello nel file models.py. In questo esempio, dichiariamo una tabella chiamata Wolf e un campo chiamato name.

0x02. QuerySet e Order_by() in Django

Il framework ORM integrato in Django viene utilizzato per interagire con il database, e il risultato di una query è un insieme, chiamato QuerySet.

order_by(fields) Per impostazione predefinita, order_by() restituisce un QuerySet ordinato secondo l'ordine specificato nell'opzione ordering nel Meta del Modello. Possiamo sovrascrivere la condizione order_by in ogni query utilizzando il metodo order_by().

Esempio

wolves = Wolf.objects.order_by('-name', 'id')

Il risultato della query sopra sarà ordinato in modo decrescente per il campo name, poi in modo crescente per id. Il segno meno davanti al nome del campo name indica che il risultato è ordinato in modo decrescente.

L'esempio seguente ordina il risultato restituito in base al campo ricevuto dall'utente; se non viene passato alcun valore, ordina per il campo id.

Risultato

Nelle versioni 3.1 e 3.2, Django consente di combinare il metodo di query con il nome della tabella nella query order_by. Questa è anche la causa principale di questa vulnerabilità.

Passare un nome di tabella ci dà lo stesso risultato del passare normalmente un nome di campo

cve202135042_wolf è il nome della tabella

Innanzitutto l'applicazione chiama direttamente la funzione order_by(); il codice che gestisce la funzione order_by() è definito in: django/db/models/query.py

La funzione order_by() esegue due operazioni

  1. Cancella tutti i metodi attualmente chiamati da order_by() e rimuove il parametro predefinito passato quando order_by riceve un valore diverso.
  1. Passa il parametro a order_by. La funzione add_ordering() esegue questa operazione
def add_ordering(self, *ordering):
        """
        Add items from the 'ordering' sequence to the query's "order by"
        clause. These items are either field names (not column names) --
        possibly with a direction prefix ('-' or '?') -- or OrderBy
        expressions.

        If 'ordering' is empty, clear all ordering from the query.
        """
        errors = []
        for item in ordering:
            if isinstance(item, str):
                if '.' in item:
                    warnings.warn(
                        'Passing column raw column aliases to order_by() is '
                        'deprecated. Wrap %r in a RawSQL expression before '
                        'passing it to order_by().' % item,
                        category=RemovedInDjango40Warning,
                        stacklevel=3,
                    )
                    continue
                if item == '?':
                    continue
                if item.startswith('-'):
                    item = item[1:]
                if item in self.annotations:
                    continue
                if self.extra and item in self.extra:
                    continue
                # names_to_path() validates the lookup. A descriptive
                # FieldError will be raise if it's not.
                self.names_to_path(item.split(LOOKUP_SEP), self.model._meta)
            elif not hasattr(item, 'resolve_expression'):
                errors.append(item)
            if getattr(item, 'contains_aggregate', False):
                raise FieldError(
                    'Using an aggregate in order_by() without also including '
                    'it in annotate() is not allowed: %s' % item
                )
        if errors:
            raise FieldError('Invalid order_by arguments: %s' % errors)
        if ordering:
            self.order_by += ordering
        else:
            self.default_ordering = False
            

Il parametro passato a add_ordering() è un array.

Ad esempio, quando il parametro viene passato come segue: wolves = Wolf.objects.order_by( 'name' , 'id' ) In quel caso, l'applicazione convertirà la query nel database come segue:

SELECT "cve202135042_wolf"."id", "cve202135042_wolf"."name" FROM "cve202135042_wolf" ORDER BY "cve202135042_wolf"."name" ASC, "cve202135042_wolf"."id" ASC

Quando viene passato, la funzione add_ordering controlla ogni elemento dell'array; se è una string, viene verificata nei seguenti 5 casi:

  1. if '.' in item: Controlla se si tratta di una query con un nome di colonna e se quella colonna ha un nome di tabella specificato nell'istruzione SQL. Se sì, emette un avviso e continue.
  2. if item == '?': Se il valore dell'elemento è il carattere '?', il risultato dell'output viene ordinato casualmente, continue.
  3. if item.startswith('-'): Se l'elemento inizia con il carattere '-', il risultato della query viene ordinato in modo DESC (decrescente).
  4. if item in self.annotations: Controlla se contiene un commento; se sì, continue.
  5. if self.extra and item in self.extra: Determina se ci sono aggiunte extra e, in tal caso, continue.
Scarica lo strumento