xss的过滤和绕过(2)

xss的过滤和绕过

分类

过滤主要有两层,分别为WAF层和代码层,WAF(web应用防火墙)通常是在外部,在主机或者网络硬件上,对HTTP请求进行过滤拦截,而代码层是在编写web应用的过程中,直接实现或者音乐第三方库,对用户输入进行过滤,但是JavaScript语法非常灵活,所以对于普通的正则匹配,字符串比较,很难拦截xss。

1.富文本过滤

在发送邮件或者博客的情景下,用户有需求实现富文本的编辑,比如插入超链接,图片,视频等资源。为了实现这种富文本编辑,大多数编辑器都允许用户直接编辑HTML,插入比如video标签,根据我们之前提到的xss的基本原理,这就引入了xss漏洞。常见的过滤方式是用户输入的标签进行限制,如果采用黑名单的方式,我们可以寻找黑名单中遗漏的标签,在https://portswigger.net/web-security/cross-site-scripting/cheat-sheet这个表中列举了大量的可以用于执行JavaScript的标签和属性,并给出了适用于哪些浏览器

如果过滤器本身存在缺陷,比如将黑名单内容替换为空,我们可以采用喜闻乐见的双写绕过(只适用于非常简单的一种情况)

```php

<?php

function filter($payload){

data=str_replace("script","",payload);

return $data;

}

name=filter(_GET['name']);

echo "hello $name";

```

这段代码试图通过str_replace函数移除"script"字符串,输入name=name=<scriscriptpt>alert('xss')</scricriptpt>

2.注入点在标签属性中

如果没有过滤"<"和">",可以直接引入新的标签,如果尖括号被过滤,可以插入新的事件属性,比如onload,onmousemove等。而且标签的属性字段支持HTML编码,可以通过这个来绕过一些过滤。

比如

```

< img src=x οnerrοr="&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;">

```

这里onerror的内容就是对alert(1)进行HTML编码之后的结果,最后仍然可以成功触发弹窗。

src=x表示一个不存在路径,然后onerror,需要用一些工具对这个字符串进行HTML编码,通过HTML编码绕过过滤

3.注入点在script标签中

如果注入点被引号包裹,可以像绕过sql注入一样,先闭合引号再用分号结束语句之后插入代码

如果引号也被过滤,且一行存在两个注入点的情况下

var url = 'http://xxxx/?name=\<?=name?\>'+'\address?>'

可以用反斜杠使得第一个引号被转义,从第二个引号开始插入我们的代码

var url = 'http://xxxx/?name=\\'+';alert(1);\\\\'

如果存在单词黑名单,比如不允许出现eval等字符,可以使用unicode编码绕过

4.CSP过滤及其绕过

1.CSP(Content Security Policy,内容安全策略)是一个额外的安全层,用于检测并缓解某些特定类型的注入,包括XSS和数据注入等。

CSP被设计成完全向后兼容。不支持CSP的浏览器会忽略相关策略,并正常运行,采用默认的同源策略。

为了使CSP可用,需要配置HTTP头部配置Content-Security-Policy字段,除此之外还可以使用Meta标签来配置该策略。

从前面的例子可以看出,XSS防御绝非易事,CSP应运而生。CSP可以看作是为了防备XSS,额外添加的一些页面渲染和javascript执行的规则。

具体的策略文档可以在https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy这里找到

2.如果我们配置下面的请求头

```php

<?php

header("Content-Security-Policy;script-src'self'");

?>

```

这表示CSP策略要求,网站的script来源只能是当前域名下的资源,内联和外链的script将禁止执行。

3.Content-Security-Policy: <policy-directive>;<policy-directive>

指令:获取指令、文档指令、导航指令

connect-src 定义了请求、XMLHttpRequest、WebSocket 和 EventSource 的连接来源

font-src 设置允许通过@font-face加载的字体源地址

frame-src 设置允许通过类似<frame>和<iframe>标签加载的内嵌内容的源地址

img-src 限制图片和图标的源代码

child-src 定义了web workers以及嵌套的浏览上下文(如<frame>和<iframe>)的源

media-src 限制通过<audio> <video> 或<track>标签加载的媒体文件的源代码

object-src 限制<object> <embed> <applet>标签的源地址

script-src 限制JavaScript的源地址

default-src 默认的加载策略

4.绕过script-src'self',self"意味着只允许加载同域名目录下的脚本。所以我们可以寻找文件上传(可以绕过cell或者使用jsonp接口)或jsonp接口(跨域用的)

需要注意的是,如果图片上传接口,即访问资源时Content-Type为image/png,浏览器会拒绝将其作为脚本来执行。

而JSONP接口通常采用?callback=xxxx的方式传递参数

如:xxx({"result":"success"})

当使用类似alert(1); // alert(1) (("result":"success") )这样的代码进行传参时,会产生特定的返回结果。

相关推荐
无敌最俊朗@7 分钟前
unity3d————协程原理讲解
开发语言·学习·unity·c#·游戏引擎
青椒大仙KI1123 分钟前
24/11/14 算法笔记 EM算法期望最大化算法
人工智能·笔记·算法
猫爪笔记31 分钟前
JavaSE:运算符 (学习笔记)
java·开发语言·笔记·学习
Diamond技术流36 分钟前
从0开始学习Linux——进程管理
linux·运维·学习·系统架构·centos
且听风吟5671 小时前
带隙基准学习笔记一
笔记·学习
卤吓唬晤1 小时前
项目设计与验收
运维·笔记·学习·自动化
小志biubiu1 小时前
哈希表的实现--C++
开发语言·数据结构·c++·学习·算法·哈希算法·散列表
lx学习1 小时前
Python学习25天
开发语言·python·学习
环境跨考电子1 小时前
不定积分的计算能力
笔记
赞哥哥s2 小时前
MISRA C2012学习笔记(9)-Rules 8.14
笔记·学习·autosar·misra c