1、SSRF漏洞介绍:
SSRF漏洞(服务器端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。
2、SSRF漏洞原理:
SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。SSRF是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
各个协议调用探针:http,file,dict,ftp,gopher等。
3、SSRF漏洞利用手段:
(1)可以对外网、内网、本地进行端口扫描,某些情况下端口的 Banner 会回显出来(比如3306的);
(2)攻击运行在内网或本地的有漏洞程序(比如溢出);
(3)可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹;
(4)攻击内网或外网有漏洞的Web应用;
(5)使用file:///协议读取本地文件(或其他协议)
4、SSRF漏洞绕过方法:
(2)添加端口号 http://127.0.0.1:8080
(3)短地址 安全验证
(4)可以指向任意 ip 的域名 xip.io
(5)ip地址转换成 进制 来访问 192.168.0.1=3232235521(十进制)
(6)非HTTP协议
(7) DNS Rebinding
一、SSRF( curl )
我们先看下curl的用法:PHP cURL 函数 | 菜鸟教程
PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。
libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP基于表单的上传、代理、cookies和用户名+密码的认证。
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "ssrf_curl.php"){
$ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}
$FILEDIR = $_SERVER['PHP_SELF'];
$RD = explode('/',$FILEDIR)[1];
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR.'header.php';
//payload:
//file:///etc/passwd 读取文件
//http://192.168.1.15:22 根据banner返回,错误提示,时间延迟扫描端口
if(isset($_GET['url']) && $_GET['url'] != null){
//接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF
$URL = $_GET['url'];
$CH = curl_init($URL);
curl_setopt($CH, CURLOPT_HEADER, FALSE);
curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
$RES = curl_exec($CH);
curl_close($CH) ;
//ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
//除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet
//curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
echo $RES;
}
?>
<div class="main-content">
<div class="main-content-inner">
<div class="breadcrumbs ace-save-state" id="breadcrumbs">
<ul class="breadcrumb">
<li>
<i class="ace-icon fa fa-home home-icon"></i>
<a href="ssrf.php"></a>
</li>
<li class="active">概述</li>
</ul>
<a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
data-content="先了解一下php中curl相关函数的用法吧">
点一下提示~
</a>
</div>
<div class="page-content">
<a href="ssrf_curl.php?url=<?php echo 'http://127.0.0.1/'.$RD.'/vul/ssrf/ssrf_info/info1.php';?>">累了吧,来读一首诗吧</a>
</div><!-- /.page-content -->
</div>
</div><!-- /.main-content -->
<?php
include_once $PIKA_ROOT_DIR . 'footer.php';
?>

http://127.0.0.1:83/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/vul/vul/ssrf/ssrf_info/info1.php
http://127.0.0.1:83/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1:83/vul/vul/ssrf/ssrf_info/info1.php

我们依次点击,发现这里出现了一个url地址http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php

因为curl支持很多协议,我们就可以做以下尝试:
1、通过网址访问链接
比如说修改url为:url=百度一下,你就知道,访问百度页面:
http://127.0.0.1/vul/ssrf/ssrf_curl.php?url=https://www.baidu.com

2、利用file协议查看本地文件
修改url为:url=file:///d:/test.txt,查看文件的内容:

http://127.0.0.1/vul/ssrf/ssrf_curl.php?url=file:///D:/phpstudy_pro/WWW/test1.txt

3、dict协议扫描内网主机开放端口
使用dict协议可以获取内网主机开放端口相应服务的指纹信息,比如说内网主机开了http端口的话,
可以修改url为:url=dict://192.168.198.1:21:



二、SSRF(file_get_content)
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "ssrf_fgc.php"){
$ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}
$FILEDIR = $_SERVER['PHP_SELF'];
$RD = explode('/',$FILEDIR)[1];
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR.'header.php';
//读取PHP文件的源码:php://filter/read=convert.base64-encode/resource=ssrf.php
//内网请求:http://x.x.x.x/xx.index
if(isset($_GET['file']) && $_GET['file'] !=null){
$filename = $_GET['file'];
$str = file_get_contents($filename);
echo $str;
}
?>
<div class="main-content">
<div class="main-content-inner">
<div class="breadcrumbs ace-save-state" id="breadcrumbs">
<ul class="breadcrumb">
<li>
<i class="ace-icon fa fa-home home-icon"></i>
<a href="ssrf.php"></a>
</li>
<li class="active">概述</li>
</ul>
<a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
data-content="先了解一下file_get_contents()相关函数的用法吧">
点一下提示~
</a>
</div>
<div class="page-content">
<a href="ssrf_fgc.php?file=<?php echo 'http://127.0.0.1/'.$RD.'/vul/ssrf/ssrf_info/info2.php';?>">反正都读了,那就在来一首吧</a>
</div><!-- /.page-content -->
</div>
</div><!-- /.main-content -->
<?php
include_once $PIKA_ROOT_DIR . 'footer.php';
?>
跟上关类似,url变成了file

我们先看下file_get_content()的用法:PHP file_get_contents() 函数 | 菜鸟教程
file_get_contents() 把整个文件读入一个字符串中。
语法:file_get_contents(path,include_path,context,start,max_length)

1、file读取本地文件
修改file为:file=file:///D:/test.txt,查看文件的内容:
http://127.0.0.1/vul/ssrf/ssrf_fgc.php?file=file:///D:/phpstudy_pro/WWW/test1.txt
http://127.0.0.1/vul/ssrf/ssrf_fgc.php?file=file:///D:/phpstudy_pro/WWW/test1.txt

2、http协议请求内网资源
修改file为:file=http://127.0.0.1/vul/sqli/1.php,查看文件的内容:
在/WWW/pikachu/vul/sqli/目录下先写一个1.php
<?php
echo "SSRF(file_get_content) 测试!!!";
?>

访问:http://127.0.0.1/vul/ssrf/ssrf_fgc.php?file=http://127.0.0.1/vul/sqli/1.php

成功!
555

被折叠的 条评论
为什么被折叠?



