一、基础知识
-
XSS概述:XSS是一种Web安全漏洞,它允许攻击者将恶意脚本注入到受害者的Web应用程序中,从而在用户的浏览器中执行该脚本。这种攻击可以导致各种问题,包括窃取用户登录凭据、会话劫持、网页篡改等。
-
XSS类型:
- 存储型XSS:攻击者将恶意脚本存储在目标应用程序的数据库中,当其他用户访问包含恶意脚本的页面时,脚本将被执行。
- 反射型XSS:恶意脚本作为参数附加到URL中,当用户点击包含恶意脚本的链接时,脚本将被执行。
- DOM型XSS:恶意脚本通过修改浏览器的DOM(文档对象模型)而被触发执行,通常是通过修改URL的锚点或操作网页的JavaScript代码来实现。
-
攻击场景:
- 在用户输入点未经充分过滤的情况下,将恶意脚本注入到受害者的浏览器中,例如在表单输入、URL参数、Cookie等地方。
- 在页面中未正确转义或过滤用户提供的数据,使得恶意脚本能够在页面上执行。
-
XSS防御:
- 输入过滤和验证:对于用户输入,使用合适的输入验证和过滤机制,例如限制特殊字符、移除或转义HTML标签等。
- 输出转义:确保从服务器输出到页面的内容进行适当的HTML编码,以防止恶意脚本的执行。
- 内容安全策略(Content Security Policy,CSP):使用CSP来限制页面上可以加载和执行的资源,包括脚本、样式表和图像等。
- HttpOnly标志:在设置Cookie时,使用HttpOnly标志,以防止恶意脚本通过JavaScript访问敏感Cookie数据。
- 验证和授权:对于涉及用户敏感操作的请求,进行适当的验证和授权,以防止未经授权的恶意操作。
-
XSS漏洞利用:
- 攻击者可以注入恶意脚本来窃取用户的敏感信息,如登录凭据、会话Cookie等。
- 攻击者可以通过篡改网页内容来欺骗用户,例如伪造登录表单、显示虚假信息等。
- 攻击者可以利用XSS漏洞进行会话劫持、钓鱼攻击和网站挂马等进一步攻击。
二、基础示例
1.反射性XSS
<!-- 攻击者构造的恶意URL -->
http://example.com/search?query=<script>alert('XSS')</script>
<!-- 受害者点击带有恶意脚本的链接 -->
<a href="http://example.com/search?query=<script>alert('XSS')</script>">Click me!</a>
<!-- 当用户点击链接时,恶意脚本被执行 -->
<!-- 受害者搜索功能 -->
<form action="/search" method="GET">
<input type="text" name="query">
<input type="submit" value="搜索">
</form>
<!-- 攻击者构造的恶意链接 -->
<!-- 如果搜索结果页面没有对查询参数进行过滤或转义,恶意脚本将在页面中执行 -->
<a href="/search?query=<script>alert('XSS')</script>">点击这里</a>
2.存储型XSS
<!-- 受害者留言功能 -->
<form action="/comment" method="POST">
<textarea name="message"></textarea>
<input type="submit" value="提交">
</form>
<!-- 攻击者提交的恶意留言 -->
<!-- 如果应用程序未对存储的留言进行过滤或转义,恶意脚本将在其他用户访问留言时执行 -->
<script>alert('XSS')</script>
3.DOM型XSS
<!-- 攻击者构造的恶意URL -->
<!-- 如果目标页面使用JavaScript获取URL中的参数并将其插入到DOM中,恶意脚本将被触发执行 -->
http://example.com/page#<img src="x" onerror="alert('XSS')">
<!-- 当用户访问URL时,恶意脚本将被执行 -->
三、常用函数
常用的XSS函数和代码示例:
- JavaScript中的
encodeURIComponent()
函数:用于对用户输入进行URL编码,以防止恶意脚本注入。
var userInput = "<script>alert('XSS')</script>";
var encodedInput = encodeURIComponent(userInput);
var url = "/search?query=" + encodedInput;
PHP中的htmlspecialchars()
函数:用于将特殊字符转义为HTML实体,以防止恶意脚本注入。
$userInput = "<script>alert('XSS')</script>";
$escapedInput = htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
echo $escapedInput;