xss的攻击与防御

今天有群友问怎么防御xss攻击,当时只记得不要信任用户输入的数据,不要让用户输入的数据放到vue的v-html中。

什么是xss?

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

防御方法

(1)基于特征的防御。XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同。这就给XSS漏洞防御带来了困难,不可能以单一特征来概括所有XSS攻击。
传统的XSS防御在进行攻击鉴别时多采用特征匹配方式,主要是针对“javascript”这个关键字进行检索,但是这种鉴别不够灵活,凡是提交的信息中各有“javascript”时,就被硬性的被判定为XSS攻击。
(2)基于代码修改的防御。Web页面开发者在编写程序时往往会出现一些失误和漏洞,XSS攻击正是利用了失误和漏洞,因此一种比较理想的方法就是通过优化Web应用开发来减少漏洞,避免被攻击:

1)用户向服务器上提交的信息要对URL和附带的的HTTP头、POST数据等进行查询,对不是规定格式、长度的内容进行过滤。
2)实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。
3)确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤其是样式表和javascript),使用HTTP only的cookie。

当然,如上操作将会降低Web业务系统的可用性,用户仅能输入少量的制定字符,人与系统间的交互被降到极致,仅适用于信息发布型站点。并且考虑到很少有Web编码人员受过正规的安全培训,很难做到完全避免页面中的XSS漏洞。
(3)客户端分层防御策略。客户端跨站脚本攻击的分层防御策略是基于独立分配线程和分层防御策略的安全模型。它建立在客户端(浏览器),这是它与其他模型最大的区别,之所以客户端安全性如此重要,客户端在接受服务器信息,选择性的执行相关内容。这样就可以使防御XSS攻击变得容易,该模型主要由三大部分组成:

1)对每一个网页分配独立线程且分析资源消耗的“网页线程分析模块”;
2)包含分层防御策略四个规则的用户输入分析模块;
3)保存互联网上有关XSS恶意网站信息的XSS信息数据库。

XSS攻击主要是由程序漏洞造成的,要完全防止XSS安全漏洞主要依靠程序员较高的编程能力和安全意识,当然安全的软件开发流程及其他一些编程安全原则也可以大大减少XSS安全漏洞的发生。这些防范XSS漏洞原则包括:

(1)不信任用户提交的任何内容,对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、REFER、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。尽量采用POST而非GET提交表单;对“<”,“>”,“;”,“””等字符做过滤;任何内容输出到页面之前都必须加以en-code,避免不小心把htmltag显示出来。
(2)实现Session 标记(session tokens)、CAPTCHA(验证码)系统或者HTTP引用头检查,以防功能被第三方网站所执行,对于用户提交信息的中的img等link,检查是否有重定向回本站、不是真的图片等可疑操作。
(3)cookie 防盗。避免直接在cookie中泄露用户隐私,例如email、密码,等等;通过使cookie和系统IP绑定来降低cookie泄露后的危险。这样攻击者得到的cookie没有实际价值,很难拿来直接进行重放攻击。
(4)确认接收的内容被妥善地规范化,仅包含最小的、安全的Tag(没有JavaScript),去掉任何对远程内容的引用(尤其是样式表和JavaScript),使用HTTPonly的cookie。

可实现xss攻击的标签:

script

<script src="https://cdn.jsdelivr.net/npm/react@17.0.2/index.min.js"></script>

<script>alert('xss')</script>

第一个script方式理论上来说是可以加载js文件的,但是我试的时候发现script是渲染了,但没有加载对应的js。
第二种方法一般来说不会起效。

img

<img src="..." onerror="alert('xx')" />

img测试有效。如果把alert换成加载某个js,那么就完成了xss。

<link rel="preload" href="https://cdn.jsdelivr.net/npm/react@17.0.1/index.min.js" as="script"></link>

link测试有效,完美的加载了对应的js。

a

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

类似于img标签,不过相比img a不点击不会触发

math

 <math><mi xlink:href="data:x,<script>alert(4)</script>"></mi></math>

// todo 未试

iframe

<iframe src="..."></iframe>

iframe可操作父级窗口

<iframe src="javascript:alert(3)">def</iframe >

svg

<svg><g onload="alert(2)"></g></svg>

// todo 未试

处理xss的库

默认配置遇到script或link会转义,测试时a标签的href会删除掉(官网的例子不会),可配置,支持nodejs

默认配置遇到script或link时会直接删除,可配置,不支持nodejs

// 未完待续

评论

0 / 800
全部评论()