CSRF,(Cross-siterequestforgery),跨站请求伪造。
强制终端用户在当前对其进行身份验证后的Web应用程序上执行非本意的操作。CSRF攻击的着重点在伪造更改状态的请求,而不是盗取数据,因为攻击者无法查看对伪造请求的响应
一、CSRF与XSS的区别
原理角度:
XSS是将恶意的代码插入到html页面中,当用户浏览页面时,插入的html代码会被执行,从而达到最终目的。
CSRF是一种欺骗受害者提交恶意请求的攻击。代表受害者执行非本意、恶意的操作
其他角度:
1、CSRF比XSS漏洞危害更高,相对XSS而言较难防御。
2、CSRF可以做到的事情,XSS都可以做到。
3、XSS有局限性,而CSRF没有局限性。
4、XSS针对客户端,而CSRF针对服务端。
5、XSS是利用合法用户获取其信息,而CSRF是伪造成合法用户发起请求。
二、CSRF攻击的条件
1、目标用户登录受信任的网站A,并在本地生成cookie
2、目标用户身份认证未过期(直接关闭网站,未退出)的情况下,访问网站B
方式
方法 | 说明 |
---|---|
GET | 1、构造修改信息的连接,短网址伪装 2、构造修改信息的html,使用src标签引用网址连接 |
POST | burpsuite-Engagement tool-Generate CSRF PoC工具,自动生成html 注意:删除原有submit标签,使用script标签自动提交表单(添加id) <script>document.getElementById('xx').submit()</script> |
网站克隆
同源策略
如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。
受约束对象:
DOM、Cookie、第三方插件以及XMLHttpRequest都受到同源策略的约束
不受约束对象:
页面中的链接,重定向以及表单提交是不会受到同源策略限制的。
跨域资源的引入是可以的。但是js不能读写加载的内容。如嵌入到页面中的<script>,<img>,<link>,<iframe>
等带src属性的标签。
非同源受到的限制:
Cookie、LocalStorage和IndexDB无法读取。
DOM无法获得。
AJAX请求能发送但是不能接收。
三、AJAX
Ajax 的全称是asynchronous javascript and xml,
用来实现客户端与服务器端的异步通信效果,实现页面的局部刷新。
需要jquery支持,可以通过document穿件对象方式,引入js库
s=document.createElement('script')
s.src="http://code.jquery.com/jquery-latest.js"
document.body.appendChild(s)
发送get包
$.get('http://192.168.21.112:9000/xxxx')
发送post包
$.ajax({
url: "http://192.168.21.33/csrf/bank/self.php",
type: "POST",
crossDomain: true, //设置跨域为true
xhrFields: {
withCredentials: true //默认情况下,标准的跨域请求是不会发送cookie的
},
data: {
username:"jiabao",
money:"-90000000",
submit:"%E4%BA%A4%E6%98%93"
}
});
四、跨域方法
方法 | 说明 |
---|---|
document.domain跨域 若两个页面一级域名相同,只是二级域名不同, 那么浏览器可以通过设置document.domain来共享Cookie |
特点: 1、只能在父域名与子域名之间使用 2、存在安全性问题,当一个站点被攻击后,另一个站点会引起安全漏洞 3、只适用于Cookie和iframe窗口 举例: 网页A:http://a.ichunqiu.com/index.html 网页B:http://b.ichunqiu.com/index.html 设置document.domain=’ichunqiu.com’,就实现以上任意两个页面之间的通信 |
JSONP跨域 利用 <script> 的src不受同源策略约束实现跨域获取数据 |
存在问题: 1、存在安全性问题,需要网站双方商议基础token的身份验证 2、只能是GET,不能POST 3、可能被注入恶意代码,篡改页面内容,可以采用字符串过滤来规避此问题。 举例: a.com/jsonp.html想得到b.com/main.js中的数据, 在a.com的jsonp.html里创建一个回调函数xxx,动态添加 <script> 元素,向服务器发送请求, 请求地址后面加上查询字符串,通过callback参数指定回调函数的名字。 请求地址为http://b.com/main.js?callback=xxx 在main.js中调用这个回调函数xxx,并且以JSON数据形式作为参数传递 |
CORS跨域 CORS是一个W3C标准,允许浏览器向跨源服务器发出XMLHttpRequest请求 利用JavaScript无法控制HTTP头的特点,通过目标返回的HTTP头授权是否允许跨域访问。 |
举例: a.com想得到b.com中的内容,在b.com里面添加响应头声明允许a.com的访问,添加: Access-Control-Allow-Origin:http://a.com 然后a.com就可以用ajax获取b.com里的数据了 注意:此方法IE8以下完全不支持,IE8-10部分支持 |