VYPR
Moderate severityNVD Advisory· Published Jul 29, 2024· Updated Nov 3, 2025

HTML injection in HTTP redirect body

CVE-2024-41810

Description

Twisted is an event-based framework for internet applications, supporting Python 3.6+. The twisted.web.util.redirectTo function contains an HTML injection vulnerability. If application code allows an attacker to control the redirect URL this vulnerability may result in Reflected Cross-Site Scripting (XSS) in the redirect response HTML body. This vulnerability is fixed in 24.7.0rc1.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
twistedPyPI
< 24.7.0rc124.7.0rc1

Affected products

1

Patches

1
046a164f89a0

Merge commit from fork

https://github.com/twisted/twistedAdi RoibanJul 29, 2024via ghsa
4 files changed · +41 2
  • src/twisted/web/newsfragments/12263.bugfix+1 0 added
    @@ -0,0 +1 @@
    +twisted.web.util.redirectTo now HTML-escapes the provided URL in the fallback response body it returns (GHSA-cf56-g6w6-pqq2). The issue is being tracked with CVE-2024-41810.
    \ No newline at end of file
    
  • src/twisted/web/newsfragments/9839.bugfix+1 0 added
    @@ -0,0 +1 @@
    +twisted.web.util.redirectTo now HTML-escapes the provided URL in the fallback response body it returns (GHSA-cf56-g6w6-pqq2, CVE-2024-41810).
    
  • src/twisted/web/_template_util.py+1 1 modified
    @@ -92,7 +92,7 @@ def render_GET(self, request):
         </body>
     </html>
     """ % {
    -        b"url": URL
    +        b"url": escape(URL.decode("utf-8")).encode("utf-8")
         }
         return content
     
    
  • src/twisted/web/test/test_util.py+38 1 modified
    @@ -5,7 +5,6 @@
     Tests for L{twisted.web.util}.
     """
     
    -
     import gc
     
     from twisted.internet import defer
    @@ -64,6 +63,44 @@ def test_redirectToUnicodeURL(self):
             targetURL = "http://target.example.com/4321"
             self.assertRaises(TypeError, redirectTo, targetURL, request)
     
    +    def test_legitimateRedirect(self):
    +        """
    +        Legitimate URLs are fully interpolated in the `redirectTo` response body without transformation
    +        """
    +        request = DummyRequest([b""])
    +        html = redirectTo(b"https://twisted.org/", request)
    +        expected = b"""
    +<html>
    +    <head>
    +        <meta http-equiv=\"refresh\" content=\"0;URL=https://twisted.org/\">
    +    </head>
    +    <body bgcolor=\"#FFFFFF\" text=\"#000000\">
    +    <a href=\"https://twisted.org/\">click here</a>
    +    </body>
    +</html>
    +"""
    +        self.assertEqual(html, expected)
    +
    +    def test_maliciousRedirect(self):
    +        """
    +        Malicious URLs are HTML-escaped before interpolating them in the `redirectTo` response body
    +        """
    +        request = DummyRequest([b""])
    +        html = redirectTo(
    +            b'https://twisted.org/"><script>alert(document.location)</script>', request
    +        )
    +        expected = b"""
    +<html>
    +    <head>
    +        <meta http-equiv=\"refresh\" content=\"0;URL=https://twisted.org/&quot;&gt;&lt;script&gt;alert(document.location)&lt;/script&gt;\">
    +    </head>
    +    <body bgcolor=\"#FFFFFF\" text=\"#000000\">
    +    <a href=\"https://twisted.org/&quot;&gt;&lt;script&gt;alert(document.location)&lt;/script&gt;\">click here</a>
    +    </body>
    +</html>
    +"""
    +        self.assertEqual(html, expected)
    +
     
     class ParentRedirectTests(SynchronousTestCase):
         """
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

6

News mentions

0

No linked articles in our index yet.