文末抽奖|Yakit靶场通关教程 SSRF参数多情况测试(二)
2023-12-1 16:25:21 Author: mp.weixin.qq.com(查看原文) 阅读量:6 收藏

前言

不知不觉Yakit靶场通关教程已经出到第6期了,牛牛感谢师傅们的一直陪伴,也期望听到更多反馈意见。在本次文章末尾会有靶场意见箱,师傅们可以提出关于靶场和教程的任何意见,我们将会从意见箱中抽取两位幸运师傅获得牛牛玩偶一个~

回归正题打开本周任务卡,上周SSRF教学讲到了重定向简单案例,攻击者通过构造特定的URL,将目标网站的请求重定向到攻击者指定的URL从而实现重定向攻击。那重定向攻击可否还有更多变种呢?如果我想控制攻击时间间隔又如何实现呢?在接下来的教学里,师傅们可以获得答案。

案例分享及教学

完全开放重定向(JS location.href)

完全开放重定向漏洞是一种存在于应用程序中的安全漏洞,攻击者可以利用该漏洞通过构造恶意的URL来将用户重定向到恶意网站或内容。在这种情况下,重定向是通过JavaScript的location.href属性实现的,使页面在一定时间后自动进行重定向。

示例代码:

以下是一个示例漏洞代码,展示了一个使用location.href进行重定向的漏洞:

{    DefaultQuery: "redUrl=/redirect/main",    Path:         "/redirect/js/basic",    Title:        "完全开放重定向(JS location.href)",    Handler: func(writer http.ResponseWriter, request *http.Request) {        var u = LoadFromGetParams(request, "redUrl")        DefaultRender(`            <h2>Open Redirect With JS</h2>            <a href=` + strconv.Quote(u) + `>Click ME JUMP NOW (3s)</a>            <script>                setTimeout(function() {                    window.location.href = ` + strconv.Quote(u) + `;                }, 3000);</script>        `, writer, request)    },    RiskDetected: true,
}

攻击示例:

攻击者可以构造一个恶意链接,其中包含恶意的重定向URL:

http://127.0.0.1:8787/ssrf/redirect/js/basic?redUrl=http://127.0.0.1:8787/ssrf/flag

防御措施:

  • 白名单验证:维护一个合法URL的白名单,只允许重定向到已知的受信任URL。

  • 避免直接执行用户输入的JavaScript:尽量避免直接执行用户输入的JavaScript代码,特别是在重定向过程中。

  • 避免用户提供重定向URL:如果可能的话,避免直接使用用户提供的URL进行重定向,而是使用内部的标识符,然后在后端进行转换。

  • 安全编码实践:开发人员应遵循安全编码实践,确保在使用JavaScript时对用户输入进行适当的验证和编码。

靶场演示:视频

完全开放重定向(JS location.replace)

在这个特定的案例中,漏洞利用了 JavaScript 中的 location.replace 方法,将用户重定向到指定的 URL。

示例代码:

{    DefaultQuery: "redirect_to=/redirect/main",    Path:         "/redirect/js/basic1",    Title:        "完全开放重定向(JS location.replace)",    Handler: func(writer http.ResponseWriter, request *http.Request) {        var u = LoadFromGetParams(request, "redirect_to")        DefaultRender(`    <h2>Open Redirect With JS</h2>    <a href=`+strconv.Quote(u)+`>Click ME JUMP NOW (3s)</a>    <script>        setTimeout(function() {        window.location.replace(`+strconv.Quote(u)+`);        }, 3000)</script>    `, writer, request)    },    RiskDetected: true,
}

攻击示例:

攻击者可以构造一个恶意的 URL,将用户重定向到指定的恶意站点

http://127.0.0.1:8787/ssrf/redirect/js/basic1?redirect_to=http://127.0.0.1:8787/ssrf/flag

当用户点击这个链接时,浏览器会执行 JavaScript,使用 location.replace 将用户直接重定向到恶意站点,从而可能导致用户受到欺骗或遭受攻击。

防御措施:

  • 限制重定向次数:为重定向设置一个合理的最大次数限制,超过该次数则停止重定向并返回错误。

  • 避免完全开放重定向:避免使用完全开放的重定向,将重定向链接限制为特定的目标,或者使用相对路径进行重定向。

  • 对用户输入进行严格验证和过滤:对用户提供的输入进行严格的验证和过滤,确保没有恶意的重定向链接被注入到请求中。

靶场演示:视频

完全开放重定向(JS location.assign)

完全开放重定向是一种安全漏洞,它允许攻击者通过构造恶意链接将用户重定向到任意URL。在本例中,我们将介绍使用JavaScript的location.assign方法来实现完全开放重定向。

示例代码:

location.assign是JavaScript的一个方法,用于将浏览器的当前位置重定向到新的URL。它类似于用户在浏览器地址栏中输入一个URL并按下回车键。这个方法将导致浏览器加载新的URL并显示其内容。

{    DefaultQuery: "redirect=/redirect/main",    Path:         "/redirect/js/basic2",    Title:        "完全开放重定向(JS location.assign)",    Handler: func(writer http.ResponseWriter, request *http.Request) {        var u = LoadFromGetParams(request, "redirect")        DefaultRender(`        <h2>Open Redirect With JS</h2>        <a href=`+strconv.Quote(u)+`>Click ME JUMP NOW (3s)</a>        <script>            setTimeout(function() {                window.location.assign(`+strconv.Quote(u)+`);            }, 3000)</script>        `, writer, request)    },    RiskDetected: true,
}

攻击示例:

http://127.0.0.1:8787/ssrf/redirect/js/basic2?redirect=http://127.0.0.1:8787/ssrf/flag

当用户点击这个链接时,页面将显示一个倒计时3秒的链接“Click ME JUMP NOW (3s)”。在倒计时结束后,JavaScript将调用window.location.assign,并将用户重定向到恶意站点http://127.0.0.1:8787/ssrf/flag

防御措施:

  • 验证和过滤目标URL:在重定向操作中,始终对用户提供的目标URL进行严格验证,只允许合法的、事先认证过的URL进行重定向。

  • 白名单验证:维护一个允许重定向的目标URL白名单,只允许重定向到可信的URL。

  • 避免直接使用用户输入:尽量避免直接使用来自用户的输入作为重定向的目标,这可能会被恶意构造。

靶场演示:视频

完全开放重定向(meta 延迟跳转)

通过在HTML文档中插入<meta>标签的http-equiv属性,可以控制浏览器在一定时间后自动重定向到新的URL。这类似于用户访问一个网页后,该网页会在一段时间后自动跳转到其他页面。

示例代码:

通过在HTML文档中插入<meta>标签的http-equiv属性,可以控制浏览器在一定时间后自动重定向到新的URL。这类似于用户访问一个网页后,该网页会在一段时间后自动跳转到其他页面。

{    DefaultQuery: "redirect=/redirect/main",    Path:         "/redirect/meta/case1",    Title:        "完全开放重定向(meta 延迟跳转)",    Handler: func(writer http.ResponseWriter, request *http.Request) {        var u = LoadFromGetParams(request, "redirect")        DefaultRenderEx(true, `<!DOCTYPE html>        <html>            <head>                <title>Meta(5s) Refresh Example</title>                <meta http-equiv="refresh" content="5;url={{ .url }}">            </head>        </html>        `, writer, request, map[string]any{            "url": strings.Trim(strconv.Quote(u), `"`),        })    },    RiskDetected: true,
}

攻击示例:

http://127.0.0.1:8787/ssrf/redirect/meta/case1?redirect=http://127.0.0.1:8787/ssrf/flag

当用户点击这个链接时,页面将显示一个带有<meta>标签的HTML文档,其中设置了5秒的延迟,然后将自动跳转到恶意站点http://127.0.0.0:8787/ssrf/flag

防御措施:

  • 验证和过滤目标URL:在重定向操作中,始终对用户提供的目标URL进行严格验证,只允许合法的、事先认证过的URL进行重定向。

  • 白名单验证:维护一个允许重定向的目标URL白名单,只允许重定向到可信的URL。

  • 避免直接使用用户输入:尽量避免直接使用来自用户的输入作为重定向的目标,这可能会被恶意构造。

靶场演示:视频

完全开放重定向(meta)

完全开放重定向是一种Web应用程序中的安全漏洞,攻击者可以利用它将用户重定向到任意URL,该漏洞通常出现在未正确验证或过滤用户提供的重定向目标的情况下。

示例代码:

以下是一个使用HTML的meta标签实现完全开放重定向的示例代码:

{    DefaultQuery: "redirect=/redirect/main",    Path:         "/redirect/meta/case2",    Title:        "完全开放重定向(meta)",    Handler: func(writer http.ResponseWriter, request *http.Request) {        var u = LoadFromGetParams(request, "redirect")        DefaultRenderEx(true, `<!DOCTYPE html><html> <head>   <title>Meta Refresh Example</title>   <meta http-equiv="refresh" content="0;url={{ .url }}"> </head></html>`, writer, request, map[string]any{            "url": strings.Trim(strconv.Quote(u), `"`),        })    },    RiskDetected: true,
}

攻击示例:

攻击者可以构造一个恶意链接,将重定向目标设置为一个恶意网站或钓鱼网站,诱使用户点击链接。例如,攻击者可以构造以下链接并发送给用户:

http://127.0.0.1:8787/ssrf/redirect/meta/case2?redirect=http://127.0.0.1:8787/ssrf/flag

防御措施:

  • 避免用户控制:尽量避免将用户提供的数据直接用于重定向目标。如果必须使用用户输入,应该进行严格的输入验证和过滤。

  • 使用相对路径:尽量使用相对路径而不是绝对URL来执行重定向。

  • 避免客户端重定向:尽量避免使用客户端重定向方式(如JS的location属性、meta标签的http-equiv属性等),而是在服务端进行重定向。

安全的重定向(只重定向path)

安全的重定向是一种避免完全开放重定向漏洞的安全方法,它仅允许重定向目标为同一站点内的路径,而不是完整的URL。通过只重定向路径而不是整个URL,可以有效减少跳转到恶意网站或其他不受信任站点的风险。

示例代码:

{    DefaultQuery: "redirect=/redirect/main",    Path:         "/redirect/safe",    Title:        "安全的重定向(只重定向path)",    Handler: func(writer http.ResponseWriter, request *http.Request) {        var u = LoadFromGetParams(request, "redirect")        DefaultRenderEx(true, `<!DOCTYPE html><html> <head>   <title>Safe Redirect Example</title>   <meta http-equiv="refresh" content="0;url={{ .url }}"> </head></html>`, writer, request, map[string]any{            "url": strings.Trim(getPath(u), `"`),        })    },    RiskDetected: true,}
func getPath(u string) string { urlInfo, err := url.Parse(u) if err != nil { return "" } return urlInfo.Path}

总之,安全的重定向方法是一种有效的防御措施,可以减少完全开放重定向漏洞带来的风险。通过只重定向到同一站点内的路径,可以增加应用程序的安全性。

小结

SSRF漏洞是一种常见的安全威胁,为了有效地防范SSRF漏洞的攻击,牛牛将案例里的防御措施总结成5条:

1

输入验证和过滤

对于从用户输入中获取的URL或其他数据,进行有效的验证和过滤是至关重要的。验证输入的URL是否符合预期的格式并过滤掉不必要的特殊字符,确保输入的URL不会包含敏感的或不被信任的内容。

2

白名单限制

白名单限制指的是仅允许特定的可信任域名或IP地址访问,并拒绝对其他未经授权的资源的访问。这种方式可以有效防止攻击者访问非授权的资源。

3

限制端口访问

限制服务端可以访问的端口范围,尤其是限制内部服务器可以访问的外部端口,可以有效降低攻击者利用SSRF进行端口扫描或其他恶意活动的可能性。

4

安全配置

对服务端和相关组件进行安全配置,包括确保服务器不会使用或暴露不必要的服务,限制服务器对外部资源的访问权限,以及通过安全设置和策略来最小化潜在的攻击面。

5

更新补丁

及时更新和安装软件和操作系统的补丁是非常重要的。这可以确保已知的漏洞得到修复,减少攻击者利用已知漏洞的机会。

虽然这些措施是有效的,牛牛也需要提醒各位师傅,SSRF防御不是一劳永逸的。最佳的安全做法是综合运用多种安全措施,并持续对系统进行监控、审计和更新,以保障应用程序的安全性。

长按下方二维码进入靶场意见箱,参与抽奖活动

END

更新日志 

Yaklang 1.2.9

1. 全新的 Payload 后端接口

2. 全新的插件商店接口

3. 全新的代码补全接口

4. 修复 arp 表缓存的 BUG

5. 修复了网站树查询的一些不恰当行为

6. 修复了 History 查询的一些不恰当行为

7. 优化模糊测试模块中 base64 判断逻辑

8. 新增了无损回显命令注入检测插件

9. 新增了php文件包含测试插件

10. 修复了fuzztag中动态标签的BUG

11. 修复调试功能的后端发包逻辑,新增若干单元测试

12. 优化镜像流量去重策略

13. 优化浏览器爬虫逻辑

14. 新增 {{regen:one()}} 标签和 {{crlf}} 标签

15. 优化了插件审计逻辑

16. 优化MITM锁的问题

Yakit  1.2.8

1. 插件商店上线全新UI

2. 优化History网站树,增加定位功能

3. MITM下游代理增加配置用户名密码

  YAK官方资源 

Yak 语言官方教程:
https://yaklang.com/docs/intro/
Yakit 视频教程:
https://space.bilibili.com/437503777
Github下载地址:
https://github.com/yaklang/yakit
Yakit官网下载地址:
https://yaklang.com/
Yakit安装文档:
https://yaklang.com/products/download_and_install
Yakit使用文档:
https://yaklang.com/products/intro/
常见问题速查:
https://yaklang.com/products/FAQ

长按识别添加工作人员
开启Yakit进阶之旅


文章来源: https://mp.weixin.qq.com/s?__biz=Mzk0MTM4NzIxMQ==&mid=2247517020&idx=1&sn=6f612e2572fb11c94c6a2e03acb343c6&chksm=c2d1fff8f5a676ee083106afedcba2c2a4cabb6cbc7c8e5af7f544b07ae6ce168b16bec63deb&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh