Day 141/200 关于XSS(含反射性)防护的整理(仍需迭代)

1、攻击是什么意思?

拿到本不该被拿到的隐私的信息。

比如,用户的登录状态;窃取 Cookie 信息;监听用户行为;修改 DOM;

其他攻击类型还有:

(1)网络钓鱼,包括盗取各类用户账号;

(2)窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作;

(3)劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等;

(4)强制弹出广告页面、刷流量等;

(5)网页挂马,进行恶意操作,例如任意篡改页面信息、删除文章等;

(6)进行大量的客户端攻击,如DDoS攻击;

(7)获取客户端信息,例如用户的浏览历史、真实IP、开放端口等;

(8)控制受害者机器向其他网站发起攻击;

(9)结合其他漏洞,如CSRF漏洞,实施进一步作恶;

(10)提升用户权限,包括进一步渗透网站;

(11) 传播跨站脚本蠕虫等;


2、XSS攻击的定义?

1)定义:(Croess SiteScripting)XSS意思是跨站脚本攻击(脚本代码注入)。

2)大致分为三种类型 :Persistent型(持久型),Non-persistent(反射型)及Dom-based型(区别是是否通过 HTTP 请求数据)。

反射型是最常用,也是使用得最广的一种攻击方式。它通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析、执行。它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。


示例


实际逻辑


3、什么是CGI?

公共网关接口(Common Gateway Interface,CGI)是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。几乎所有服务器都支持CGI,可用任何语言编写CGI,包括流行的C、C ++、Java、VB 和Delphi 等。

CGI分为标准CGI和间接CGI两种。标准CGI使用命令行参数或环境变量表示服务器的详细请求,服务器与浏览器通信采用标准输入输出方式。间接CGI又称缓冲CGI,在CGI程序和CGI接口之间插入一个缓冲程序,缓冲程序与CGI接口间用标准输入输出进行通信



4、XSS测试方法

1、工具扫描:APPscan、AWVS

2、手工测试:Burpsuite、firefox(hackbar)、XSSER XSSF

使用手工检测Web应用程序是否存在XSS漏洞时,最重要的是考虑那里有输入,输入的数据在什么地方输出。在进行手工检测XSS时,人毕竟不像软件那样不知疲惫,所以一定要选择有特殊意义的字符,这样可以快速测试是否存在XSS。

(1)在目标站点上找到输入点,比如查询接口,留言板等;

(2)输入一组"特殊字符+唯一识别字符",点击提交后,查看返回的源码,是否有做对应的处理;

(3)通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合);提交构造的脚本代码,看是否可以成功执行,如果成功执行则说明存在XSS漏洞;


5、如何防御?

XSS防御的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码

1、DOM 节点内容进行转义

对于一些标签的 < 和 > 进行转移,是他们在 HTML 中不会以一个 script 标签形式执行。

主要的思路就是将容易导致XSS攻击的边角字符替换成全角字符。< 和 > 是脚本执行和各种html标签需要的,比如 ,& 和 # 以及 % 在对URL编码试图绕过XSS filter时,会出现。我们说对输入的过滤分为白名单和黑名单。上面的XSS filter就是一种黑名单的过滤,黑名单就是列出不能出现的对象的清单,一旦出现就进行处理。还有一种白名单的过滤,白名单就是列出可被接受的内容,比如规定所有的输入只能是“大小写的26个英文字母和10个数字,还有-和_”,所有其他的输入都是非法的,会被抛弃掉。很显然如此严格的白名单是可以100%拦截所有的XSS攻击的。但是现实情况一般是不能进行如此严格的白名单过滤的。

对于输入,处理使用XSS filter之外,对于每一个输入,在客户端和服务器端还要进行各种验证,验证是否合法字符,长度是否合法,格式是否正确。在客户端和服务端都要进行验证,因为客户端的验证很容易被绕过。其实这种验证也分为了黑名单和白名单。黑名单的验证就是不能出现某些字符,白名单的验证就是只能出现某些字符。尽量使用白名单。

2、DOM 节点的处理

对于 DOM 节点影响比较大的就是单引号和双引号, 因为他们会关闭属性的值。所以也是对单引号和双引号进行字符转义。

3、JavaScript 代码的处理

对于避免造成 javascript 注入的情况,一般会对从 url 上取到的数据进行 encode ,这样就可以避免双引号提前封闭。

只是这里也要注意一下 ,这里一般会使用 encode 的方式格式化参数会更好一些,不然也要考虑类似 \" 这样的双引号转义符,是不是会和 下一个 " 又相互抵消。 当然,解决的方法还是给 \ 做转义。

4、富文本配置白名单

在富文本中,可以其实可以使用配置黑白名单的方法,配置禁止某些标签出现或者是只允许某些标签出现。

但更多时候建议使用的还是白名单,因为配置黑名单实在是太麻烦了而且一旦漏了,问题也就大了。网上已经有一些库可以使用,但是这些库是别人写的,可能有些地方不是自己想要的。所以,如果想完全定制那么就是使用白名单配置,如果只是一个小需求,快速开发影响也不大,那就可以考虑引用个库。

5、CSP(据说最有效防御手段,需验证)

前面说的一些防御方法是有效果,但是始终还是远远不够。所以,现在防御XSS 有一个更好的方法就是使用 CSP 规则。

CSP 概念

CSP 即 content security policy 内容安全策略,是一个 HTTP header ,用于指定哪些内容可以执行。

CSP 规则

child-src connect-src default-src...

child-src:指定一些子页面元素,比如 ifame 。

connect-src :指定网络请求比如 ajax 的请求。

default-src:默认规则,当其他规则没有配置时,会直接读取这里。

font-src ifame-src img-src

font-src:指定字体源。

ifame-src:指定 ifame 的访问域。

img-src:指定 图片资源的访问域。

script-src style-src

script-src :指定脚本访问域

style-src:指定样式文件访问域

配置方法

http.set(`content-security-policy`,`default-src 'self'`);

上面这个意思就是允许当前域下的任意请求。 至于详细配置,可以参考 ,https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP 这个说明。

6、对输出进行编码

1> 作为body文本输出,作为html标签的属性输出:

比如:

<span>${username}</span>, <p><c:out value="${username}"></c:out></p>

<input type="text" value="${username}" />

此时的转义规则如下:

< 转成 &lt;

> 转成 &gt;

& 转成 &amp;

" 转成 &quot;

' 转成 &#39

2> javascript事件

<input type="button" onclick='go_to_url("${myUrl}");' />

除了上面的那些转义之外,还要附加上下面的转义:

\ 转成 \\

/ 转成 \/

; 转成 ;(全角;)

3> URL属性

如果 <script>, <style>, <imt> 等标签的 src 和 href 属性值为动态内容,那么要确保这些url没有执行恶意连接。

确保:href 和 src 的值必须以 http://开头,白名单方式;不能有10进制和16进制编码字符。

7、HttpOnly 与 XSS防御

XSS 一般利用js脚步读取用户浏览器中的Cookie,而如果在服务器端对 Cookie 设置了HttpOnly 属性,那么js脚本就不能读取到cookie,但是浏览器还是能够正常使用cookie。

一般的Cookie都是从document对象中获得的,现在浏览器在设置 Cookie的时候一般都接受一个叫做HttpOnly的参数,跟domain等其他参数一样,一旦这个HttpOnly被设置,你在浏览器的 document对象中就看不到Cookie了,而浏览器在浏览的时候不受任何影响,因为Cookie会被放在浏览器头中发送出去(包括ajax的时 候),应用程序也一般不会在js里操作这些敏感Cookie的,对于一些敏感的Cookie我们采用HttpOnly,对于一些需要在应用程序中用js操作的cookie我们就不予设置,这样就保障了Cookie信息的安全也保证了应用。

如果你正在使用的是兼容 Java EE 6.0 的容器,如 Tomcat 7,那么 Cookie 类已经有了 setHttpOnly 的方法来使用 HttpOnly 的 Cookie 属性了。

1cookie.setHttpOnly(true);

设置完后生成的 Cookie 就会在最后多了一个 ;HttpOnly

另外使用 Session 的话 jsessionid 这个 Cookie 可通过在 Context 中使用 useHttpOnly 配置来启用 HttpOnly,例如:


<Context path="" docBase="D:/WORKDIR/oschina/webapp"   reloadable="false" useHttpOnly="true"/>

也可以在 web.xml 配置如下:

<session-config>

 <cookie-config>

  <http-only>true</http-only>

 </cookie-config>

<session-config>

对于 不支持 HttpOnly 的低版本java ee,可以手动设置(比如在一个过滤器中):

String sessionid = request.getSession().getId(); 

response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly");


8、其他注意点

csp 规则一般会在服务器配置,当然前端页面也是可以配置,但是更多的是以服务器为准,在日常开发中也经常会遇到引用了第三方的东西,这个时候 csp 规则不通过,都需要向服务器端的同学要求加个规则。



参考链接

1、反射型xssDemo 

https://blog.csdn.net/huli870715/article/details/8615473

2、CGI(通用网关接口)

https://baike.baidu.com/item/CGI/607810?fr=aladdin&fromid=6717913&fromtitle=%EF%BC%A3%EF%BC%A7%EF%BC%A9

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 以下题目是根据网上多份面经收集而来的,题目相同意味着被问的频率比较高,有问题欢迎留言讨论,喜欢可以点赞关注。 以下...
    Aniugel阅读 14,680评论 1 6
  • XSS[xss] 简介 XSS,全称Cross-site scripting,跨站[1][#fn1]脚本攻击; 不...
    说叁两事阅读 371评论 0 0
  • 写在前面 文章内容参考自https://twosecurity.io/http://www.4hou.com/we...
    Ackerzy阅读 5,353评论 0 9
  • HTML5 新特性、语义化 新特性 新的 DOCTYPE 声明<!DOCTYPE html> 新增 vedio 和...
    翔子丶阅读 186评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,523评论 28 53