今天 就把之前学的东西简单的总结一下吧
两种漏洞本质
XSS漏洞(跨站脚本):XSS漏洞的本质是服务端分不清用户输入的内容是数据还是指令代码,从而造成用户输入恶意代码传到服务端执行。
CSRF漏洞(跨站请求伪造):CSRF漏洞的本质是浏览器在不应该发送Cookie的地方发送了Cookie.
XSS漏洞
XSS漏洞检测
一般是构造一个"<script>alert("XSS")</script>"的JS的弹窗代码进行测试
防范:
- 设置重要的 cookie信息为 httpOnly
- 对输入进行检测和转义对用户输入的或者从链接获取参数需要展示到页面中需要校验合法性和使用转义函数进行转义
附上一个转义函数:
function escHTML(str) {
if (!str) return '';
return str.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/x27/g, ''')
.replace(/x22/g,'&quto;');
}
CSRF漏洞
CSRF漏洞一般是由于没有检查Referer以及未在头部设置token造成的。
CSRF漏洞检测:
最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。
防范:
防御CSRF攻击
(1)验证 HTTP Referer 字段
HTTP 头中有一个字段叫 Referer,记录了发送请求的域名
(2)在请求地址中添加 token 并验证
token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对
附上一个生成token方式之一如下:
function getToken (token) {
var str = token || '';
var hash = 5381;
for (var i = 0, len = str.length; i < len; ++i) {
hash += (hash << 5) + str.charCodeAt(i);
}
return hash & 0x7fffffff;
}
(3)在 HTTP 头中自定义属性并验证
不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。
而当两者 结合 就有意思了
使用CSRF盗取SELF-XSS的Cookie
1.在恶意网站B中写入CSRF payload,使用这个CSRF来修改用户在A网站的昵称为XSS payload
2.诱惑用户访问恶意网站B,CSRF payload触发,用户在A网站的昵称被修改为XSS payload
3.用户重新访问A网站时,由于右上角显示了昵称,所以会触发对应的XSS payload,就会获取到cookie
使用XSS窃取防御CSRF的Token
1.在A网站的URL中构造XSS payload,实现以下功能:
a.获取本页面的Token值
b.将Token值赋值给window.name
2.在B网站中插入实现以下功能的JS:
a.创建一个iframe,并将iframe.src设为上面构造好的带有XSS payload的A网站的URL
b.写一个function,首先将iframe.contentWindow.location设为任意一个与B网站同源的页面,然后使window.name = iframe.contentWindow.name
修改iframe.contentWindow.location的原因是:当iframe中的页面为A网站的页面时,与B网站为不同源的,不能将iframe的window.name赋值给当前B网站窗口的window.name。但是我们把iframe中的页面换为与B网站同源的页面时,是可以进行window.name的赋值的。由于window.name的特性,其值本身与网站无关,是窗口的一个值。因此修改页面后window.name并未改变,我们就可以顺利取出了。
c.将这个iframe销毁
3.在B网站中插入真正的CSRF payload,带上已成功获取的window.name中的Token值,进行攻击。
版权声明:本文为wo41ge原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。