XSS

定义

跨站脚本攻击(一种客户端代码注入攻击)

攻击者往web页面中插入恶意代码,当受害者的浏览器加载网站时代码会执行

成因

服务器对输入和输出没有做严格限制,导致攻击者构造的字符输出到前端时被浏览器执行当作有效代码解析执行从而产生了危害

输入可控,尝试把控制数据改为js代码,让浏览器解析执行

危害

JavaScript能做的事情就能通过XSS做

  1. 钓鱼欺骗
  2. 网站挂马
  3. 身份盗用
  4. 盗取网站用户信息
  5. 垃圾信息发送
  6. 劫持用户web行为
  7. xss蠕虫

分类

  1. 反射性

非持久型,攻击相对于受害者来说是一次性的,具体表现在受害者点击了含有恶意JS脚本的url,恶意代码并没有保存在目标网站,而web应用程序只是不加处理的把恶意脚本反射给受害者浏览器,导致受害者浏览器执行了相应的脚本

  1. 存储型

应用程序通过web请求获取不可信赖的数据,在未检验数据是否符合xss代码的情况下,便将其存入数据库,下一次从数据库获取该数据时也未对其进行过滤,页面再次执行xss代码持续攻击用户。

存储型XSS漏洞大多出现在评论区、留言板,用户提交了包含XSS代码的留言到数据库,当目标用户查询留言时,那些留言的内容会从服务器解析之后加载出来

  1. DOM型

不与后台服务器交互数据,也属于反射性的一种,通过dom操作前端输出的时候产生问题。

DOM(Document Object Model),是一个平台和语言都中立的接口,可以是程序和脚本能够动态访问和更新文档内容、结构以及样式。

漏洞利用

测试流程:看输出想输入在哪里,更改输入代码看执行(标签,过滤决定)

反射型

代码在url中

文件内容:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>XSS</title>
</head>
<body>
<form action="" method="get">
<input type="text" name="input">
<input type="submit">
</form>
<br>
<?php
$XssReflex = $_GET['input'];
echo 'output:<br>'.$XssReflex;
?>
</body>
</html>

浏览器访问,当用户输入什么,页面返回什么,没有对用户输入进行过滤

可以传入html代码,XSS代码->html代码(可以传入html标签)

传入

1

我们插入的XSS代码,可以让他出一个弹窗,可以执行JavaScript代码

dvwa靶场演示:

我们在两个浏览器分别登录dvwa的两个不同用户

攻击者构造payload,将url发送给受害者

受害者点击url后JavaScript代码执行

触发前提:受害者登录网站,点击恶意链接

存储型

dvwa靶场演示:

攻击者在留言板中插入xss代码,存储到数据库中

受害者每次访问都会出现弹窗

只有从数据库把插入的xss代码删除才会停止

DOM型

定义

DOM(Document Object Model)文档对象模型,是HTML和XML文档的编程接口

HTML DOM定义了所有HTML元素的对象和属性,以及访问它们的方法

HTML DOM是关于如何获取、修改、添加或删除HTML元素的标准

DOM以树结构表达HTML文档

DOM型XSS

不会与后台进行交互,是完完全全的web前端安全问题

客户端的脚本程序可以通过DOM动态地检查和修改页面内容,并不与服务端进行交互,而是从客户端获取DOM中的数据(如URL中数据)并在本地执行;其次,浏览器用户可以操作DOM中的一些对象,如URL、location等,当攻击者可以控制一些DOM对象,输入一些恶意JS代码,而客户端的脚本并没有对用户的输入进行有效的过滤,传入一些危险函数如eval等或直接输出到页面时,就会导致DOM型XSS漏洞的存在

浅析DOM型XSS [ Mi1k7ea ]

dvwa靶场演示

更改参数为XSS代码

?default=

其他类型XSS

MXSS

变异型跨站点脚本,是一种由HTML处理方式引起的安全漏洞。即使 Web 应用程序具有强大的过滤器来阻止传统的 XSS攻击,mXSS仍可能潜入其中。这是因为mXSS利用HTML行为中的特殊性,使数据清洗工具无法发现恶意元素。

现在基本没有

UXSS

https://juejin.cn/post/7031788659221200927

现在也基本见不到

UXSS是一种利用浏览器或者浏览器扩展漏洞来制造产生XSS的条件并执行代码的一种攻击类型。

CVE-2021-34506

Edge浏览器翻译功能导致JS语句被调用执行(网站提前插入XSS代码,本身无害化,但是经过该浏览器翻译功能一翻译,就会触发这个XSS代码)

SVG-XSS

SVG类型文件可以理解为和jpg、png类似的后缀图片格式,打开之后还是一个图片

SVG(Scalable Vector Graphics)是一种基于XML的二维矢量图格式,和我们平常用的jpg/png等图片格式所不同的是SVG图像在放大或改变尺寸的情况下其图形质量不会有所损失,并且我们可以使用任何的文本编辑器打开SVG图片并且编辑它,目前主流的浏览器都已经支持SVG图片的渲染。

复现:

svg图片文件内容:

poc:

<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />
<script>alert(1)</script>

只需要插入即可

将js代码插入svg文件中

payload:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />
<script>alert(1)</script>
</svg>

上传svg文件,xss代码被执行,形成svg-xss

访问上传后的svg文件地址,被解析执行

HTML-XSS

payload:

------WebKitFormBoundaryQBqxUDSihkjIckMP
Content-Disposition: form-data; name="file"; filename="test.html"
Content-Type: image/png

<!DOCTYPE html>
<html>

<body>

<script>
window.onload = function () {
alert('123');
};
</script>

</body>

</html>
------WebKitFormBoundaryQBqxUDSihkjIckMP--

PDF-XSS

复现:

1、创建PDF,加入动作JS

2、通过文件上传获取直链

3、直链地址访问后被触发

创建空白pdf

向空白pdf中插入js

app表示打开pdf的当前应用

浏览器打开该pdf,xss代码执行

在有文件上传的点时,上传该pdf,获取上传文件路径,访问即可触发xss

还可以使用python生成含有xss的pdf

from PyPDF2 import PdfReader, PdfWriter
# 创建一个新的 PDF 文档
output_pdf = PdfWriter()
# 添加一个新页面
page = output_pdf.add_blank_page(width=72, height=72)
# 添加js代码
output_pdf.add_js("app.alert('123');")
# 将新页面写入到新 PDF 文档中
with open("xss.pdf", "wb") as f:
output_pdf.write(f)

Flash-XSS(SWF-XSS)

1、反编译swf文件

2、查找触发危险函数

3、找可控参数访问触发

xss一是指执行恶意js,那么为什么说flash xss呢?是因为flash有可以调用js的函数,也就是可以和js通信,因此这些函数如果使用不当就会造成xss。

常见的可触发xss的危险函数有:getURL,navigateToURL,ExternalInterface.call(最多),htmlText,loadMovie等等

复现:

新建swf文件

随便选一个动画模板

F9进入代码区域,写入攻击payload

//取m参数
var m=_root.m;
//调用html中Javascript中的m参数值
flash.external.ExternalInterface.call(m);

ctrl+回车看看能否正常显示

设置好后点击发布设置,发布即可

实战中将我们制作好的swf文件上传,访问swf文件,给m参数传参js代码,使js代码执行

?m=alert(1)

如果没有文件上传点,可以先进行目录扫描,如果存在swf文件,对swf文件下载,使用JPEXS进行逆向分析

找ExternalInterface.call函数

这里就是jsobject这个变量,我们对这个变量传参

如果这里不是获取变量的值,而是写死了,用户不可控,就无法利用

Exif-XSS

可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。可使用鼠标右键进入属性页面查看部分信息。

复现:

有些网站有读取图片exif信息的功能,当网站读取到的恶意的exif信息就会触发这个payload,上面已经演示过了。

有些谷歌浏览器安装了EXIF Vewer插件,而chrome Exif Viewer插件获取图片exif信息的时候没有过滤,导致了XSS代码的执行。

https://blog.csdn.net/qq_32393893/article/details/104814749

攻击流程

反射型

  1. 发送带有XSS恶意脚本的链接
  2. 用户点击了恶意链接,访问了目标服务器
  3. 网站将XSS同正常页面返回到用户浏览器
  4. 用户浏览器解析了网页中的XSS恶意代码,向恶意服务器发起请求
  5. 黑客从自己搭建的恶意服务器中获取用户提交的信息

存储型

  1. 黑客在目标服务器上构造XSS恶意脚本,保存在数据库中
  2. 用户在网站登录状态下,访问了目标服务器,查看了存在恶意脚本的页面
  3. 网站将XSS同正常页面返回到用户浏览器
  4. 用户浏览器解析了网页中的XSS恶意代码,向恶意服务器发起请求
  5. 黑客从自己搭建的恶意服务器中获取用户提交的信息

常见事件处理程序

常见测试代码

<input onfocus=write('xss') autofocus>  
<img src onerror=alert('xss')> //图片加载错误时触发
<img src onclick=alert('xss')>
<svg onload=alert('xss') >
<script>alert('xss')</script>
<a href="javascript:alert('xss')">clickme</a>
</td><script>alert(123456)</script>
'><script>alert(123456)</script> //闭合
"><script>alert(123456)</script>
</title><script>alert(123456)</script>
<scrip<script>t>alert(123456)</scrip</script>t>
</div><script>alert(123456)</script>

多使用F12查看输入的内容显示在什么地方

防御

开启CSP

CSP(Content Security Policy)指的是内容安全策略,为了缓解很大一部分潜在的跨站脚本问题,浏览器的扩展程序系统引入了内容安全策略。CSP本质上是建立白名单,规定了浏览器只能够执行特定来源的代码,即使存在跨站脚本攻击漏洞,也不会加载来源不明的第三方脚本。

xss的攻击都要加载外部内容,开启CSP之后,无法加载外部资源,只能加载本地源

可以绕过CSP的情况只有:对方配置不正确,有的php文件中没有开启CSP

使用HttpOnly

HttpOnly是加在cookies上的一个标识,用于告诉浏览器不要向客户端脚本(document.cookie或其他)暴需cookie。当你在cookie上设置HttpOnly标识后,浏览器就会知到这是特殊的cookie,只能由服务器检索到,所有来自客户端脚本的访问都会被禁止。

只对Cookie有限制

php里设置HttpOnly

PHP.INI设置或代码引用

-session.cookie_httponly =1
-ini_set("session.cookie_httponly", 1);
-setcookie('', '', time() + 3600, '/xss', '', false, true);

开启HttpOnly的情况

如何判断是否启用HttpOnly

绕过HttpOnly:

(1) CVE-2012-0053

(2) PHPINFO页面/

(3) Flash/Java

太鸡肋,现在网络环境实现不了

遇到HttpOnly思路:

不获取Cookie采用方式(钓鱼,浏览器攻击框架等)

XSS Filter

对一些特殊字符进行代码层过滤

输入过滤

对用户提交的数据进行有效性验证,仅接受指定长度范国内并符合我们期望格式的的内容提交,阻止或者忽略除此外的其他任何数据。

输出转义

在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。htmlspecialchars():把预定义的字符转换为HTML实体。(可以将<>转义)

基于xss-lab的绕过

闭合双引号

分析:输入的内容被双引号带入

绕过:闭合

"><script>alert(1)</script><

实体化绕过(使用不被实体化的字符构造payload)

使用了htmlspecialchars()函数,实体化一些字符,但默认配置不过滤单引号,构造单引号payload

分析:闭合单引号

闭合后发现 符号实体化

标签为input,使用input的触发事件绕过(闭合单引号之后再进行绕过)

'onmouseover='alert(1)

鼠标滑过输入框,触发事件

实体化绕过

<>被过滤为空,双引号没有被过滤

使用双引号构造payload,用触发事件绕过

" onfocus="alert(1)

使用其他标签闭合

分析:script被过滤为scr_ipt

"><a href="javascript:alert(1)">test</a>

点击test触发事件绕过

大小写绕过

script被过滤,href也被过滤

使用大小写绕过

"><a hRef="javascript:alert(1)">test</a>

双写绕过

script被过滤为空

双写绕过

"><scrscriptipt>alert(1)</scrscriptipt><

Unicode

href标签的payload:<a href=”javascript:alert(1)”

都有过滤

使用Unicode编码

&#x006a&#x0061&#x0076&#x0061&#x0073&#x0063&#x0072&#x0069&#x0070&#x0074&#x003a&#x0061&#x006c&#x0065&#x0072&#x0074&#x0028&#x0031&#x0029

Unicode+内容检测绕过

不管输入什么,参数都没有传入,只有输入http之后参数才会传进去

猜测在传入href之前会判断字符串中有没有http://

加入http://

&#x006a&#x0061&#x0076&#x0061&#x0073&#x0063&#x0072&#x0069&#x0070&#x0074&#x003a&#x0061&#x006c&#x0065&#x0072&#x0074&#x0028&#x0031&#x0029;('http://')

(http://)只是为了绕过检测,是一个无效的函数调用,浏览器会忽略它,继续执行 alert(1)

hidden参数传递数据

源代码中多了这三行内容

有三个输入框,但是type为隐藏了

三个参数分别尝试,只有当传参?t_sort=1时,代码中才会接收到参数值

尝试构造payload

发现会过滤<>

使用事件触发

" onclick="alert('xss');">

并将type改为submit,点击按钮

Referer参数传递数据

仍然是只有t_sort可以接收到参数

修改type,发现t_ref接收返回值参数(Referer请求头参数)

尝试构造Referer的payload

闭合input标签

" type="text" onkeydown="alert('xss');">

是我们想要的结果,抓包之后再放包,页面出现文本框,触发事件

Ua参数传递数据

发现代码中变成t_ua,通过User-Agent传递数据

?t_link=1&t_history=2&t_sort=3 看是否能接收数据

依旧只有t_sort能够接收(这里谁接收都无所谓,因为有ua)

我们抓包修改ua头内容,构造payload

" type="text" onkeydown="alert('xss');">

出现文本框,说明构造成功

再抓包修改,放包,点击文本框,按下键盘,触发事件

Cookie参数传递数据

盲猜Cookie,抓包

果然,cookie中user的值传递给t_cook变量

修改cookie值构造payload

" type="text" onkeydown="alert(1)"

再抓包修改,放包,点击文本框,按下键盘,触发事件

exif-xss

该关的http://www.exifviewer.org/网址已经被弃用,无法复现

参考:

https://xz.aliyun.com/t/1206?accounttraceid=74ab404d-2a01-4a1c-8b87-36ad367dbe11&time__1311=eqGhqfxmxAxRhEDlrmq0%3DGOR3%3Dq7qRH9vpD#toc-12

ng-include

空格被过滤(%0a绕过)

?keyword=test

test被写入

标签中

尝试闭合

</center><script>alert(1)</script><center>

输入的/、script被过滤为空

双写、大小写都不能绕过,Unicode也不能绕过

script、空格和/时转译成&nbsp

用回车的url编码%0a代替空格

<img%0asrc=x%0aonerror="alert(1)">

center标签不用闭合

embed标签

embed标签已经被弃用,不复现

level17.php?arg01=a&arg02=%20onmouseover=alert(2)

后几题都是embed标签