I found (and fixed) a vulnerability in Python
tldr.engineering
tldr.engineering
It seems it's because you're supposed to encode semicolons. So while urllib.parse is doing the wrong thing, it doesn't come up much in practice because urllib.parse.urlencode() encodes the semi-colon as %3B.
"Let strings be the result of strictly splitting the string payload on U+0026 AMPERSAND characters"
From: https://www.w3.org/TR/2014/REC-html5-20141028/forms.html#url...
They removed the old 1999 guidance that said "in particular, CGI implementors support the use of ";" in place of "&" to save authors the trouble of escaping "&" characters in this manner."
As it turns out, the issue was in urllib.parse, a library that ships with python.
That's what I thought the article was about.
> If any of the name-value pairs in pairs have a name component consisting of the string "_charset_" encoded in US-ASCII, and the value component of the first such pair, when decoded as US-ASCII, is the name of a supported character encoding, then let encoding be that character encoding (replacing the default passed to the algorithm).
Ouch. I hope nobody actually implements that.
But googling a bit does show it's supported in a lot of software.
For example: https://bugzilla.mozilla.org/show_bug.cgi?id=18643
Flask (or rather Werkzeug what it's based on) removed implicit semicolon support for URL 13 years ago: https://github.com/pallets/werkzeug/commit/0ea28bbc6f5f05eef...
Bottle does use parts of urllib but appears to do it's own splitting on ampersands: https://github.com/bottlepy/bottle/blob/d1413a81ead7a6f130a0...
https://www.w3.org/TR/REC-html40/interact/forms.html#form-co...
Thankfully that did not happen (widespread), and now people understand they have to escape.
I do remember jsessionid being after the semi-colon..
This is really about caching proxies. If the proxy attempts to cache based on some attributes of the request, then it has a lot of request normalizing it needs to do. Some more examples of things that some languages (in this case Go) may parse differently than some web proxies: https://github.com/golang/go/issues/25192#issuecomment-80625...
And a more overall argument that putting this "vulnerability" on the language library (in Python and Go) does not make the most sense: https://github.com/golang/go/issues/25192#issuecomment-79685...
As we’ve seen with multiple other vulnerabilities this can be very fragile. Especially when the complexity of the protocol grows, the recent saml signature mixups being a good example of such https://news.ycombinator.com/item?id=28064835
If your auth/proxy parses some parameters used by both the proxy and the app it should forward what it parsed, not the original unparsed data. Only exception is a cache or a best-effort-firewall, but then it’s no longer a vulnerability, just an ordinary bug.
https://www.reddit.com/r/programming/comments/rosx5i/comment...
I hope they didn’t fix one bug without considering its impact to other features.