XSS是指攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。
XSS属于客户端攻击,攻击者可能会利用XSS进行跳板,并实施攻击。
1️⃣ XSS原理解析
XSS攻击是在网页中嵌入客户端恶意脚本代码(通常使用JavaScript进行脚本的编写)。
存在XSS漏洞的网站,就可以盗取用户Cookie、黑掉页面、导航到恶意网站,而攻击者需要做的仅仅是向Web页面中注入JavaScript代码。
以下是一个简单的 XSS 注入示例代码:
HTML
<!DOCTYPE html>
<html>
<body>
<input type="text" id="userInput">
<button οnclick="showMessage()">提交</button>
<div id="message"></div>
<script>
function showMessage() {
var userText = document.getElementById('userInput').value;
document.getElementById('message').innerHTML = userText;
}
</script>
</body>
</html>
在上述代码中,如果用户在输入框中输入 <script>alert('XSS 攻击!')</script>
并点击提交,就会触发 XSS 攻击,弹出一个警告框。
2️⃣ XSS类型
XSS主要被分为三类,分别是:反射型、存储型和DOM型。
🌟 反射型XSS
当用户访问一个带有XSS代码的URL请求时,服务器端接收数据后处理,然后把带有XSS代码的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,最终造成XSS漏洞。这个过程就像一次反射,故称为反射型XSS,也被称为非持久性XSS。
以下是一个简单的反射型 XSS 攻击的例子:
假设存在一个网站,用户可以在搜索框中输入内容进行搜索,然后服务器会将用户输入的内容直接显示在搜索结果页面上。
攻击者构造了以下恶意的搜索输入:
<script>alert('XSS 攻击成功!')</script>
当用户输入上述恶意内容并提交搜索请求时,服务器未对输入进行适当的清理和验证,直接将其返回并显示在搜索结果页面中。浏览器会将嵌入的 <script>
标签视为有效脚本并执行其中的 alert
函数,弹出 "XSS 攻击成功!" 的提示框。
这就是一个基本的反射型 XSS 攻击示例,通过诱使用户访问包含恶意输入的特定页面,从而实现攻击。
🌟 存储型XSS
允许用户存储数据的Web应用程序都可能会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当攻击者再次访问某个页面时,这段XSS代码被程序读出来响应给浏览器,造成XSS跨站攻击,这就是存储型XSS,也被称为持久性XSS。
存储型XSS,具有更高的隐蔽性、而且无需手动触发。
以下是常见的存储型XSS的场景:
先确认输入输出点,例如在一个留言板显示区域,确认内容的输出区域是否在标签内,如果显示的内容在属性标签内,那么XSS代码就不会被执行,如:
XML
<input type="text" name="content" value="<script>alert('XSS攻击')</script>"/>
以上代码就是因为xss代码在value属性内,那么这个恶意代码就不会被执行,仅仅会把内容显示出来而已。
在知道了输出点之后,就可以根据相应的标签构造HTML代码来闭合,插入XSS代码,最终在HTML文档中为:输入的代码为:""/><script>alert('XSS攻击')</script>"
XML
<input type="text" name="content" value=""/><script>alert('XSS攻击')</script>"/>
这样就可以闭合input标签,使输出的内容不在Value属性中,从而造成XSS跨站漏洞。
🌟 DOM XSS
使用DOM可以允许程序和脚本动态地访问和更新文档的内容、结构和样式。
DOM为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。根据DOM规定,HTML 文档中的每个成分都是一个节点。
DOM本身就代表文档的意思,而基于DOM型的XSS是不需要与服务器端交互的,它只发生在客户端处理数据阶段。
以下是一个典型的 DOM 型 XSS 示例:
HTML
<!DOCTYPE html>
<html>
<body>
<input type="text" id="inputText">
<button οnclick="showMessage()">显示消息</button>
<script>
function showMessage() {
var inputValue = document.getElementById('inputText').value;
document.getElementById('result').innerHTML = inputValue;
}
</script>
<div id="result"></div>
</body>
</html>
在上述示例中,如果用户在输入框中输入**<script>alert('XSS 攻击')</script>
**,然后点击"显示消息"按钮,恶意脚本就会被执行,弹出"XSS 攻击"的警告框。这是因为输入的值被直接插入到页面的 DOM 中并被解释为脚本。
🌈 以上便是XSS的原理以及常见的XSS的分类。