Java代码审计——WebGoat CSRF (上)

news2024/11/17 16:40:01

目录

前言:

(一)CSRF

0x01、简单介绍

0x02、实际案例

1.对 Referer 过滤不严导致的 CSRF 漏洞

2.token 可重用导致 CSRF 漏洞

3、webGoat中的CSRF

0x03 防御

3.1 STP

3.2 检查 Referer 字段

3.3 检查 Referer 字段


前言:

本篇文章将介绍二种请求伪造,第一种跨站请求伪造也就是我们的CSRF,第二种服务端请求伪造也就是我们的SSRF。

  1. CSRF 通俗的说就是构造payload 然后诱导受害者点击,从而利用受害者的身份去做一些事情
  2. SSRF 服务端请求伪造简单的来说就是,这个请求是服务端发起的,通常有的功能会存在从第三方的链接等获取资源,但是如果没有对资源来源进行一个限定那么就可以导致我们可以利用服务端来请求他本地或者他其中的内网信息

(一)CSRF


0x01、简单介绍

CSRFCross Site Request Forgery,跨站点请求伪造)是目前出现次数比较多的漏洞,该漏洞能够使攻击者盗用被攻击者的身份信息,去执行相关敏感操作。实际上这种方式是攻击者通过一些钓鱼等手段欺骗用户去访问一个自己曾经认证过的网站,然后执行一些操作(如后台管理、发消息、添加关注甚至是转账等行为)。由于浏览器曾经认证过,因此被访问的网站会认为是真正的用户操作而去运行。简而言之,CSRF 漏洞的工作原理是攻击者盗用了用户的身份,以用户的名义发送恶意请求。图 1-1 所示为 CSRF 漏洞的攻击原理

图 1-1 CSRF 漏洞的攻击原理

 从图 1-1 中可以看到,一次完整的 CSRF 攻击需要具备以下两个条件。

  • 用户已经登录某站点,并且在浏览器中存储了登录后的 Cookie 信息。
  • 在不注销某站点的情况下,去访问攻击者构造的站点。
总的来说, CSRF 漏洞攻击是一种比较简单的攻击,利用 Web 的隐式身份验证机制来达到攻击者的攻击目的

0x02、实际案例


        CSRF 攻击可能出现的场景有很多,如更改个人信息、添加 / 修改资料、关注用户或者与交易相关的操作等。CSRF 漏洞的出现通常是由于开发人员对该类型漏洞不了解,因而疏忽了对该类型漏洞的防范。
        通常来说,检测 CSRF 漏洞是一项比较烦琐的工作,最简单的方法就是抓取一个正常请求的 GET/POST 数据包,删除 Referer 字段后再重新提交,如果该提交操作有效,那么基本上可以确定该操作存在 CSRF 漏洞。 CSRF 漏洞一般不需要通过代码审计来发掘,业内已经有一些专门针对 CSRF 漏洞进行检测的工具,如 CSRFTester、CSRF Request Builder 等。

若要通过代码审计去挖掘 CSRF 漏洞,一般需要首先了解该开源程序的框架。CSRF 漏洞一般会在框架中存在防护方案,所以在审计 CSRF漏洞时,首先要熟悉框架对 CSRF 的防护方案,若没有防护方案,则以该框架编写的 所有 Web 程序都可能存在 CSRF 漏洞;若有防护方案,则可以首先去查看增删改请求中是否有 tokenformtokencsrf-token 等关键字,若有则可以进一步去通读该 Web程序对 CSRF 的防护源码,来判断其是否存在替换 token 值为自定义值并重复请求、重复使用 token 等漏洞。此外还要关注源程序是否对请求的 Referer 进行校验等。

        下面我们通过两段示例代码来讲解由于不同原因导致的 CSRF 漏洞:

1.对 Referer 过滤不严导致的 CSRF 漏洞


以下是对 Referer 过滤不严导致 CSRF 漏洞的核心代码:
public class RefererInterceptor extends HandlerInterceptorAdapter { 
    private Boolean check = true; 
    @Override 
    public boolean preHandle(HttpServletRequest req, 
        HttpServletResponse resp, Object handler) throws Exception { 
        if (!check) { 
             return true; 
        } 
        String referer=request.getHeader("Referer"); 
            if((referer!=null) &&(referer.trim().startsWith("www.testdomain.com"))){ 
                     chain.doFilter(request, response); 
            }else{ 
                     request.getRequestDispatcher("index.jsp").forward(request,response); 
                } 
 }
通过阅读上述代码可以判断出该段源码对于 CSRF 漏洞的防御流程如下:
  • 从用户的请求头中取得 Referer 值,判断其是否为空。
  • 若为空,则跳转至首页;若不为空,则进行下一步判断。
  • 判断 Referer 是否以  www.testdomain.com  开头,若不是,则跳转至首页;若是,则执行该操作请求。
        可以看到,这里逻辑判断的关键点在于第二步。该判断仅仅判断请求 Referer 字段是否以 www.testdomain.com 开头,若我们构建一个二级域名为 www.testdomain.com.hacker.com 的地址,则可能成功绕过该判断,从而进行 CSRF 攻击。

2.token 可重用导致 CSRF 漏洞


如下是某个源程序中判断 token 是否可用的核心代码:
String sToken = generateToken(); 
String pToken = req.getParameter(“csrf-token”); 
if(sToken != null && pToken != null && sToken.equals(pToken)){ 
     chain.doFilter(request, response); 
     }else{ 
            request.getRequestDispatcher(index.jsp”).forward(request,response); 
         } 
}
        在这段程序中,当用户登录成功后,首先通过 generateToken() 方法生成一个属于该用户的 token ,然后将其保存在服务端,并且将其镶嵌到 HTML 页面中的 <input> 标签内。当用户提交操作的时候,程序会比对该标签的 token 值是否等于服务端的 token 值,如果相等,则判断该操作是用户本人操作,而不是受到了 CSRF 攻击。
        从这里可以看到,其实这段源程序对于 CSRF 的防御机制是存在问题的。该段源程序在用户成功登录后,生成了唯一的令牌,直至该用户注销前,该 token 都是有效的。这就可能导致一个问题,如果这个 token 被盗用或者泄露,那么就可能导致 CSRF 漏洞的发生

3、webGoat中的CSRF


图 1-2 CSRF的任务要求

  •  我这里直接使用的是burp的功能,伪造一个CSRF,如图 1-3:
图 1-3 使用BP伪造一个恶意链接 

 

  • 但是发现生成过程中是有问题的,当我们点击payload中的submit之后,发现burp传输过程中的数据最后面会有一个莫名其妙的等号,如图 1-4:

图 1-4 BP抓取恶意链接的数据包

 

  • 我们来查看一下我们的poc,如图 1-5 

图 1-5 含hidden属性的恶意页面

 

  • 我们进行一下解码
      <input type="hidden" name="{
  "name"    : "WebGoat",
  "email"   : "webgoat@webgoat.org",
  "content" : "WebGoat is the best!!"
}" value="" />

  • 仔细观察发现 这里的name value是键值对,由于value为空 所以便会出现如下这种情况
{"name":"WebGoat","email":"webgoat@webgoat.org","content":"WebGoat is the best!!" }=

  • 所以我们需要对poc进行改进 ,因为无论如何都有 = 所以我们得把等号包含进去
name {"name": "WebGoat", "email": "webgoat@webgoat.org", "content": "WebGoat is the best!!", "ignoreme":"

Value 'sdfsdfdf"}

  • 这样的话正常结果就是如下
{"name": "WebGoat", "email": "webgoat@webgoat.org", "content": "WebGoat is the best!!", "ignoreme":"=sdfsdfdf"}
图 1-6 拿到flag

 

0x03 防御


3.1 STP

        STP Synchronizer Token Pattern ,令牌同步模式),这种防御机制是当用户发送请求时,服务器端应用将 token 嵌入 HTML 表格中,并发送给客户端。客户端提交HTML 表格,会将令牌发送到服务端,令牌的验证是由服务端实行的。令牌可以通过任何方式生成,只要确保其随机性唯一性。这样就能够确保攻击者发送请求的时候,由于没有该令牌而无法通过验证。
        上述第二个实例中,该源程序采用的就是这种机制来防御 CSRF 攻击,但是该源程序未保证 token 的唯一性,从而导致其CSRF 防御机制如同虚设。

3.2 检查 Referer 字段

HTTP 头中有一个 Referer 字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,一般情况下,Referer 字段应该与请求地址位于同一域名下。而如果是 CSRF 攻击传递来的请求, Referer 字段会是包含恶意攻击载荷的地址(如图 1-1 中的站点 B ),通过这种判断能够识别出 CSRF 攻击。这种防御手段的关键点在于如何建立合适的校验机制。在第一个实例中,如果我们建立一个白名单来替换判断 Referer 的开头字符检测,就可以阻止攻击者绕过 Referer的判断。

3.3 检查 Referer 字段

CSRF 的本质是攻击者通过欺骗用户去访问自己设置的地址,所以如果在所有用户进行敏感操作时,要求用户浏览器提供 保存在 Cookie 中且攻击者无法伪造的数据作为校验,那么攻击者就无法再进行 CSRF 攻击。这种方式通常是在请求时增加一个加密的字符串 token ,当客户端提交请求时,这个字符串 token也被一并提交上去以供校验。当用户进行正常的访问时,客户端的浏览器能够正确得到并传回这个字符串 token 。而通过 CSRF 攻击的方式,攻击者无法事先获取到该token 值,服务端就会因为校验 token 的值为空或者错误,拒绝这个可疑请求,从而达到防范 CSRF 攻击的目的。
        除以上 3 种主流方式外,还有很多其他方式,比如验证码机制、自定义 http 请求头方式、Origin 字段等,但是这些方法都存在各自的问题,如友好度差、存在机制绕过的可能等,因而只是作为辅助防御方式使用。
        值得注意的是,如果同一个站点存在 XSS 漏洞,XSS+CSRF 那么以上防御机制都可能失去原有效果.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GMO Research 2022年旅游调查:旅游业有望强劲增长

GMO Research (TOKYO: 3695)最近进行的一项旅行调查显示&#xff0c;随着边境再次开放&#xff0c;亚洲正在逐渐恢复正常的旅行模式。尽管该地区仍没有达到疫情前水平&#xff0c;旅行者仍持谨慎态度&#xff0c;但他们对海外旅行的兴趣显著增加。 为了解旅行模式和旅行意愿&a…

Intel OpenVINO 安装显卡驱动

背景&#xff1a; 使用集合诚KMDA-3301 OpenVINO CPU和GPU 算法加速&#xff0c;用GPU加速时&#xff0c;调动不起来。写下解决过程&#xff0c;以备后用。 过程&#xff1a; 调动GPU 报错&#xff1a; terminate called after throwing an instance of InferenceEngine::G…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校师生党建管理系统4d8du

最近大四学弟学妹们开始准备设计了&#xff0c;有一些问题问我&#xff0c;比如设计怎么做&#xff0c;有没有模板等等吧&#xff0c;大家都没有去学校&#xff0c;老师都是通过远程指导的&#xff0c;答辩也是远程答辩&#xff0c;这种情况下同学们不在一起&#xff0c;可能碰…

day13【代码随想录】环形链表II、环形链表、快乐数、各位相加、丑数、丑数||

文章目录一、环形链表 II&#xff08;力扣142&#xff09;二、环形链表&#xff08;力扣141&#xff09;三、快乐数&#xff08;力扣202&#xff09;四、各位相加&#xff08;力扣258&#xff09;五、丑数&#xff08;力扣263&#xff09;六、丑数||&#xff08;力扣264&#x…

JavaScript:File API和Blob API

web应用的痛点就是不能操作计算机上的文件。File API和Blob API可以安全访问到客户端上的文件。 File类型 现在我们可以在html表单中直接访问文件&#xff0c;比如&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"U…

PaddleOCR服务部署-并通过Java进行调用

上一篇讲了PaddleOCR的简单使用&#xff0c;但是最终的目的肯定是要将它进行服务部署方便我们调用的&#xff0c;这里介绍一下他的服务部署方式 选择部署方式 官方推荐有以下几种&#xff1a; Python 推理 C 推理 Serving 服务化部署&#xff08;Python/C&#xff09; Paddle…

电影寒冬之下,票房靠“主旋律”能撑住场吗?《扫黑行动》仍在重播

春节将近&#xff0c;各大院线陆陆续续公布了春节档将要上映的影片档期&#xff0c;小伙伴们是不是也对近期热门的影片有了兴趣&#xff0c;想要一饱眼福了呢。下面是小编根据网络公布的数据进行报表数据处理分析后得到的数据可视化图&#xff0c;展示了近期一些热门影片的情况…

数据库专辑--WITH CHECK OPTION的用法

系列文章 C#底层库–数据库访问帮助类&#xff08;MySQL版&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/126886379 文章目录系列文章前言一、概念介绍二、测试用例2.1 数据准备2.2 数据查询2.3 修改视图&#xff0c;加上WITH CHECK O…

IDEA 优质 插件 Translation 跟随 IDEA 2022.3 版 更新翻译引擎啦

IDEA 优质 插件 Translation 跟随 IDEA 2022.3 版 更新翻译引擎啦 文章目录IDEA 优质 插件 Translation 跟随 IDEA 2022.3 版 更新翻译引擎啦特征安装使用 IDE 内置插件系统安装&#xff1a;手动安装&#xff1a;使用1. 注册翻译服务&#xff08;可选&#xff09;2. 开始翻译3.…

BGP学习笔记

概念 动态路由协议按照按照工作范围可以分为IGP和EGP&#xff0c;IGP工作在一个AS之内&#xff0c;主要用来发现和计算路由&#xff0c;常见的IGP包括OSPF&#xff0c;RIP&#xff0c;ISIS等。EGP工作在AS与AS之间&#xff0c;在AS之间提供无环路的路由信息交换。BGP&#xff…

[附源码]Python计算机毕业设计Django基于Web的软考题库平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

ActiveMQ window安装、修改密码、启动一闪而过、设置8161端口仅本地访问

目录 1.ActiveMQ下载 2.ActiveMQ目录说明 3.启动activemq 4.修改activemq默认密码 5.设置8161端口仅本地访问。 1.ActiveMQ下载 官网下载ActiveMQhttps://activemq.apache.org/ window版本直接解压就可以。 2.ActiveMQ目录说明 apache-activemq-5.16.5 activemq目录结构…

这几款文档笔记工具,你习惯用哪个?

前言 俗话说的好&#xff1a;“好记性不如烂笔头”&#xff0c;平时工作记录笔记的确是一个良好的习惯&#xff0c;做文档笔记可以在我们遗忘时进行回看&#xff0c;方便查找&#xff0c;代替人的大脑。有时程序写多了&#xff0c;很不愿意去强制记忆一些东西&#xff0c;那么…

【高度预估】基于matlab卡尔曼滤波和粒子滤波无人机离地高度估计【含Matlab源码 2255期】

⛄一、卡尔曼滤波和粒子滤波无人机离地高度估计 1 无人机离地高度估计算法 1.1 离地高度估计基本方案 无人机安装两路距离测量传感器, 传感器能在小型无人机飞行的一般高度正常工作, 且两个传感器的安装位置保证它们能够测量相同的离地高度信息。 两路距离测量传感器以1s的频…

单源最短路径(贪心算法)

最近在研究算法设计与分析&#xff0c;看到了单源最短路劲&#xff0c;特发文一篇。 下面代码就是实现这个有向联通图 废话不说直接上代码 #include<stdio.h> #define m 5000 int c[5][5] {m,10,m,30,100,m,m,50,m,m,m,m,m,m,10,m,m,20,m,60,m,m,m,m,m, }; int dist[5]…

现在市面跑步耳机哪款好用、分享五款适合跑步用的耳机推荐

近这两年来&#xff0c;运动健身风潮一直都非常火&#xff0c;但是一个人运动健身&#xff0c;难免无聊&#xff0c;如果有音乐的陪伴&#xff0c;时间都能过得快很多&#xff0c;这时候就需要一款运动蓝牙耳机了。不过购买运动蓝牙耳机&#xff0c;比挑选普通的耳机还更需要花…

[附源码]Python计算机毕业设计Django架构的博客平台设计

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

节约软件开发成本,关键在这儿。

​1、节省软件开发成本的核心在减少返工&#xff01; 软件企业利润 销售额 - 成本。企业的利润少&#xff0c;可能是销售额太少&#xff0c;也可能是成本太高。而增加销售额&#xff0c;取决于销售人员、客户、市场、产品等众多不可控因素&#xff0c;可遇而不可求。相反&…

RabbitMQ-死信交换机

文章目录1 死信交换机1.1.什么是死信交换机1.2 利用死信交换机接收死信1.3 总结2 TTL2.1 接收超时死信的死信交换机2.2 声明一个队列&#xff0c;并且指定TTL2.3 发送消息时&#xff0c;设定TTL2.4.总结3 延迟队列3.1 DelayExchange原理3.2 使用DelayExchange3.3 总结1 死信交换…

智云通CRM:如何判断客户忠诚度的高低?

客户忠诚度是一个相对概念&#xff0c;说明了客户在购买同类产品或服务时对某一企业或品牌光顾比重的高低。注意&#xff0c;不能跨产品或服务进行客户忠诚度比较&#xff0c;因为这样比较是没有意义的。客户忠诚度可以通过以下指标来衡量。 一、 客户重复购买的次数 客户重复…