初探SSRF漏洞

初探SSRF漏洞


原理剖析:

能够对外发送网络请求的点都有可能存在ssrf漏洞

SSRF(Server-Side Request Forgery: 服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

image-20210325130158963

危害:

  • 对目标服务器所在的内网进行IP存活性扫描和端口扫描。
  • 利用扫描的指纹信息判断开放的服务,从而对内网的主机进行攻击。
  • 识别内网WEB应用指纹,判断应用类型进行攻击。
  • 使用特定协议攻击应用(gopher、dict、file、FTP/SFTP等)

业务场景:

  • 分享:通过URL地址分享网页内容。
  • 转码服务(手机适配)。
  • 在线翻译(百度翻译搜索检索IP的网址:http://www.ip.cn)(已修复)。
  • 图片加载与下载:通过URL地址加载或下载图片。
  • 图片、文章收藏功能。
  • 未公开的api实现以及其他调用URL的功能。
  • 从URL关键字中寻找(share、wap、url、link、src、source、target、sourceURI、imageURL、domain)

总之,一切需要服务器去请求资源的场景都有可能存在SSRF漏洞。

涉及函数:

  • file_get_contents()

    条件:allow_url_fopen=ON

  • fsockopen()

  • curl_exec()

    条件:

    1、PHP版本>=5.3;

    2、开启extension=php_curl.dll;

    3、–wite-curlwrappers(编译PHP时用)

实例:

实验环境:

kali:192.168.1.115 开放端口:redis 6379,mysql 3306,ssh 22。

window10:192.168.1.120

1、curl_exec()函数

后端代码:

#curl_exec.php
<?php
$url = $_GET['url'];
$curlobj = curl_init($url);  //初始化一个新的会话,返回一个cURL句柄(句柄就是用来标识一个对象),供curl_setopt(), curl_exec()和curl_close() 函数使用。
echo curl_exec($curlobj);  //执行 cURL 会话,返回执行结果
?>

探测内网kali的22端口是否开放:

image-20210326144241280

如图所示,返回了ssh版本信息,说明kali的22端口开放。

探测内网存活的主机:

输入一个不存在的主机IP

image-20210326144613192

延迟了大概有17秒左右,排除网络拥塞的情况,大概率可以判断该主机不存在。

输入一个存活主机的IP:

image-20210326144827585

延迟了大概三秒左右,与上例差异较大,可以初步判断该主机是存活状态。

利用dict协议探测:

image-20210326150522410 image-20210326150630171

说明ssh和redis服务均开启。

2、file_get_contents()函数

后端源码:

#file_get_contents.php
<?php
if(isset($_POST['url']))  
{
    $content=file_get_contents($_POST['url']);  //将整个文件读入一个字符串
    $filename='./images/'.rand().'.img';
    file_put_contents($filename,$content);  //将一个字符串写入文件
    echo $_POST['url'];
    $img="<img src=\"".$filename."\"/>";
}
echo $img;
?>

探测kali的22端口:

image-20210326152511204

探测kali的6379端口:

image-20210326152714956

由图可知均成功开启!

探测kali的8889端口:

image-20210326152851898

image-20210326153026256

如图所示,高延迟且回显错误,可以初步判断8889端口没有开启。

3、fsockopen()函数

后端源码:

#fsockopen.php
<?php
$host=$_GET['url'];
$port=$_GET['port'];
# fsockopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间)
$fp = fsockopen($host, intval($port), $errno, $errstr, 30); //打开一个网络连接或者一个Unix套接字连接
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: $host\r\n";
    $out .= "Connection: Close\r\n\r\n";
	# fwrite() 函数将内容写入一个打开的文件中。
    fwrite($fp, $out);
	# 函数检测是否已到达文件末尾 ,文件末尾(EOF)
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}
?>

探测kali的22端口:

image-20210326154922033

如图所示,kali的22端口开启。


小结:

可以利用SSRF漏洞进行内网探测,根据回显信息可以大致判断内网中某主机的存活性,或者某主机的一个端口是否开放,不过值得注意的是:回显报错和高延迟并不一定代表主机不存在,实际中情况比较复杂应灵活对待。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值