CSRF漏洞(跨站请求伪造漏洞)
漏洞是由于未校验请求来源,导致攻击者可在第三方站点发起 HTTP 请求,并以受害者的目标网站登录态(cookie、session 等)请求,从而执行一些敏感的业务功能操作
CSRF攻击原理
当我们打开登陆某个网站后,就会产生一个会话,这个会话可能是SESSION、Cookie,但无关紧要的。唯一的重点是浏览器与服务器之间是在会话之中
- 在这个会话没有结束时候,你可以利用你的权限对网站进行操作,如进行发表文章,发邮件,删除文章等操作。
- 当这个会话结束后,你在进行某些操作时候 Web 应用程序通常会来提醒你,您的会话已过期,或者是请重新登陆等提示。
- 而 CSRF 攻击则是建立会话之上的攻击。
比如当你登陆了网上银行,正在进行转账业务,这时你的某个 QQ 好友(攻击者)发来一条消息(URL),这条消息是攻击者精心构造的转账业务代码。而且与你所登录的网站是同一个银行,你可能认为这个网站是安全的,并不是什么钓鱼网站之类的,然后打开了这条URL,那么你的账户的钱可能就在你的这一次小小点击上全部丢失。 - 攻击成功主要是因为你的浏览器正处于与此网站的会话之中,那么一切正常操作都是合法的,而入侵者构造的这段代码只不过是正常的转账操作代码而已

- 案例
比如说你想给用户 spisec 转账 1000元,那么点击提交按钮之后,可能会发送以下请求:
http://www.taobao.com/pay.jsp?user=spisec&money=1000
而攻击者仅仅是改变一下 user 参数与 money 参数即可完成一次“合法”的攻击,如:
http://www.taobao.com/pay.jsp?user=hack&money=10000
当你访问了这条URL之后,就会自动向 hack 这个账户里面转入10000元。而这是你亲手造成的,并没有人破解你的密码或入侵Web服务器
案例——pikachu->csrf(post)
使用burpsuite插件Generate CSRF Poc 来生成POC(鼠标右键->Engagement tools->Generate CSRF Poc)

复制html代码并在服务器上创建一个1.html文件
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://pikachu:8880/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
<input type="hidden" name="sex" value="man" />
<input type="hidden" name="phonenum" value="123546789" />
<input type="hidden" name="add" value="洛杉矶" />
<input type="hidden" name="email" value="123456@qq.com" />
<input type="hidden" name="submit" value="submit" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>

这时使用受害者主机访问 服务器ip/1.html


查看个人信息,发现变成了poc里的信息,csrf执行成功

案例——本地网络设备 CSRF 攻击
一般情况下,外网不可以访问交换机等内网硬件,如果想访问内网设备,应该怎么办呢
注意,内网设备很多是默认密码的
首先,模拟正常用户身份登录->开启web管理端口的操作,用burp抓包后,抓取得到地址为
<img src=http://192.168.1.1/userRpm/ManageControlRpm.htm?port=80&ip=255.255.255.255&Save=%B1%A3+%B4%E6>
将这个攻击代码插入到想插入的地方,欺骗对方企业访问这个地址,访问之后对方设备的远程web管理端口就打开了
这段攻击代码三个功能,先开启80端口,把远程web管理IP地址改成255.255.255.255,保存
案例——CSRF自解压
将攻击代码嵌入到rar压缩软件的自解压选项中,用户点击这个压缩软件后,自动解压过程中,就触发了恶意代码(跟shellcode钓鱼类似)
补充:
在做免杀的时候也可以使用这个功能做自解压木马干掉杀毒软件
可以把一个木马进行拆分
先把注册表导入形式拆分
内存部分再拆分
启动项拆分导入形式
最后加一个自动.exe形式
burp 添加管理员账号
网站开源情况下,找到添加管理员账号的代码,模拟出添加管理员的数据包,再进行修改,只需要把地址改成要攻击网站,嵌入到恶意程序,诱骗管理员在管理状态中触发
流程总览
- 用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A;
- 在用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器
此时用户登录网站 A 成功,可以正常发送请求到网站 A; - 用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B;
可能是点击的邮件、qq会话中的链接地址 - 网站 B 接收到用户请求后,返回一些攻击性代码
攻击代码中要求用户浏览器去访问站点 A; - 浏览器在接收到这些网站B的返回数据后,根据网站 B 的请求,访问站点A
浏览器在用户不知情的情况下携带Cookie信息,向网站 A 发出请求。
网站 A 并不知道该请求其实是由 B 发起的,所以会根据用户C的Cookie信息和权限处理该请求
导致来自网站 B 的恶意代码被执行。
CSRF 攻击分类和检测防御
CSRF 漏洞一般分为站外和站内两种类型
CSRF 站外类型
本质上就是传统意义上的外部提交数据问题。
通常程序员会考虑给一些留言或者评论的表单加上水印以防止 SPAM 问题,
但是有时为了提高用户的体验性,可能没有对一些操作做任何限制,所以攻击者可以事先预测并设置请求的参数,在站外的 Web页面里编写脚本伪造文件请求,或者和自动提交的表单一起使用来实现 GET、POST 请求
当用户在会话状态下点击链接访问站外 Web 页面,客户端就被强迫发起请求。
SPAM 可以简单的理解为垃圾留言、垃圾评论,或者是带有站外链接的恶意回复
CSRF 站内类型
在一定程度上是由于程序员滥用$_REQUEST 类变量造成的。
在一些敏感的操作中,本来要求用户从表单提交发起 POST 请求传递参数给程序,
但是由于使用了$_REQUEST 等变量,程序也支持接收 GET 请求传递的参数,这就为攻击者使用CSRF创造条件。
一般攻击者只要把预测的请求参数放在站内一个贴子或者留言的图片链接里,受害者浏览了这样的页面就会被强迫发起这些请求。
CSRF漏洞检测:
检测CSRF漏洞是一项比较繁琐的工作,以下是一个最简单的流程:
- 抓取一个正常请求的数据包,
- 观察数据包里是否存在用户信息或者token相关的字段
如果有那么删除一下看看数据包是否正常,看看响应包是否正常,如果不正常则尝试放弃(绕过几率极小) - 然后删除origin字段重新提交
看看响应包是否正常,如果不正常则尝试放弃(绕过几率极小) - 最后去掉Referer字段后再重新提交
看看响应包是否正常,如果不正常那也可以尝试绕过 - 如果以上都正常,则生成POC,另一个浏览器登录验证。
CSRF漏洞防御
1、当用户发送重要的请求时需要输入原始密码
2、设置随机 Token
数据包里面有token,就是用来检测数据的唯一性
3、检验 referer 来源,请求时判断请求链接是否为当前管理员正在使用的页面(管理员在编辑文章,
黑客发来恶意的修改密码链接,因为修改密码页面管理员并没有在操作,所以攻击失败)
4、设置验证码
5、限制请求方式只能为 POST
6、origin:
对于更长远的建议,我们希望能用Origin字段来替代Referer,因为这样既保留了既有效果,又尊重了用户的隐私。
最终要废除利用token来防御CSRF的方式,因为这样网站就可以更好的保护无论是HTTP还是HTTPS请求,而不用担心token是否会泄露。
7、校验请求
严格区分好 POST 与 GET 的数据请求
8、业务上
验证码: 重要功能点使用动态验证码进行CSRF防护
原密码: 对于修改密码操作,推荐附加上原密码的验证
白名单: 对于那些有特定跨站需求的请求,网站应该建立一份白名单,比如主页等。
参考链接: