少女祈祷中...

初步了解:看见哪些函数可以使用SSRF

  1. curl_exec()

    • 用途:发起 HTTP 请求(如 GET/POST)。

    • 风险:直接使用用户输入的 URL 参数,可能导致服务器访问任意目标。

    • 示例代码

      1
      2
      3
      $url = $_GET['url'];
      $ch = curl_init($url);
      curl_exec($ch);
  2. file_get_contents()

    • 用途:读取文件或 URL 内容。

    • 风险:若参数可控,可通过 file:// 协议读取本地文件,或通过 http:// 访问内网资源。

    • 示例代码

      1
      $content = file_get_contents($_GET['url']);
  3. fsockopen()

    • 用途:创建网络套接字连接。

    • 风险:直接使用用户输入的 IP 和端口,可能导致端口扫描或访问内网服务。

    • 示例代码

      1
      2
      3
      $host = $_GET['host'];
      $port = $_GET['port'];
      $socket = fsockopen($host, $port);
  4. stream_socket_client()

    • 用途:创建网络流连接。
    • 风险:与 fsockopen() 类似,参数可控时可访问任意地址。
  5. file_put_contents()

    • 用途:写入文件或 URL 内容。
    • 风险:结合 php://filter 等协议可篡改文件内容。
  6. parse_url()

    • 用途:解析 URL。

    • 风险:若未严格验证 URL 格式,可能被利用构造恶意协议(如 dict://)。

1.前置知识:

为什么我们可以访问内网?—–NAT协议

NAT协议———–把我们的内网的ip作为公网的一个端口,当访问公网+那个端口时候,就会直接访问内网

image-20250324082339821

2.实战:

步骤:

1.先尝试

1
http://www.baidu.com/img/PC_wenxin_1142bc061306e094e6eddaa3d9656145.gif

如果有返回就是存在SSRF

2.尝试读取本地文件

1
2
3
4
?url=file:///c:/windows/system32/drivers/etc/hosts 
?url=file:///etc/passwd

?url=file:/c:/www/ssrf/ssrf_curl.php

3.可利用的协议

1
2
3
4
5
6
file:///  -- 本地文件传输协议,主要用于访问本地计算机中的文件
dict:// -- 字典服务器协议,dict是基于查询相应的TCP协议,服务器监听端口2628
sftp:// -- SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol)
ldap:// -- 轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议
tftp:// -- 基于lockstep机制的文件传输协议,允许客户端从远程主机获取文件或将文件上传至远程主机
gopher:// -- 互联网上使用的分布型的文件搜集获取网络协议,出现在http协议之前

4.简单的基础例题:

deb3bc3370a23825429ce58c4e43a9a4