Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SSRF 漏洞记录

SSRF 漏洞记录

作者头像
全栈程序员站长
发布于 2022-09-12 13:27:13
发布于 2022-09-12 13:27:13
82900
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

0x00:漏洞原理

SSRF(Server-Side Request Forgery)也属于应用层上的一个漏洞类型,用一个最简单的例子来理解这个漏洞:比如一个添加图文的功能,填入标题内容和封面图然后提交在网站前台显示,对于这个功能的图片它除了可以让你上传以外,还支持填入远程图片地址,如果你填入了远程的图片地址,则该网站会加载远程图过来进行显示,而如果程序写法不严谨或者过滤不严格,则加载图片地址的这个功能可能就可以包含进行一些恶意的脚本文件,或者你输入内网的 ip 或者一些系统的文件都会被解析执行,这个我们一般叫它 SSRF 即服务端请求伪造。

而一般我们是无法请求到系统上的文件的,内网的 ip 我们也是无法访问的,有了 SSRF 后,我们提交的加载连接是有服务器进行加载解析,实际上相当于我们以存在 SSRF 这个服务器为跳板进行的一些加载操作,我们在附一张图加深理解。

我们知道了 SSRF 的原理后,自然就能想到其危害点有哪些,比如说可以 1,加载外部的恶意木马文件执行,或者 2,加载内部的敏感文件程序自身的敏感文件,3,来访问内网进行内网端口的扫描、获取内网设备信息、枚举内网服务等。

0x01:漏洞危害

了解了漏洞的形成原因和原理后,我们通过简单的示例来进行一些危害的验证,这里我直接拿一个别人写的程序做下演示,或者也可以下载个 bwapp 练习也行,代码很简单,只有两个文件,一个是提交内容的 html 页面,另外一个是接受提交内容并加载的 php 文件,首先 html 文件内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
<head>
     <style> div.main { margin-left:auto; margin-right:auto; width:50%; } body { background-color:  #f5f5f0; }</style>
     <title>
        Awesome Script!
     </title>
</head>
<body>
    <div class="main">
    <h1>Welcome to the Awesome Script</h1>
    <p>Here you will be able to load any page you want. You won't have to worry about revealing your IP anymore! We use the cURL library in order to perform the HTTP requests. Have fun!</p>
    <br>
    <form method="GET" action="curl.php">
        <input type="text" value="Website to load..." name="path">
        <input type="submit" value="Submit">
    </form>
</div>
    </body>
</html>

文件很简单只有一个表单,把用户输入的内容传给了 curl.php 文件,curl.php 是通过 curl 来加载访问用户提交的目标地址,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
    $location=$_GET['path']; 
    $curl = curl_init();
    curl_setopt ($curl, CURLOPT_URL, $location); 
    curl_exec ($curl); 
    curl_close ($curl);
?>

这个 php 文件就是一个 curl 使用的经典过程,初始化,然后设置访问的地址,随后执行,最后关闭。我们运行这个程序,输入一个目标的 url 地址,执行后结果如下图。

通过这个简单的靶机示例,我们可以练习一下 SSRF,我这个 SSRF 靶机程序是在我本机直接运行的,本机访问本机肯定没问题,但大家把它当作 SSRF 就好,我也没开虚拟机,所以就本地演示吧,不要在意这些细节。

首先,我们可以看下这个 SSRF 怎么去扫描内网的开放端口,我们可以尝试输入 localhost 加端口号进行尝试,这里我们为了方便,拦截这个提交的请求,通过 burp 遍历下端口。

我这里只遍历了 100 个端口,可以看到 80 端口是开放的。除此之外,也可以用来读取系统上的文件,例如我 c 盘下的一个 ssrf.txt。

上面我们使用了 http、https、file 这些协议,而在 SSRF 利用这块利用协议也有很多,例如示例中的 CURL,则其支持的协议有 dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp 。我们再来看几个常见的,例如 dict 字典协议,这个协议可以获取到指定端口的一些信息。

上面都是常见的协议,这里顺带提一下的是 gopher,一个老协议,在 http 没有出现前,经常用它来发送数据包,对于 ssrf 来说,gopher 也会经常使用,可以使用 gopher 来攻击常见的应用,比如说 mysql,redis 等,我这里环境没有装这些应用,具体我也没有实践过,这里给大家推荐一个脚本 github 地址:https://github.com/tarunkant/Gopherus , 脚本可以生成利用连接,省去了我们很多事,从下图可以看见,它支持了我们常见的一些应用。

除此之外,也可以在 github 上搜索关键字 ssrf 来看一些大家常用的脚本和利用方式,另外也可以看一下猪猪侠的 SSRF 攻击 PPT 总结,也很详细很全面。

0x02:漏洞挖掘

漏洞挖掘的话,我从网上搜集来的方法总结了一下,我这里也没有全部碰到过,贴一张图供大家参考,图片来自于网络。

对于挖掘部分一个是功能上找再一个就是 url 上,总结下就是只要是涉及到的请求地址或功能,就可能存在 SSRF 问题。像翻译功能,很多翻译都有提供 url 地址翻译,输入 url 地址然后把整个网站页面翻译成想要的语言,但输入地址翻译时,后台会去请求这个地址,但又没有经过严格过滤,基本这样就回存在 SSRF 问题,国内比较有名的翻译之前都有存在,后来被提后都修复了,但你搜索在线翻译,结果多往后翻几页,基本都有此问题。

0x03:绕过方法

对于 SSRF 绕过方法也有很多,其基础是程序有一定的防御策略,比如说验证是否为内网 ip,如果是内网 ip 则阻止其内容的读取,而判断方式如果是纯粹的验证是否为 10 开头的 ip 这种的话,则会存在很多方式的绕过。

首先就是 @符,对于一个 url 的访问实际上是以 @符后为准的,比如说 xxxx.com@10.10.10.10,则实际上访问的是 10.10.10.10 这个地址。 第二个是网址后加 xip.io,其原理是例如 10.10.10.10.xip.io 会被解析成 10.10.10.10,详细介绍可以通过 xip.io 这个网站来查看。 第三个就是进制转换,将 ip 转换为八进制十进制十六进制这种,同样也可以正常访问,例如将 10.10.10.10 转换为十进制是 168430090,在浏览器访问 http ://168430090 就回去访问 10.10.10.10 这个地址,转换问题可以在线查看一般有很多网站提供,或者自己算也可以,这里为了方便,我写了一个 js 脚本,代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
<head>
    <title>IP转换进制</title>
    <script>
        function ip(){
            var ipvalue = document.getElementById("ipvalue").value;
            var arr = ipvalue.split(".");
            var decm = parseInt(arr[0])*256*256*256+parseInt(arr[1])*256*256+parseInt(arr[2])*256+parseInt(arr[3]);
            var hex = parseInt(decm).toString(16).toUpperCase();
            var binary = parseInt(decm).toString(2).toUpperCase();
            document.getElementById("result").innerHTML = '十六进制 = '+hex+'<br> 十进制 = '+decm+"<br> 二进制 = "+binary;
        }
    </script>
</head>
<body>
    <input type="text" name="ip" id="ipvalue" />
    <button type="button" onclick="ip()">转换</button>
    <div id="result"></div>
</body>
</html>

代码比较简单,输入 ip 后会对 ip 进行进制转换,然后进行输出,效果如下。

还有一个就是短网址绕过,这个在线转换有很多网站提供。

0x04:代码审计

对于代码审计其实没什么好说的,只要能读懂代码,基本这种漏洞一眼就可以看出来,对于网络资源请求且没有过滤的就可能存在 SSRF,我这里也找了几个例子,大体来说涉及到获取内容的函数都有可能存在,例如 file_get_contents,fsockopen,curl_exec 等,示例如下。

例一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$url = $_GET['url'];
echo file_get_contents($url);

例二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function GetFile($host,$port,$link) 
{ 
    $fp = fsockopen($host, intval($port), $errno, $errstr, 30); 
    if (!$fp) 
    { 
        echo "$errstr (error number $errno) \n"; 
    } 
    else 
    { 
        $out = "GET $link HTTP/1.1\r\n"; 
        $out .= "Host: $host\r\n"; 
        $out .= "Connection: Close\r\n\r\n"; 
        $out .= "\r\n"; 
        fwrite($fp, $out); 
        $contents=''; 
        while (!feof($fp)) 
        { 
            $contents.= fgets($fp, 1024); 
        } 
        fclose($fp); 
        return $contents; 
    } 
}

例三:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function curl($url){  
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    curl_close($ch);
}
$url = $_GET['url'];
curl($url); 

0x05:防御方法

对于防御方法,还是网上那一套,总结下就是三点,第一限制 http(s)协议,例如 curl 的设置 curl_setopt(ch,CURLOPTPROTOCOLS,CURLPROTOHTTP|CURLPROTOHTTPS)xip.io30xcurlcurlsetopt(ch, CURLOPT_FOLLOWLOCATION, 1); 这一项。第三就是设置白名单方式,只要不是我指定的地址,就不进行后续操作。

0x06:总结

SSRF 漏洞即使现在来说也并不少见,仍有很多网站和程序存在此问题,相对于跨站注入来说可能也有一部分容易忽略,而危害却很高,且只要涉及到请求资源的功能或地址或者 url 存在连接资源等关键字等,就有可能存在此问题,所以测试时应该和跨站注入并重去测,一样也是我们不容忽视的。


发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152800.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一篇文章深入学习SSRF漏洞
博客原文地址: https://hack-for.fun/posts/20200120/
IFONLY@CUIT
2020/02/19
2.9K0
SSRF漏洞原理、挖掘技巧及实战案例全汇总
SSRF(Server-Side Request Forgery:服务器端请求伪造)产生原因是服务端提供了从其他服务器应用获取数据的功能,比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。
Jayway
2019/09/29
5.9K0
SSRF漏洞原理、挖掘技巧及实战案例全汇总
了解SSRF漏洞,这一篇就足够了......
本号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如有侵权请联系小编处理。
网络安全自修室
2022/05/16
4.2K0
了解SSRF漏洞,这一篇就足够了......
SSRF漏洞总结
SSRF(Server-Side Request Forgery):指目标应用存在一种漏洞,利用该漏洞攻击者可以控制目标web应用的后端程序向任意ip地址/语言发送http请求或者其他数据包
全栈程序员站长
2022/09/12
1.6K0
SSRF漏洞总结
从一文中了解SSRF的各种绕过姿势及攻击思路
文章首发于跳跳糖社区https://tttang.com/archive/1648/
用户9691112
2023/05/18
5.2K0
从一文中了解SSRF的各种绕过姿势及攻击思路
Web安全之SSRF漏洞
背景 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
全栈程序员站长
2022/09/12
8940
Web安全之SSRF漏洞
SSRF安全指北
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成,由服务端发起请求的一个安全漏洞。SSRF是笔者比较喜欢的一个漏洞,因为它见证了攻防两端的对抗过程。本篇文章详细介绍了SSRF的原理,在不同语言中的危害及利用方式,常见的绕过手段,新的攻击手法以及修复方案。
腾讯安全应急响应中心
2021/01/26
1.7K0
SSRF安全指北
SSRF 服务端请求伪造攻击,程序员必掌握
SSRF,Server-Side Request Forgery,服务端请求伪造,是一种由攻击者构造形成由服务器端发起请求的一个漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。
后端技术探索
2019/04/25
1.2K0
ssrf漏洞
利用条件 (1)web服务器存在SSRF漏洞; (2)web服务器有访问本地或远程服务器的权限; 存在位置 一般是web服务器提供了从其他服务器获取数据的功能。 (1)通过URL分享网页内容 (2)在线翻译 (3)通过url对图片的加载和下载 (4)转码服务 利用实验,开启方法
h3110_w0r1d
2024/02/19
4110
ssrf漏洞
SSRF原理实战及修复方式
SSRF定义 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
Gcow安全团队
2020/03/19
2.4K0
SSRF原理实战及修复方式
米斯特白帽培训讲义(v2)漏洞篇 SSRF
很多 Web 应用都提供了从其他服务器上获取数据的功能。使用用户指定的 URL,web 应用可以获取图片,下载文件,读取文件内容等。这个功能如果被恶意使用,可以利用存在缺陷的 Web 应用作为代理,攻击远程和本地服务器。这种形式的攻击成为服务器请求伪造(SSRF)。
ApacheCN_飞龙
2019/02/15
7410
米斯特白帽培训讲义(v2)漏洞篇 SSRF
SSRF漏洞详解 一文了解SSRF漏洞
服务器端请求伪造(Server-Side Request Forgery, SSRF)
全栈程序员站长
2022/09/13
1.8K0
SSRF漏洞详解 一文了解SSRF漏洞
SSRF 漏洞学习实验环境推荐及过程记录
在网上找到一个学习 SSRF 的环境,SSRF-LABS 有一个好看又简洁的界面,提供了最基本的 REST API 和客户端 WebHook 功能用于 SSRF 测试。前面只是大概的介绍,知道就好,不用花费过多精力了解。
信安之路
2019/05/28
3.7K0
关于SSRF的总结
SSRF是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。利用一个可以发起网络请求的服务,当做跳板来攻击其他服务。这里简单总结一下ssrf,并来刷一些CTFshow上的题,还准备找一些案例。推荐一下ctfshow这个平台 可以对某个知识点有针对性的刷题题目质量也是很高的。
用户2700375
2022/06/09
9450
关于SSRF的总结
SSRF漏洞原理解析[通俗易懂]
SSRF全称:Server-Side Request Forgery,即,服务器端请求伪造。是一个由攻击者构造请求,在目标服务端执行的一个安全漏洞。攻击者可以利用该漏洞使服务器端向攻击者构造的任意域发出请求,目标通常是从外网无法访问的内部系统。简单来说就是利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网进行攻击。
全栈程序员站长
2022/09/12
9.7K0
SSRF漏洞原理解析[通俗易懂]
SSRF漏洞讲解
平常在做渗透测试工作的过程中哪些地方容易产生SSRF漏洞,可以看到大部分相关资料都会显示,容易产生SSRF的地方在社交分享、图片加载、邮件系统、数据库等。为什么这些地方会出现呢,社交分享可能会分享到其他网址对吧,如果我们替换其网址为我们的本地地址呢,会出现什么样得情况?同一个地址更换不同的端口又会有什么不同,加载图片请求的服务器可能和你所访问的网站不是同一个服务器,这样是不是能探测内网的同一局域网段的情况呢,邮件系统也是同一道理,这些都是探测SSRF漏洞的手段。
全栈程序员站长
2022/09/13
1K0
SSRF漏洞讲解
PHP的libcurl中存在的一些问题
PHP的libcurl中存在的一些问题 看了近来的几场ctf题目,学习了一些关于php libcurl的一些知识,在这里总结一下。 0x1发送POST请求时造成任意文件读取 PHP manual上对C
安恒网络空间安全讲武堂
2018/02/06
1.1K0
PHP的libcurl中存在的一些问题
Black Hat USA 2020议题:SSRF漏洞利用新思路
2020年BlackHat大会上,Joshua Maddux介绍了一种针对SSRF的新颖利用思路,得到了广泛的关注。此类攻击是通过构造一个HTTPS Server,使TLS session中携带攻击载荷,攻击行为触发主要通过一个受限的SSRF漏洞(甚至一个钓鱼网页),结合TLS协议和DNS协议的特性,把攻击报文发到受害者内网的TCP服务中,达到SSRF漏洞攻击面扩大的效果。本文将针对此攻击进行较深入介绍和演示,供大家学习参考。
FB客服
2021/05/20
1.1K0
Black Hat USA 2020议题:SSRF漏洞利用新思路
SSRF学习
服务器端请求伪造(Server-side Request Forgery,SSRF)是攻击者滥用服务器功能访问或操作自己无法被直接访问的信息的方式之一。服务器端请求伪造攻击将域中的不安全服务器作为代理使用,这与利用网页客户端的跨站请求伪造攻击类似(如处在域中的浏览器可作为攻击者的代理)。
Mirror王宇阳
2020/11/12
6550
SSRF漏洞简单分析
SSRF(服务器端请求伪造)是一种由攻击者构造请求,服务器端发起请求的安全漏洞,所以,一般情况下,SSRF攻击的目标是外网无法访问的内部系统。
雪痕@
2020/09/27
6330
SSRF漏洞简单分析
相关推荐
一篇文章深入学习SSRF漏洞
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验