SSRF漏洞详解

一、SSRF漏洞简介

SSRF漏洞最大的作用是可以使攻击者攻击其内网,由于外网无法访问至内部服务器,攻击者可以控制拥有此漏洞的服务器作为跳板机,对其本机文件和内网服务器进行攻击行为。

二、SSRF漏洞原理

当一个web应用需要接收一个url作为参数时,此参数未经过过滤,从而被接受参数的函数进行解析,对内部文件或者内外部服务器发起特殊请求,导致了SSRF漏洞

三、业务中可以为url的参数的函数

PHP中有curl_exec()、fsockopen()、file_get_contents()等函数

curl_exec(), fsockopen(), 和 file_get_contents() 都可以接收 URL 作为参数,用于进行网络请求或获取远程文件的内容。然而,它们在处理 URL 时有一些细微的区别。

  1. curl_exec(): curl_exec() 是使用 cURL 库执行 HTTP 或 HTTPS 请求的函数。它可以接收一个 URL 字符串作为参数,并返回从该 URL 获取的数据。cURL 提供了大量的选项,可以定制请求的类型、HTTP 方法、头信息、身份验证等。因此,当你需要更高级的 HTTP 功能时,例如处理 cookie、重定向或基本的身份验证,通常会选择使用 cURL。
  2. fsockopen(): fsockopen() 是 PHP 的一个原生函数,用于打开一个网络连接(比如 HTTP、FTP、SMTP 等)。它也可以接收一个 URL 作为参数,但与 curl_exec() 不同,fsockopen() 通常只用于简单的 HTTP 请求,它不支持 HTTPS,也不提供太多的定制选项。一般而言,当你只需要简单地获取或发送数据时,可能会选择使用 fsockopen()
  3. file_get_contents(): file_get_contents() 是 PHP 的一个内置函数,用于从本地文件或 URL 中获取内容。它也接受一个 URL 作为参数,但与 fsockopen()curl_exec() 不同,file_get_contents() 不能用于处理 HTTP 请求的响应。它仅仅是读取文件的内容。因此,当你需要从本地文件系统或远程文件URL读取数据时,通常会选择使用 file_get_contents()

总之,这三个函数都可以接收 URL 作为参数,但 curl_exec() 是最强大的,适用于需要进行定制的 HTTP 请求。fsockopen() 则适用于简单的 HTTP 请求。而 file_get_contents() 则适用于从本地文件或远程文件URL读取数据。

fsockopen()函数脚本

<?php
// 从URL参数获取主机名
$host=$_GET['url']; 

// 使用fsockopen函数打开一个连接到指定主机的80端口。这个函数的参数依次是:主机名/IP,端口号,错误号,错误消息,连接超时时间(以秒为单位)
$fp = fsockopen($host, 80, $errno, $errstr, 30); 

// 判断连接是否成功
if (!$fp) {
    // 如果连接失败,输出错误消息和错误号
    echo "$errstr ($errno)<br />\n"; 
} else {
    // 构造一个HTTP/1.1的GET请求,首先发送请求行,然后是请求头部
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: $host\r\n"; // 添加Host头部,表示请求的主机名
    $out .= "Connection: Close\r\n\r\n"; // 添加Connection头部,表示完成请求后立即关闭连接

    // 将请求发送到已打开的套接字中
    fwrite($fp, $out); 

    // 在接收到服务器响应之前持续读取并输出数据
    while (!feof($fp)) {
        echo fgets($fp, 128); 
    }
    // 关闭套接字连接
    fclose($fp);
}
?>

curl_exec()函数脚本

<?php
// 使用 POST 方法从客户端接收 'url' 参数并赋值给 $url 变量
$url=$_POST['url'];

// 使用 cURL 初始化一个 cURL 会话,并将 URL 传递给它
$ch=curl_init($url);  //创造一个curl资源

// 设置 cURL 选项,此处设置的是将 HTTP 头部的信息忽略掉
curl_setopt($ch, CURLOPT_HEADER, 0); //设置url和相应的选项

// 设置 cURL 选项,此处设置的是将每次请求的结果以字符串形式返回,而不是直接输出到浏览器
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

// 执行 cURL 会话并获取结果,然后将结果传递给浏览器(输出到浏览器)
$result=curl_exec($ch); // 抓取url并将其传递给浏览器

// 关闭 cURL 资源,释放内存
curl_close($ch); //关闭curl资源

// 输出结果
echo ($result);
?>

file_get_contents()函数脚本

<?php
// 开始PHP脚本

$url = $_GET['url'];;
// 从全局变量数组$_GET中获取键为'url'的值,并将其赋值给变量$url。$_GET是PHP中用于收集HTML表单数据的数组。

echo file_get_contents($url);
// 使用file_get_contents函数读取并输出$url所指向的URL的内容。这可能是HTML、文本或者其它类型的网页内容。

?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值