文章目录
- 前言
- 环境
- 第一关、SSRF(curl)
- Step.1、http协议链接本地文件
- Step.2、file协议读取C盘下的配置文件
- Step.3、dict协议扫描内网其他主机的端口开放情况
- Step.4、使用burp扫描内网其他主机的端口开放情况
- Step.5、后端源码分析
- 第二关、SSRF(file_get_content)
- Step.1、连接指定网址
- Step.2、file协议读取C盘下的配置文件
- Step.3、php伪协议读取php源码
- Step.4、http协议读对方根目录的文件
- Step.5、后端源码分析
- file_get_contents 与 curl_exec的区别
前言
SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者----->服务器---->目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
如果一定要通过后台服务器远程去对用户指定(“或者预埋在前端的请求”)的地址进行资源请求,则请做好目标地址的过滤。
靶场一共有2关,现我们就开始通关吧。
环境
靶场安装机器:Windows10(192.168.1.106)
第一关、SSRF(curl)
如图,就一个链接,点击它看看吧
Step.1、http协议链接本地文件
在网站输入框中的url=后面改成:127.0.0.1/2.php
发现可以链接根目录的文件
Step.2、file协议读取C盘下的配置文件
把url=后面的内容修改为:file:///C:/Windows/win.ini
也可以顺利读出来。
Step.3、dict协议扫描内网其他主机的端口开放情况
我这里探测的主机是192.168.1.114
如图,显示无权限链接,就说明该主机开启了数据库。
这里同理,也可以使用burp,来查看该主机开启了什么端口。具体操作步骤如下。
Step.4、使用burp扫描内网其他主机的端口开放情况
为了节省时间就扫描了0~65535端口的主机来进行探测
抓包,并把抓到的包发送到攻击模块
配置payload,为了节省时间,就扫描了1~8080端口
设置为单线程准确性更高
结果如下:
到这里第一关通关
。
Step.5、后端源码分析
前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
第二关、SSRF(file_get_content)
点击一下,看看
Step.1、连接指定网址
这里就直接是选用baidu了
Step.2、file协议读取C盘下的配置文件
把url=后面的内容修改为:file:///C:/Windows/win.ini
Step.3、php伪协议读取php源码
这里读取的是一个放在www目录下的2.php文件
php://filter/read=convert.base64- encode/resource= ../../../2.php
Step.4、http协议读对方根目录的文件
我这里读取一个名为hello.txt的文件内容
第二关通关
。
Step.5、后端源码分析
本关使用了file_get_contents() 函数,该函数将指定 URL 的文件读入成一个字符串并返回。
file_get_contents 与 curl_exec的区别
-
curl_exec 支持更多协议,有http、https、ftp、gopher、telnet、dict、file、ldap;模拟 Cookie 登录,爬取网页;FTP 上传下载。
-
file_get_contents 只能使用 GET 方式获取数据。