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>

网站克隆

https://bazhan.me

同源策略

如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。

受约束对象:

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部分支持