WEB漏洞系列-SSRF(服务器端请求伪造)

一、漏洞原理

SSRF(Server-Side Request Forgery 服务器端请求伪造)是由攻击者伪造从服务端发起请求的安全漏洞。即攻击者伪造服务端的请求发起攻击,通过服务端作为跳板攻击目标系统。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。因为 SSRF 的存在,请求是由服务端发起,所以能够请求与它相连并与外网隔离的内部系统。SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定 URL 地址获取网页文本内容,加载指定地址的图片,下载等。

二、漏洞危害

SSRF 可以进行内外网的端口和服务探测、主机本地敏感数据的读取、内外网主机应用程序漏洞的探测和利用等。其中 SSRF 分为回显型 SSRF非回显型 SSRF,所谓的回显型的 SSRF 就是会将访问到的信息返回给攻击者,而非回显的 SSRF 则不会,但是可以通过dns log或者访问开放/未开放的端口导致的延时来判断。

三、漏洞位置

能对外网发起访问的功能点都有可能存在 SSRF。例如:(摘抄)

功能点 具体描述
1、社交分享功能 获取超链接的标题等内容进行显示
2、转码服务 通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3、在线翻译 给网址翻译对应网页的内容
4、图片加载/下载 例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
5、图片/文章收藏功能 主要网站会取URL地址中title以及文本的内容作为显示以求一个好的用户体验
6、云服务厂商 它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行SSRF测试
7、网站采集,网站抓取的地方 一些网站会针对你输入的url进行一些信息采集工作
8、数据库内置功能 数据库的比如mongodb的copyDatabase函数
9、邮件系统 比如接收邮件服务器地址
10、编码处理, 属性信息处理,文件处理 比如ffpmg,ImageMagick,docx,pdf,xml处理器等
11、未公开的api实现以及其他扩展调用URL的功能 可以利用google 语法加上这些关键字去寻找SSRF漏洞,一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……
12、从远程服务器请求资源 upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php

四、漏洞环境搭建

SSRF 项目源码来自于 https://github.com/sqlsec/ssrf-vuls,本次搭建环境为 Windows10、windwos7 + Phpstudy

利用 windows 10与 windwos 7 搭建同网段网站。windows 10 搭建存在 SSRF 漏洞的站点,windwos 7 搭建同网段中存在漏洞的站点,利用 SSRF 漏洞进行同网段漏洞探测

image-20221007163514324

windwos 10 新建 SSRF 靶场,即项目源码 172.72.23.21-SSRF,设置为 8002端口

image-20221007171837778

搭建完毕后界面,主要就是请输入查询的网站这个输入框,为 SSRF 漏洞点。

image-20221007165405852

windows 7 搭建代码注入靶场,对应项目源码 172.72.23.22-CodeExec

image-20221007171909704

搭建完毕后界面。

image-20221007165325659

搭建 XXE 漏洞靶场,对应项目源码 172.72.23.25-XXE

image-20221007171941968

搭建完毕后界面。

image-20221007172006303

五、漏洞复现

由于网站有对外请求的功能点,所以尝试是否存在 SSRF

image-20221007170010476

对外请求测试,测试证明可以对外发起请求

image-20221007170254968

尝试对内网发起请求,会不会有响应,测试 127.0.0.1 站点,存在响应,由于该网站端口为 8002 ,测试请求127.0.0.1:8002 端口,即内网请求

image-20221007170432511

成功响应,证明存在 SSRF ,为回显型 SSRF

image-20221007170651376

利用 Burp 抓包,定位到漏洞参数为 url,此时我们可以利用搞漏洞点进行内网探测。

image-20221007170820274

首先,我们可以利用 SSRF 获取本机 hosts 文件,查看本机信息,linux则可以读取 /etc/passwd、.bash_history 等文件。

利用 file 协议读取文件,file:///C:\Windows\System32\drivers\etc\hosts,发现存在 192.168.114.0 网段。此时,我们就可以将目标转为对该网段的探测。

image-20221007172122214

对 192.168.114.0/24,网段进行探测。利用 Burp Custom iterator(自定义迭代器)功能进行爆破。首先,我们需要爆破IP+端口,表现形式为 1:8000,我们有两个参数需要进行爆破,迭代器需要选择2个,以 :,作为分隔符。

image-20221007183132200

image-20221007183424214

原理已知知道了,这里的不放大字典跑浪费时间了,验证存在即可。

image-20221007183450725

通过Funzing 得知同网段中存在 192.168.114.141:9000192.168.114.141:9001 两个站点

image-20221007184331198

image-20221007184353393

接下来进行漏洞探测,探测刚才找寻出来的站点是否存在漏洞。

SSRF CodeExec 代码执行

因为是直接搭建的环境,属于上帝视角,直接来到最后一步了,我们只需要知道,回显型的 SSRF 可以通过返回的信息从而获知是否存在漏洞,从而达到内网探测。

image-20221007184707998

这个马儿是环境自带的。

SSRF XXE

通过回显抓取POST包,并进行探测,在实战中可能存在各种情况,也许只能探测,其他啥也做不了,具体得看具体环境。

image-20221007185255038

image-20221007185308197

image-20221007185521598

看到使用 XML 格式,尝试构造 XXE 语句进行漏洞测试。这里留个坑,有兴趣的可以直接查看参考文章第一篇,前辈的环境、讲解、言语友好易懂,值得推荐。

六、Bypass

SSRF 测试功能点时,常规 Payload 没有发现存在 SSRF 也许是后台对其进行了过滤,我们就可以通过 Fuzzing 进行 Bypass。后续对 Fuzzing 学习时再进一步深入。

1
2
3
4
5
6
http://google.com:80+&@127.88.23.245:22/#+@google.com:80/
http://127.88.23.245:22/+&@google.com:80#+@google.com:80/
http://google.com:80+&@google.com:80#+@127.88.23.245:22/
http://127.88.23.245:22/?@google.com:80/
http://127.88.23.245:22/#@www.google.com:80/
http://google.com:80\\@127.88.23.245:22/

七、小结

通过前辈们的靶场以及文章,进一步加深对 SSRF 的了解。不积跬步,无以至千里。

八、参考文章

1
2
3
4
https://www.sqlsec.com/2021/05/ssrf.html
https://mp.weixin.qq.com/s/EYVFHgNClgNGrk_92PZ90A
https://cloud.tencent.com/developer/article/1561355
https://yinwc.github.io/2018/11/16/SSRF/