一、XSS漏洞原理
1.概述
XSS被称为跨站脚本攻击(Cross Site Scripting),由于和层叠样式表(Cascading Style Sheets,CSS)重名,改为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!
主要基于JavaScript语言进行恶意攻击,因为js非常灵活操作html、css、浏览器。
2.利用方式
利用网页开发时web应用程序对用户输入过滤不足导致将恶意代码注入到网页中,使用户浏览器加载并执行恶意代码,通常是JavaScript类型,也包括java、vbs、flash、html等。
3.执行方式
用户浏览被XSS注入过的网页,浏览器就会解析这段代码,就被攻击了。因为浏览器当中有JavaScript解析器,浏览器不会判断代码是否恶意,只要符合语法规则,就直接解析了。
4.攻击对象
客户端攻击,对象大多为用户,网站管理员。
还有微博,网页留言板,聊天室等收集用户输入的地方。
5.XSS危害
(1)窃取cookie
因为大部分人喜欢将密码储存到浏览器当中,所以黑客一般渗透的时候就会先来浏览器查看已保存的cookie 来盗取各种用户账号
(2)未授权操作
js特性很强大,黑客会直接代替用户在html进行各类操作。比如劫持会话,刷流量,执行弹窗广告,还能记录用户的键盘输入。
(3)传播蠕虫病毒
6.简单代码
bash
<?php
$input = $_GET["XSS"];
echo "<div>".$input."</div>";
?>
在这段PHP代码中 主要具有两个功能:
1.获取用户输入 :input = _GET["XSS"]
;这行代码的作用是从 HTTP GET 请求的参数中获取名为XSS的参数值 。比如访问 http://yourdomain.com/yourscript.php?XSS=test 时,$input 变量就会被赋值为 test 。2.输出内容到页面 :echo "
".input.""`;` 会把获取到的 input 变量的值,包裹在标签里,输出到页面的 HTML 中,最终在浏览器渲染后,会以包含对应内容的形式展示。但是这段代码存在 反射型 XSS(跨站脚本攻击)漏洞 :
因为它直接把用户可控的
GET参数(未做任何过滤、转义处理)拼接到 HTML 输出里。如果攻击者构造恶意请求,比如让用户访问 http://yourdomain.com/yourscript.php?XSS= ,当页面执行 echo 输出时,浏览器会把 ,然后提交表单。submit.php页面将攻击者输入的数据未经处理直接插入到数据库中。当管理员访问 view.php页面查看留言时,浏览器从服务器获取到包含恶意脚本的留言数据,并将其渲染到页面中。由于浏览器会执行页面中的 JavaScript 代码,所以恶意脚本被执行,弹出 "你被 XSS 攻击了!" 的警告框。如果攻击者将恶意脚本编写得更复杂,例如,还可以将管理员的 Cookie 等敏感信息发送到攻击者的服务器,进而可能实现会话劫持等更严重的攻击。修复方法:
- 在submit.php页面中,对用户输入的数据进行严格的过滤和转义,使用htmlspecialchars函数将特殊的 HTML 字符转换为 HTML 实体,例如:
php$name = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF - 8'); $message = htmlspecialchars($_POST['message'], ENT_QUOTES, 'UTF - 8');
- 在view.php页面中,同样对从数据库中取出并要输出到页面的数据进行转义处理,再进行显示,以确保恶意脚本不会被执行。
3.DOM型XSS
DOM XSS 比较特殊。 owasp 关于 DOM 型 XSS 的定义是基于 DOM 的 XSS 是一种 XSS 攻击,其中攻击的payload 由于修改受害者浏览器页面的 DOM 树而执行的。其特殊的地方就是 payload 在浏览器本地修改DOM 树而执行,并不会传到服务器上,这也就使得 DOM XSS 比较难以检测。
原理
基于文档对象模型(DOM)的一种漏洞。这种XSS与反射型XSS、存储型XSS有着本质的区别,它的攻击代码不需要服务器解析响应,触发XSS依靠浏览器端的DOM解析,客户端的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获取数据并执行。
特点
- 不经过服务器:恶意脚本的注入和执行完全在前端完成,服务器未参与数据存储或输出,因此传统的服务器端过滤可能失效。
- 依赖前端 JavaScript :漏洞根源是前端代码对 DOM 操作的不安全处理,需重点关注innerHTML、outerHTML、document.write()等危险 API 的使用。
非持久性
数据流量:URL--->浏览器
案例
场景假设:
一个简单的网页,功能是 "搜索结果展示":用户输入搜索关键词后,页面通过 JavaScript 直接从 URL 的search参数中读取内容,并动态插入到页面 DOM 中,用于显示 "您搜索的内容是:XXX"
漏洞代码(前端 HTML)
html<!DOCTYPE html> <html> <head> <title>DOM型XSS示例</title> </head> <body> <h1>搜索结果</h1> <!-- 显示搜索关键词的区域 --> <div id="searchResult"></div> <script> // 从URL中获取search参数的值(例如:?search=test) function getParameter(name) { const urlParams = new URLSearchParams(window.location.search); return urlParams.get(name); } // 直接将参数值插入到页面DOM中 const searchTerm = getParameter('search'); document.getElementById('searchResult').innerHTML = `您搜索的内容是:${searchTerm}`; </script> </body> </html>漏洞分析
代码的核心问题在于:通过innerHTML直接将用户可控的search参数值插入到 DOM 中,且未做任何过滤或转义。
- innerHTML会将内容解析为 HTML 并执行其中的脚本,而非当作纯文本处理。
- 用户输入的内容(通过 URL 参数search传递)完全可控,攻击者可构造恶意脚本。
攻击过程
1.攻击者构造恶意 URL :
攻击者在search参数中插入恶意 JavaScript 代码,例如:
htmlhttp://example.com/search.html?search=<script>alert('DOM XSS攻击成功')</script>2.受害者访问 URL :
当受害者点击该 URL 时,页面通过 JavaScript 读取search参数的值,并通过innerHTML插入到searchResult节点中。
3.恶意脚本执行 :
浏览器解析页面时,会将