首先,先介绍一下ssrf。ssrf即服务器端请求伪造,是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。而且因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统。也就是说可以利用一个网络请求的服务,当作跳板进行攻击,也就是说在这个过程中,网站成为了中间人。
攻击者利用了可访问Web服务器(A)的特定功能 构造恶意payload;攻击者在访问A时,利用A的特定功能构造特殊payload,由A发起对内部网络中系统B(内网隔离,外部不可访问)的请求,从而获取敏感信息。此时A被作为中间人(跳板)进行利用。
其次是漏洞的成因:由于服务端提供了从其他服务器应用获取数据的功能,但同时又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。比如,攻击者操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片,下载等,利用的就是服务端请求伪造,SSRF利用存在缺陷的WEB应用作为代理 攻击远程和本地的服务器。
攻击方式:
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网web应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5.利用file协议读取本地文件等。
这个图我觉得还是比较清晰的
接下来就是在实战中学习了
以ctfhub为例:
第一题,在题目上已经给了提示,让该url
直接在参数这里改也可以,使用bp修改也可以
得到了flag
第二题
是伪协议读取文件,题目也是给了提示
URL伪协议大概有这些:
- file:///
- dict://
- sftp://
- ldap://
- tftp://
- gopher://
这里有大佬教用法的博客
这里要用到第一个,因为一般而言,网站目录就是var/www/htm,尝试构造
进入了这个界面
使用查看器得到了flag
第三题,端口扫描
这里题目一开始就告诉我们了,端口范围在8000-9000,根据这个端口范围其实也可以考虑到爆破了
这里使用bp抓包,送到爆破模块,设置爆破的变量
设置范围,开始爆破
通过爆破结果可知,有一个长度不同的相应数据包
查看回显得到了flag
第四题,POST请求
根据提示可知,可能文件放到了一个网页的目录之下,这里先选择用之前的伪协议来,看一下文件源码
根据提示信息可知,需要从127.0.0.1去访问,修改好以后继续访问
拿到了KEY,这个题目因该就是告诉我需要给服务器发送一个KEY就能得到你想要的东西。但是页面上又什么都没有,这就需要我们构建一个POST请求包来发送这个KEY。
在网上搜索了一下,post请求包的格式
构造
gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
key=6f56a5dac9b43bb2e3176a68a8917eaa
插入变量,发现有问题
根据回显400,可知,这里出现了语法的错误,这里的状态码是服务器不理解语法,这里我认为应该是,POST请求包里面的内容被拆分开来了,然后被识别错误了
这里进行url编码
gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250d%250AHost:%2520127.0.0.1:80%250d%250AContent-Type:%2520application/x-www-form-urlencoded%250d%250AContent-Length:%252036%250d%250A%250d%250Akey=6f56a5dac9b43bb2e3176a68a8917eaaf%250d%250a
再次插入,得到了flag