SSRF服务器端请求伪造
SSRF
SSRF介绍
SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者—–>服务器—->目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
1 | # PHP中下面函数的使用不当会导致SSRF: |
file_get_contents — 将整个文件读入一个字符串
说明
1 | file_get_contents( |
和file()
一样,只除了**file_get_contents()**把文件读入一个字符串。将在参数offset
所指定的位置开始读取长度为length
的内容。如果失败,**file_get_contents()**将返回 false
。
Note:
如果要打开有特殊字符的 URL (比如说有空格),就需要使用**urlencode()**进行 URL 编码。
参数
filename
要读取的文件的名称。
use_include_path
常量 FILE_USE_INCLUDE_PATH 用于触发搜索include path。因为 FILE_USE_INCLUDE_PATH 是个 int,如果开启了严格类型将无法启用。所以要用
true
来代替常量。context
**stream_context_create()**创建的有效的上下文(context)资源。 如果你不需要自定义 context,可以用
null
来忽略。offset
读取原始数据流的开始位置偏移量。负的 offset 会从数据流的末尾开始统计。远程文件不支持偏移量寻址(offset)。对远程文件以较小的 offset 可能可以正常寻址,但由于是对缓冲流进行操作,所以操作结果不可预测。
length
要读取数据的最大长度。默认情况下会读到文件末尾。注意,该参数会应用到处理 stream 的过滤器(filter)中。
返回值
函数返回读取到的数据,或者在失败时返回 false
。
Warning
此函数可能返回布尔值
false
,但也可能返回等同于false
的非布尔值。请阅读 布尔类型章节以获取更多信息。应使用**=== 运算符
**来测试此函数的返回值。
curl相关函数
说明
curl_init
1 | curl_init(?string $url = null):CurlHandle|false |
curl_setopt
1 | curl_setopt(CurlHandle $handle, int $option, mixed $value): bool |
参数
handle
由 curl_init() 返回的 cURL 句柄。
option
需要设置的CURLOPT_XXX选项。
value
将设置在option选项上的值。
curl_exec
1 | curl_exec(CurlHandle $handle): string|bool |
参数
handle
由 curl_init() 返回的 cURL 句柄。
漏洞实现
pikachu靶场的SSRF漏洞
SSRF(curl)
payload:http://127.0.0.1/pages/pikachu-master/vul/ssrf/ssrf_curl.php?url=https://baidu.com
SSRF(file_get_content)
payload:http://127.0.0.1/pages/pikachu-master/vul/ssrf/ssrf_fgc.php?file=d:/a.txt