一、Web安全的关键点
浏览器的同源策略
同源策略:不同域的客户端脚本在没明确授权的情况下,不能读写对方的资源。
http://www.topo.com 的不同域/同域
站点
是否同域
原因
https://www.topo.com
不同域
协议不同,https与http是不同的协议
http://alpha.topo.com
不同域
域名不同,alpha子域与www子域不同
http://topo.com
不同域
域名不同,顶级域与www子域不是一个概念
http://www.topo.com:8080
不同域
端口不同,8080与默认端口80不同
http://www.topo.com/a/
同域
满足同协议、同域名、同端口,只是目录不同
默认情况下是不允许跨域访问的,只有目标站点(http://www.topo.com)明确返回HTTP响应头:Access-Control-Allow-Origin: http://www.evil.com,那么www.evil.com上的客户端脚本才有权通过AJAX对www.topo.com上的数据进行读写操作。
AJAX
Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)AJAX是在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术。
DOM
Document Object Mode (文档对象模型)中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。
二、前端基础
Web安全事件的角色:W3C、浏览器厂商、Web厂商、攻击者、用户。
URL
Uniform Resource Locator(统一资源定位符)protocol://hostname[:port]/path/[;parameters][?query]#fragment
URL有三类编码方式:escape、encodeURI、encodeURIComponent,对应着三个解码函数unescape、decodeURI、decodeURIComponent。
HTTP
Hyper Text Transfer Protocol(超文本传输协议)
详情
JavaScript
<script>alert(1)</script>
<img src=# onerror=”alert(1)” />
<input type=’text’ value=”x” onmouseover=”alert(1)” />
<iframe src=”javascript:alert(1)”></iframe>
<a herf=”javascript:alert(1)”>x</a>
…
Cookie
[name] [value] [domain] [path] [expires] [httponly] [secure]名称、值、所属域名、所属相对根路径、过期时间、是否有HttpOnly标志、是否有Secure标志
三、前端黑客之XSS
Cross Site Script(跨站脚本),发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被预期的脚本指令并执行,XSS就会产生。
反射型XSS
发出请求时,XSS代码出现在URL中,作为输入提交到服务端,服务端解析后响应,在响应内容中出现这段XSS代码,最后浏览器解析执行。
存储型XSS
提交的XSS代码会存储在服务端,下次请求目标页面时不用再提交XSS代码。
DOM型XSS
DOM型XSS的XSS代码不需要服务器解析响应的直接参与,触发XSS靠的是浏览器端的DOM解析,可以认为完全是客户端的事情。
常见的输入点:
document.URL
document.URLUnencoded
document.location
document.referrer
document.cookie
windows.location
windows.name
常见输出点:
直接输出HTML内容:
document.write()
document.writeln()
document.body.innerHtml=
直接修改DOM树:
document.forms[0].action=
document.attachEvent()
document.create()
document.execCommand()
document.body. …()
替换document URL
document.location=
document.location.hostname=
document.location.replace()
document.location.asign()
document.URL=
window.navigate()
打开或修改新窗口
document.open()
window.open()
window.location.href=
直接执行脚本
eval()
window.execScript()
window.setInterval()
window.setTimeout()
XSS危害:挂马、盗取用户Cookie、Dos客户端浏览器、钓鱼攻击、劫持用户Web行为、蠕虫式挂马刷广告等等。
四、前端黑客之CSRF
Cross-site request forgery(跨站请求伪造跨站的请求)
跨站点的请求:跨站点请求的来源一般为其他站点,但是也可以来自本站。请求是伪造的:发出的请求不是用户的意愿的请求。
HTML CSRF
发起的CSRF请求都属于HTML元素发出的,HTML中能设置href/src等连接的标签都可以发起一个GET请求,如:
<link href=””>
<img src=””>
<meta http-equiv=”refresh” content=”0; url=”>
<iframe src=””>
<script src=””>
…
CSS中的:
@import “”
background:url(“”)
CSRF危害:篡改目标网站上的用户数据、盗取用户隐私数据、作物其他攻击向量的辅助攻击手法、传播CSRF蠕虫。
五、前端黑客之界面操作劫持
界面操作劫持攻击是一种基于视觉欺骗的Web会话劫持攻击,它通过在网页的可见输入控件上覆盖一个不可见的框(iframe),让用户以为在操作可见控件,但是实际上用户的操作行为被其不可见的框所劫持,执行不可见框中的恶意劫持代码,从而完成在用户不知情的情况下窃取敏感信息,篡改数据等攻击。
分类
点击劫持
劫持的是用户的鼠标点击操作,主要的劫持目标是有重要会话交互的页面,比如,银行交易页面、后台管理页面或者劫持用户的摄像头和麦克风。
拖放劫持
在现在的Web应用中,有一些需要用户采用鼠标拖放完成的操作,而且用户也经常在浏览器中使用鼠标拖放操作来代替复制粘贴。因此,拖放操作劫持很大程度的扩展了点击劫持的攻击范围,也将劫持模式从单纯的鼠标点击扩展到了鼠标拖放行为。
通过劫持某个页面的拖放操作实现对其他页面链接的窃取,这些链接中可能会有session key、token、password等信息;或者可以把其他浏览器中的页面内容拖放到富文本编辑器模式中,这样就能够看到页面源代码了,而这些HTML源代码中可能会存在敏感信息。
触屏劫持
移动智能终端设备由于体积限制,一般都没有鼠标、键盘这些输入设备,用户更多的操作是依靠手指在触屏上的点击或滑动等动作完成。在移动设备上,类似点击劫持的攻击模式,实现了对用户触摸屏操作的劫持攻击。
原理分析
点击劫持:CSS透明层+iframe
利用CSS中透明属性opacity,取值范围0~1,取值0时透明度最高用iframe嵌入被劫持界面:<iframe id = “victim” src=”www.victim.com” scrolling=”no”>
危害
界面操作劫持实际上突破了CSRF的防御策略,这是一种社工色彩很强的跨域操作,而这种跨域正好是浏览器自身的特性,带来的危害可以很大,比如,篡改与删除数据,偷取隐私甚至爆发蠕虫。
六、漏洞挖掘
CSRF的漏洞挖掘
目标表单是否有有效的token随机串
目标表单是否有验证码
目标是否判断了Refere来源
网站根目录下的crossdomain.xml的”allow-access-from domain”是否是通配符
目标JSON是否可以自定义callback函数
界面劫持的漏洞挖掘
目标的HTTP响应头是否设置了X-Frame-Options字段
目标是否有Javascript的Frame Busting机制
更简单的是用iframe嵌入目标网站试试
反射型XSS漏洞挖掘
反射型XSS最常见的就是直接在URL中进行注入,URL的格式如下:<scheme>://<netloc>/<path>?<query>#<fragment> 在完整的URL构成中,<path>、<query>、<fragment>都是用户可控的
一般情况下可以通过将payload加入到参数来测试XSS的存在与否
<script>alert(1)</script>
‘”><script>alert(1)</script>
<img/src=@ onerror=alert(1) />
‘ onmouseover=alert(1) x=’
` onmouseover=alert(1) x=`
javascript:alert(1)//
‘”;alert(1)//
}x:expression(alert(1))
…..
根据请求后的反应看是否有弹出窗或浏览器脚本错误,如果有则说明目标存在XSS漏洞例如:www.test.com/xss.php?id=1,这里输入点为id=1,既然有输入点,查看结果则依赖于输出点,可能是以下几处:
HTML标签之间,<div id=”body”>[输出]</div>
HTML标签内,<input type=”text” value=[输出] />
Javascript代码的值,<script>a=”[输出]”;…</script>
CSS代码的值,<style>body{font-size:[输出]px;…}</style>
HTML标签之间
有很多标签之间的脚本是无法执行的,如:<title>、<textarea>、<xmp>、<iframe>、<noscript>、<plaintext>,可以先闭合前面的标签,来使得脚本能够成功执行。</title><script>alert(1)</script>
HTML标签内
” onmouseover=alert(1) x=” 这种是闭合属性,然后使用on事件来触发脚本。
“><script>alert(1)</script> 这种是闭合属性后又闭合标签,然后直接执行脚本。
细分为三种场景:1.输出在src/href/action等属性内2.输出在on*事件内3.输出在style属性内
Javascript代码的值
</script><script>alert(1)//
CSS代码的值
与“输出再在style属性内”类似,构造能执行的Javascript语句,闭合标签。
存储型XSS漏洞挖掘
与反射型XSS相比,存储型XSS漏洞挖掘的差别在于:存储型XSS一般都是基于表单的提交,然后进入服务端存储,最终在某个页面输出。
一般情况下,存储型XSS表单提交之后的输出点有以下几种可能:
表单提交后跳转到的页面可能是输出点。
表单所在的页面可能是输出点。
表单提交后不见了,整个网站的某个源文件是输出点,需要借助爬虫进行分析。
发表回复