文章目录
- 1、SSRF概述
- 2、SSRF(URL)
- 3、SSRF(file_get_content)
1、SSRF概述
SSRF(Server-Side Request Forgery:服务器端请求伪造):其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。
数据流:攻击者 → \rightarrow →服务器 → \rightarrow →目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样。PHP中下面函数的使用不当会导致SSRF:
- file_get_contents()
- fsockopen()
- curl_exec()
如果一定要通过后台服务器远程去对用户指定(“或者预埋在前端的请求”)的地址进行资源请求,则请做好目标地址的过滤。
2、SSRF(URL)
(1)点击累了吧,来读一首诗吧
;
可以看到url栏中传入了一个url
的参数。
(2)既然url
参数是一个地址,那我们直接换成https://www.baidu.com
。可以发现,跳转到百度页面了。
(3)查看后端源代码。
curl_init()
:初始化一个新的会话,返回一个cURL句柄,供curl_setopt(), curl_exec()和curl_close() 函数使用。curl_setopt()
:设置一个cURL传输选项。curl_exec()
:执行一个cURL会话。
关于curl:
PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。
libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。
(4)查看本地密码,payload:http://192.168.92.1:32769/vul/ssrf/ssrf_curl.php?url=file:///etc/passwd
3、SSRF(file_get_content)
(1)同上一题,又得到一个带参数的链接,参数名file,参数值是个url。
(2)关于file_get_contents()
file_get_contents() 把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
(3)这次用php伪协议中的php://filter/
,构造payload:http://192.168.92.1:32769/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=./ssrf_fgc.php
base64解码: