SSRF

SSRF介绍

SSRF(Server-Side Request Forgery:服务器端请求伪造)

其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制

导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据

数据流:攻击者—–>服务器—->目标地址

根据后台使用的函数的不同,对应的影响和利用方法又有不一样

1
2
3
4
# PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()

file_get_contents — 将整个文件读入一个字符串

说明

1
2
3
4
5
6
7
file_get_contents(
string $filename,
bool $use_include_path = false,
resource $context = null,
int $offset = 0,
int $length = null
): string|false

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
2
curl_init(?string $url = null):CurlHandle|false
# 初始化新会话,返回 cURL 句柄

curl_setopt

1
2
3
curl_setopt(CurlHandle $handle, int $option, mixed $value): bool
# 为 cURL 会话句柄设置选项
# 成功时返回 true, 或者在失败时返回 false。
参数
  • handle

    由 curl_init() 返回的 cURL 句柄。

  • option

    需要设置的CURLOPT_XXX选项。

  • value

    将设置在option选项上的值。

curl_exec

1
2
curl_exec(CurlHandle $handle): string|bool
# 执行指定 cURL 会话。
参数
  • 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