一,Web安全的关键点
1.同源策略是众多安全策略的一个,是Web层面上的策略,非常重要。
2.同源策略规定:不同域的客户端脚本在没明确授权的情况下,不能读写对方的资源。
3.同域要求两个站点同协议,同域名,同端口。
4.当然,在同一个域内,客户端脚本可以任意读写同源内的资源,前提是这个资源本身是可读可写的。
5.安全类似木桶原理,短的那块板决定了木桶实际能装多少水。一个Web服务器,如果其上的网站没做好权限分离,没控制好信任关系,则整体安全性就由安全性最差的那个网站决定。
6.一个安全性非常好的网站有可能会因为建立了不可靠的信任关系,导致网站被黑。
7.CSRF是跨站请求伪造。CSRF会借用目标用户的权限做一些借刀杀人的事(注意是“借用”,而不是“盗取”目标权限),然后去做坏事,“盗取”通常是XSS(跨站脚本攻击)最喜欢做的事。
二,前端基础
1.为了解决CSS兼容性而发展的CSS Reset技术,该技术会重置一些样式(这些样式在不同的浏览器中有不同的呈现),后续的CSS将在这个基础上重新开始定义自己的样式。
2.为了解决JavaScript兼容性,诞生了许多优秀的JavaScript框架,如jQuery, YUI等等。
3.URL的请求协议几乎都是HTTP,它是一种无状态的请求响应,即每次的请求响应之后,连接会立即断开或延时断开(保持一定的连接有效期),断开后,下一次请求再重新建立。
4.HTTP是无状态的,那么每次在连接时,服务端如何知道你是上一次的那个?这里通过Cookies进行会话跟踪,第一次响应时设置的Cookies在随后的每次请求中都会发送出去。Cookies还可以包括登录认证后的身份信息。
5.iframe标签还有一些有趣的安全话题,当网站页面使用iframe方式潜入一个页面时,我们约定网站页面是父页,而被嵌入的这个页面是子页。
6.如果父页和子页之间是同域,那就很容易,父页可以通过调用子页的contentWindow来操作子页的DOM树,同理,子页可以调用父页的contentWindow来操作父页的DOM树。如果它们不同域,则必须遵守同源策略,但子页还是可以对父页的location值进行写操作,这样可以让父页重定向到其他网页,不过对location的操作仅仅只有写权限,而没有读权限,这样就不能获取父页location URL的内容,否则有可能会造成隐私数据泄漏,比如,有的网站将身份认证token存在于URL中。
7.对跨站师来说,大多数情况下,有了XSS漏洞,就意味着可以注入任意的JavaScript,有了JavaScript,就意味着被攻击者的任何操作都可以模拟,任何隐私信息都可以获取到。可以说,JavaScript就是跨站之魂。
8.从window.location或location处可以获取URL地址中的数据。
9.异步和同步对应,异步可以理解为单独开启了一个线程,独立于浏览器主线程去做自己的事,这样浏览器就不会等待(阻塞),这个异步在后台悄悄进行,所以利用AJAX的攻击显得很诡异,无声无息。AJAX本身就是由JavaScript构成的,只是XML并不是必需的,XML在这里是想指数据传输格式是XML,比如,AJAX发出去的HTTP请求,响应回的数据是XML格式,然后JavaScript去解析这个XML DOM树得到相应节点的内容。其实响应回的数据格式还可以是JSON(已经是主流),文本,HTML等等。AJAX中特别提到XML是因为历史原因。
10.AJAX的核心对象是XMLHttpRequest。
11.AJAX是严格遵守同源策略的,既不能从另一个域读取数据,也不能发送数据到另一个域。不过有一种情况,可以发送数据到另一个域,W3C的新标准中,CORS开始推进浏览器支持这样的跨域方案,现在的浏览器都支持这个方案了,过程如下:
www.foo.com(来源域)的AJAX向www.evil.com(目标域)发起了请求,浏览器会给自动带上Origin头,如下:
Origin: http://www.foo.com
然后目标域要判断这个Origin值,如果是自己预期的,那么就返回。
12.如果目标域不设置Access-Control-Allow-Origin:http://www.foo.com,那么隐私数据可以被偷到吗?答案是肯定的。
13.对于GET方式,实际上就是一个URL。
14.对于POST的请求,前面说的XMLHttpRequest对象就是一个非常方便的方式,可以模拟表单提交,它有异步与同步之分,差别在于XMLHttpRequest实例化的对象xhr的open方法的第三个参数,true表示异步,false表示同步,如果使用异步方式,就是AJAX。异步则表示请求发出去后,JavaScript可以去做其他事情,待响应回来后会自动触发xhr对象的onreadystatechange事件,可以监听这个事件以处理响应内容。同步则表示请求发出去后,JavaScript需要等待响应回来,这期间就进入阻塞阶段。
15.Cookie是一个神奇的机制,同域内浏览器中发出的任何一个请求都会带上Cookie,无论请求什么资源,请求时,Cookie出现在请求头的Cookie字段中。
16.Cookie经常被用来存储用户的会话信息,比如,用户登录认证后的Session,之后同域内发出d请求都会带上认证后的会话信息。
17.HttpOnly是指仅在HTTP层面上传输的Cookie,当设置了HttpOnly标志后,客户端脚本就无法读写该Cookie,这样能有效地防御XSS攻击获取Cookie。
18.Secure Cookie机制指的是设置了Secure标志的Cookie仅在HTTPS层面上安全传输,如果请求是HTTP的,就不会带上这个Cookie,这样能降低重要的Cookie被中间人截获的风险。
19.本地Cookie与内存Cookie,它与过期时间(Cookie的expires字段)紧密相关。如果没设置过期时间,就是内存Cookie,这样的Cookie会随着浏览器的关闭而从内存中消失;如果设置过期时间是未来的某个时间点,那么这样的Cookie就会以文本形式保存在操作系统本地待过期时间到了才会消失。
20.删除Cookie时,仅需设置过期值为过去的时间即可。Cookie无法跨浏览器存在。
21.Flash是跨浏览器的通用解决方案,Flash Cookie的默认存储数据大小是100KB。
22.如果在h1之前有大段非法字符,如何保证h1的代码顺利解析?在h1之前加上{}即可,如果是在IE下,加上}即可,这是浏览器解析差异导致的。
{}h1{font-size:50px; color:red;}
三,前端黑客之XSS
1.XSS即跨站脚本,发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被预期的脚本指令并执行时,XSS就会发生。
目标网站的目标用户:这里强调了场景
浏览器:因为这类攻击是由浏览器来解析执行的。
不被预期的:那么就很可能是攻击者在输入时提交了可控的脚本内容,然后在输出后被浏览器解析执行。
2.跨站脚本的重点不在“跨站”上,而应该在“脚本”上,这是从字面上来分析的。因为这个“跨”实际上属于浏览器的特性,而不是缺陷,造成“跨”这样的假象是因为绝大多数XSS攻击都会采用嵌入一段远程或者说第三方域上的脚本资源。
3.通俗地总结XSS为:想尽一切办法将你的脚本内容在目标网站中目标用户的浏览器上解析执行即可。
4.XSS有三类:反射型XSS(也叫非持久性XSS),存储型XSS(也叫持久型XSS)和DOM XSS 。
5.存储型XSS的攻击是最隐蔽的。
四,前端黑客之CSRF
1.在跨站的世界中,CSRF同样扮演着及其重要的角色。CSRF的全称是Cross Site Request Forgery,即跨站请求伪造。
攻击的发生是由各种请求造成的,对于CSRF来说,它的请求有两个关键点,跨站点的请求与请求是伪造的。
2.安全风险总是出现在正常的流程中,现在我们发出的是一个删除文章的GET请求,对于合法的跨域请求,浏览器会放行。
3.HTML中能够设置src/href等链接地址的标签都可以发起一个GET请求。
4.还有通过JavaScript动态地生成的标签对象或CSS对象发起的GET请求,而发出POST请求只能通过form提交方式。
5.由于JSON格式的简洁与强大,网站开始逐渐使用JSON代替传统的XML进行数据传输。
6.JSON数据如果以字典形式返回,直接在浏览器中显示会报错,原因是浏览器以为“{”开头的脚本应该是一段左右花括号包围住的代码块。所以,对这种JSON数据的处理,一般会这样:
eval(“(”+JSON_DATA+")"); //前后加上圆括号
7.对于使用列表形式返回的JSON数据,它是一个Array对象,以前可以通过劫持Array数据来进行JSON HiJacking攻击。
五,前端黑客之界面操作劫持
1.界面操作劫持攻击时一种基于视觉欺骗的Web会话劫持攻击,它通过在网页的可见输入控件上覆盖一个不可见的框(iframe),使得用户误以为在操作可见控件,而实际上用户的操作行为被其不可见的框所劫持,执行不可见框中的恶意代码,从而完成在用户不知情的情况下窃取敏感信息,篡改数据等攻击。
2.界面操作劫持分为三种:点击劫持,拖放劫持和触屏劫持。
3.在浏览器中,拖放操作是不受“同源策略”限制的,用户可以把一个域的内容拖放到另一个不同的域。因此,突破同源策略限制的拖放劫持可以演化出更广泛的攻击形式,突破很多种防御。
4.控件位置之间的层次关系使用z-index,而且任何浏览器都支持:
z-index:1,数值可以是负数,高数值的控件会处于低数值控件的前面,数值越高,控件越靠近用户。
六,漏洞挖掘
1.回到XSS漏洞挖掘上,上面说了攻击者可控的输入点有<path>,<query>,<fragment>三个,其实<fragment>里的值一般不会出现在服务端解析,除非Web 2.0网站。
2.最普通的场景出现在<div id="body" >[输出]</div>位置,那么提交:
id=1<script>alert(1)</script>就可以触发XSS了。
可如果出现在下面这些标签中呢?
<title></title>
<textarea></textarea>
<xmp></xmp>
<iframe></iframe>
<noscript></noscript>
<noframes></noframes>
<plaintext></plaintext>
比如,代码<title><script>alert(1)</script></title>会弹出提示框吗?答案是:都不会!这些标签之间无法执行脚本。XSS漏洞挖掘机制必须具备这样的区分能力,比如,发现出现在<title></title>中,就将提交的payload变为:
</title><script>alert(1)</script>
除了这些,还有两类特殊的标签<script>和<style>,它们是不能嵌套标签的,而且payload构造情况会更灵活,除了闭合对应的标签外,还可以利用它们自身可执行脚本的性质来构造特殊的payload。
3.HTML是一个很不严格的标记语言(它的反面代表是XML),属性值可以不用引号,或者使用单引号,双引号,反单引号(仅IE浏览器支持)进行引用。
4.“探子”的目的有两个:目标参数值是否出现在响应上,如果不出现,就完全没必要进行后续的payload请求与分析,因为这些payload请求与分析可能会进行多次,浪费请求资源;目标参数值出现在HTML的哪个部分,从上面的分析我们已经知道,不同的HTML部分对待XSS的机制是不一样的,请求的payload当然也不一样。
5.肉眼看到的一个文字或符号单元就是一个字符(包括乱码),一个字符可能对应1~n字节,1字节为8位,每一位要么为1,要么为0。
6.一个字符对应1~n字节是由字符集与编码决定的,比如,ASCII字符集就是一个字符对应1字节,不过1字节只用了7位,最高位用于其他目的,所以ASCII字符集共有2的7次方(128)个字符,基本就是键盘上的英文字符(包括控制符)。
7.<!-- [if IE] >所有的IE可识别<! [endif] -->
<!-- [if IE 6] >仅IE6可识别<! [endif] -->
<!-- [if lt IE 6] >IE6以及IE6以下版本可识别<! [endif] -->
<!-- [if gte IE 6] >IE6以及IE6以上版本可识别<! [endif] -->
这是IE所独有的,在其他浏览器看来与普通注释无异,但是在IE看来却是可根据条件执行的,这给我们绕过过滤器创造了可乘之机。
8.目前在XSS中常用的伪协议有三个:javascript:,vbscript:(协议名也可以简写为vbs:)和data:
9.同HTML标签和属性的特点相似,伪协议的协议名也是不区分大小写的,并且跟事件相仿,数据也可以做自动的HTMLDecode解码以及进制解码。
10.@charset为规则;!important为声明。其中能被我们利用插入XSS脚本的地方只有CSS资源类属性值和@import规则,以及一个只能在IE浏览器下执行的属性值expression。
11. var a = "123</script><script>alert(1);</script>";
对HTML页面中的JavaScript代码来说,</script>闭合标签具有最高优先权,可以在任何位置中断JavaScript代码。所以,在实际的过滤器实现中,事实上还会区分引用变量中是否使用了</script>闭合标签,如果使用了,则要用反引线做转换“<\/script>”。另外,还要注意引用变量的数据走向,看能否有DOM XSS的可能性。
12.根据需求的不同,JSON大体上有两种格式:没有callback函数名的裸Object形式和有callback函数名的参数调用Object的形式,如下:
[{"a":"b"}]
callback([{"a":"b:}])
后者的存在主要是为了跨域数据传输的需要,而这个特性通常也成了攻击者跨域获取用户隐私数据的重要渠道。
七,漏洞利用
1.<script>标签请求内容可跨域,这是合法的功能,请求到是数据必须是合法的JavaScript语法格式。这种技术在之前有提过,包括请求回来的是JSON+CallBack函数这样的数据内容(这种跨域数据通信被称为JSONP)。
八,HTML5安全
九,Web蠕虫
1.Web蠕虫主要包括:XSS蠕虫,CSRF蠕虫,Clickjacking蠕虫,这三类蠕虫都与具体的漏洞风险有关系,从名字上很好区分。为了更好地表述Web蠕虫思想,会顺带提及第四类:文本蠕虫。
2.这些蠕虫除了利用的漏洞不一样,其本质是一样的,都是使参与进Web2.0交互的用户受到了欺骗,导致被动或主动(或介于两者之间)地传播了威胁。从XSS蠕虫到CSRF蠕虫,再从Clickjacking蠕虫到文本蠕虫,越往后,社工的成分越大。
3.利用了大众的心理,在心理作用的驱使下去传播,我们称之为文本蠕虫。
4.蠕虫具有的最主要的两个性质如下:传播性和病毒行为。
十,关于防御