聚焦源代码安全,网罗国内外最新资讯!
编译:代码卫士
故事是这样开始的。在研究过程中,我搭建了上述框架的本地实例并对它们进行利用。虽然很多实例被指易受攻击,但 Tornado 实例引起了我的注意,因为 Tornado 的维护人员表示他们正通过 Python 的标准库解析该 URL。
当我查看 Python 源代码时,发现该漏洞比我之前想得更为严重:所有使用 Python 标准库的数据包均易受攻击。
模块 urlparse 将分号 “;” 视作一个分隔符,然而多数代理仅将 “&” 视作分隔符。这意味着当攻击者能够使用分号分隔查询参数时,可能会引发代理(以默认配置运行)和服务器之间对请求解释有所不同,从而导致恶意请求被缓存为安全请求。
GET /?link=http://google.com&utm_content=1;link='><t>alert(1)</script> HTTP/1.1Host: somesite.comUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,imag e/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflateAccept-Language: en-US,en;q=0.9 Connection: close
Urlparse 有三个参数:link、utm_content,以及另外一个 link。另一方面,代理认为完整字符串 1;link='><t>alert(1)</script> 是 utm_content 的值,这就是为何该缓存密钥仅包含 somesite.com/?link=http://google.com。
我立即联系 Python 安全团队并设立了一个漏洞工单,同时创建了 CPython 仓库上的 pull 请求。经过一个月与公关的拉锯战后,2月15日被合并且在2月19日发布。解决方案已经向后兼容更老旧的 Python 版本。
这件事说明,我们必须更加深入挖掘。你认为自己已经找到不错的东西了?推翻自己的假设并思考根因,尝试更深入地挖掘,就可能会发现更精彩的结果。
https://www.tldr.engineering/how-i-found-and-fixed-a-vulnerability-in-python/
题图:Pixabay License
本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。
觉得不错,就点个 “在看” 或 "赞” 吧~

