在开始这一起程之前,我已经创造了一个 CVE:Apache Spark 中的存储型 XSS 漏洞。大约去年 7 月,我决定再次开始探求更多 CVE。
这篇博文涵盖了我在 2023 年伦敦 Black Hat Europe 上资助的演讲的一些方面,题为“大规模 CVE 创造:通过源代码剖析简化繁芜漏洞”,更详细地先容了我探求 CVE 的方法以及我如何找到 CVE。首先提出了方法论。
但从哪里开始以及如何开始呢?
我决定从 PHP(以及后来的 Node.js 和 .NET)运用程序开始,并随机选择从金融领域开始。基于此,我搜索了该领域比较盛行且干系的开源项目。对我来说,空想情形下,这意味着GitHub 上至少有几百颗星、10k+ 下载量(例如来自 NPM 或 GitHub)以及最近的提交(我不想报告尚未掩护的项目的 CVE)从 2014 年起)。由于我知道我不能花太多韶光,以是我最初克隆了各种有趣的项目,并首先对它们进行了一些基本的字符串搜索,以决定是否该当仔细研究它们。

这意味着诸如"SELECT 、"INSERT 、exec(、echo $(即 SQL 注入、XSS、操作系统命令注入等)之类的搜索,并且险些浏览所有命中的代码行。利用这种方法,我可以在很短的韶光内检讨出随意马虎实现的目标。我的想法是,一旦创造源代码中的潜在漏洞,就对项目实行适当的白盒渗透测试。而且,令我惊异的是,这种方法效果非常好!
Economizzer( https://github.com/gugoan/economizzer ) 是一名个人理财经理。"SELECT通过在项目中搜索Economizzer,我得到了一个看起来很有趣的结果:
看起来像是$category_id直接来自 URL,并且连接到 SQL 查询中,无需任何验证或准备好的语句!
此时,我知道我将对其实行适当的渗透测试,Economizzer并且能够利用 SQL 注入,统共创造了 7 个 CVE。
这让我思考:如果我可以优化我的搜索并在大量项目中实行它们会若何?
(到目前为止,我还没有完备弄清楚如何大规模扩展,只是克隆了很多项目并利用 VSCode 进行搜索)
提出得当的 GitHub Dorks此时,我开始考虑一些好的搜索词,并利用 ChatGPT 帮助我为 Github Dorks 制校勘则表达式。一些例子是:
PHP XSS:或 /\becho\b.\$_GET\b/ /echo\s+\$_REQUEST/PHP 跨站脚本攻击:/^.\becho\s+\$_GET\b.$/PHP XSS(最随意马虎涌现 FP):/^.\becho\s+\$\b.$/PHP SQL 注入: /(SELECT|INSERT|UPDATE|DELETE)\s(.\$_POST|.\$_GET|.\$_REQUEST)/PHP 操作系统命令注入: /(exec\(|system\(|shell_exec\(|passthru\()(.\$_POST|.\$_GET|.\$_REQUEST)/还有,我最喜好的,主机头注入(Node.js 和 PHP):req.headers.host path:pass和 /\$_SERVER\['host'\]|gethostname\(\).(reset|forgot)/.NET 主机标头注入:/(Request\.Headers\["Host"\]|Request\.Host\.Value|HttpContext\.Current\.Request\.Headers\["Host"\]|HttpContext\.Request\.Host\.Value)/ forgot主机头注入通用:host path:/forgot/PHP 中的不屈安反序列化:/(unserialize\()(.\$_POST|.\$_GET|.\$_REQUEST)/那么这到底是怎么回事呢?
第一个在同一行上搜索$_GETand或分别搜索and (这将是 XSS 的紧张候选者)。第二个更明确一点,它搜索. 第三个搜索,这当然很随意马虎涌现 FP,但可能会让您找到更繁芜的 XSS。下一个搜索字符串, , or , 与,或在同一行(这将是 SQL 注入的强烈指示)。下一个查找, ,或,与,或组合(即操作系统命令注入的候选者)。不过我在这方面没有任何运气。接下来的,也是我最喜好的,在忘却密码功能中检讨主机标头注入的迹象(例如,第一个在其名称中包含的文件中查找)。末了一个在 PHP 中查找不受信赖的反序列化。echo$_REQUESTechoecho $_GETecho $SELECTINSERTUPDATEDELETE$_GET$_POST$_REQUESTexec(system(shell_exec(passthru($_GET$_POST$_REQUESTreq.headers.hostpass
我在 GitHub 搜索中利用了这些正则表达式,结果效果很好。
您可以利用这些 dork 中的任何一个,只需将它们放入 GitHub 搜索即可:
观点证明 — 1:couch-auth
couch-auth( https://www.npmjs.com/package/@perfood/couch-auth ) 是一个 NPM 库,它利用 CouchDB 或 Cloudant 处理 NodeJS/Express 的用户身份验证,大约有 20k NPM 下载量(在撰写本文时)。
它在忘却密码功能中存在主机标头注入漏洞,许可攻击者重置任何用户的密码。为此,您可以发送如下要求:
POST /auth/forgot-password HTTP/1.1Host: attacker-controlled.com[redacted for brevity]
{ “email”: “joesmith@example.com” }
这将发送一封密码重置电子邮件,其 URL 类似于https://attacker-controlled.com/password-reset/<token>。如果受害者点击该链接,密码重置令牌将透露给攻击者,这将许可他们重置密码。请把稳,某些电子邮件客户端(例如 Outlook)可能会自动检讨电子邮件中的所有链接以检讨是否存在恶意内容。这意味着乃至不一定须要用户交互来透露密码重置令牌,由于会自动单击链接。
该漏洞的缘故原由因此下 Nunjucks 模板,该模板用于呈现密码重置电子邮件:
我通过多个 GitHub Dorks 创造了这个漏洞:
首先,通过req.headers.host path:pass并且req.headers.host password-reset还透露了我得到了针对此漏洞的另一个 CVE。
现在我知道您可能在想什么:Nunjuck 模板不是也随意马虎受到 SSTI 的影响吗?嗯,我便是这么想的。但事实证明,只要不该用“安全”管道(如{{ username | safe }}),Nunjuck 就可以很好地清理数据。
观点证明 — 2:phpPgAdmin我们得到的另一个有趣的点击是phpPgAdmin(https://github.com/phppgadmin/phppgadmin)。为此,我们利用 PHP 不受信赖的反序列化 dork 并得到:
这只是该项目中的多个反序列化漏洞之一,并为我带来了另一个 CVE。
观点验证 — 3:PHP 登录系统我最喜好看的项目类型之一是用户管理库。因此,我检讨了PHP-Login-System(https://github.com/msaad1999/PHP-Login-System),并利用了上面列表中更随意马虎涌现 FP 的 XSS 正则表达式:/^.\becho\s+\$\b.$/。
这给了我这个打击(当然还有其他许多打击):
我很高兴地承认这是一个幸运的结果,由于这个搜索结果向我们展示了 XSS 漏洞的全体数据流(如上面 GitHub 供应的预览,显示了从源到吸收器的全体数据流)。
这两个 XSS 漏洞都可以轻易被利用。
观点验证 —4:openSIS-ClassicopenSIS-Classic当我利用 SQL 注入正则表达式时弹出:/(SELECT|INSERT|UPDATE|DELETE)\s(.\$_POST|.\$_GET|.\$_REQUEST)/
仅这一击就足以让我决定对 进行适当的评估openSIS-Classic。终极,由于我无法绕过某些字符块列表,我无法利用 SQL 注入。不过,我在其他地方创造了7个CVE。
这让我对我的研究有了一个主要的不雅观察:具有代码安全味道的 Web 运用程序(例如不该用准备好的语句而是利用一些字符块列表的 SQL 查询)很可能在其他地方存在漏洞。
观点验证 — 5:领先上风我们看的下一个项目是Head Start(https://github.com/OpenKnowledgeMaps/Headstart)。利用/\becho\b.\$_GET\b/给我带来了两个有趣的点击:
两者终极都成为可轻易利用的 XSS 漏洞。
观点验证 — 6:OpenSTAManager现在让我们看一个大略的 XSS:OpenSTAManager(https://github.com/devcode-it/openstamanager)。利用个中一个 XSS 正则表达式,/^.\becho\s+\$_GET\b.$/我创造了另一个 XSS 漏洞:
末了的话
我写这篇文章的缘故原由是为了证明,只要有一点创造力,你就可以创造大量的漏洞——纵然是在盛行的开源项目中。
当然,您可以(而且该当!
)针对不同的漏洞提出更多的 GitHub Dork ,并针对不同的编程措辞进行调度。此外,始终运行运用程序并确认可利用性也很主要。您不能只是启动 GitHub 搜索,找到一些可能存在漏洞的源代码,然后将其报告为漏洞 - 您必须证明可利用性!