SSRF原理及bwapp小案例

原理

ssrf(Server-Side Request Forgery:服务器端请求伪造)是通过由攻击者构造由服务端发送请求的漏洞。

漏洞危害
内网开放服务扫描
获取banner信息
进行指纹识别
利用file、dict、gopher读取本地文件

造成漏洞的流程
我们有外网服务器a,内网服务器b
用户访问a -> 发送请求 -> a接受请求(并没有过滤)-> 响应请求

因没有进行读取过滤,造成漏洞的函数
1.file_get_contents: 函数把整个文件读入一个字符串中。
语法:file_get_contents(path,include_path,context,start,max_length)
path 必需。规定要读取的文件。

例子

<?php
echo file_get_contents("test.txt");
?>
输出:
This is a test file with test text.

2.curl_exec:

<?php
$ch = curl_init();			//初始化curl,提供一个句柄,供curl_setopt,curl_exec,curl_close使用。如果想要多个句柄,使用curl_multi_exec。
curl_setopt($ch, CURLOPT_URL, $_GET["url"]);  //CURLOPT_URL 	需要获取的URL地址,也可以在curl_init()函数中设置
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);					//运行当前在这里插入代码片 cURL 句柄的子连接。
curl_close($ch);							//关闭一组cURL句柄。
?>

curl_setopt 为给定的cURL会话句柄设置一个选项。

3.fopen(): 打开一个文件或 URL
如果 fopen() 失败,它将返回 FALSE 并附带错误信息。您可以通过在函数名前面添加一个 ‘@’ 来隐藏错误输出。

例子

 <?php
$file = fopen("test.txt","r");
$file = fopen("/home/test/test.txt","r");
$file = fopen("/home/test/test.gif","wb");
$file = fopen("http://www.example.com/","r");
$file = fopen("ftp://user:password@example.com/test.txt","w");
?>

**fsockopen :**打开一个网络连接或者一个Unix套接字连接

readfile(): readfile() 函数读取一个文件,并写入到输出缓冲。

bwapp ssrf

在这里插入图片描述可以看到我们这里有3个实验
1.文件包含进行端口扫描
2.xxe获取敏感内容

文件包含进行端口扫描
我们先来看一看端口扫描的源代码

<?php

/*

bWAPP, or a buggy web application, is a free and open source deliberately insecure web application.
It helps security enthusiasts, developers and students to discover and to prevent web vulnerabilities.
bWAPP covers all major known web vulnerabilities, including all risks from the OWASP Top 10 project!
It is for educational purposes only.

Enjoy!

Malik Mesellem
Twitter: @MME_IT

© 2013 MME BVBA. All rights reserved.

*/

echo "<script>alert(\"U 4r3 0wn3d by MME!!!\");</script>";

if(isset($_REQUEST["ip"]))			//判断有没有ip
{
    
    //list of port numbers to scan
    $ports = array(21, 22, 23, 25, 53, 80, 110, 1433, 3306);   //创建数组
    
    $results = array();				//结果存放位置
    
    foreach($ports as $port)     //循环赋值,$ports依次赋值给$port(foreanch只适用于数组)
    {

        if($pf = @fsockopen($_REQUEST["ip"], $port, $err, $err_string, 1))	//fsockopen — 打开一个网络连接或者一个Unix套接字连接  函数表达(连接主机,端口号,错误信息显示,连接时限(每秒))
        {

            $results[$port] = true;  //返回结果
            fclose($pf);			//关闭$pf
            
        }
        
        else
        {

            $results[$port] = false;        

        }

    }
 
    foreach($results as $port=>$val)   	//
    {

        $prot = getservbyport($port,"tcp");		//使用tcp,端口服务的存活判断
        echo "Port $port ($prot): ";

        if($val)				//如果$val存在 显示ok,else Inaccessible
        {

            echo "<span style=\"color:green\">OK</span><br/>";

        }

        else
        {

            echo "<span style=\"color:red\">Inaccessible</span><br/>";

        }

    }

}
?>

在上面的案例中我们使用的是fsockopen()函数。我们在实际情况中还可能遇到
file_get_contents,curl_exec(),fopen(),fsockopen(),readfile()。

我们进入文件包含漏洞在这里插入图片描述

我们更换语言之后,都是language=lang_nl.php,或者是其他php文件。很明显是一个文件包含漏洞,包含了$language
我们试一下远程执行文件。
在这里插入图片描述可以看到我们已经提取了这个文件,但是没有进行端口扫描。
这里的原因是我们要把需要扫描的主机添加在url上,才会进行ip识别,再进行端口扫描。

在这里插入图片描述
可以看到我们成功扫描了192.168.86.8主机的端口服务情况。

着这个案例中,我们自己的主机并不能直接访问需要扫描的主机,利用了远程文件包含漏洞进行了内网端口扫描。

pikaqiu靶场

在这里插入图片描述一般有ssrf漏洞的地方我们先把伪协议都试一遍。
file: 在有回显的情况下,利用 file 协议可以读取任意内容
dict:泄露安装软件版本信息,查看端口,操作内网redis服务等
gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
http/s:探测内网主机存活

http协议
在这里插入图片描述

dict协议
在这里插入图片描述
file协议
在这里插入图片描述利用file协议读取任意文件。

参考文章

SSRF漏洞的利用与攻击内网应用实战

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值