SSRF绕过域名白名单的一种方式——CVE-2024-24806(影响大量nodejs服务)

挖SRC也有一段时间了,除了逻辑漏洞就是XSS,感觉没啥提升的样子(叠甲:没有瞧不起逻辑漏洞的意思,我挖得最多的就是逻辑!!),所以最近空闲时间去看了看历史的CVE报告,学习一下大佬们的思路的技巧,前段时间看到一个很有意思的漏洞,分享一下。

CVE-2024-24806

这个漏洞的发现也挺有意思的,根据原作者的描述,他是在打一个CTF比赛的时候发现的这个漏洞,它影响nodejs v10之后的所有版本(目前在v20.11.1版本已经修复),主要是nodejs依赖的的一个异步IO库libuv导致的。

图片

这个漏洞可以通过构造特定的payload来绕过服务器的域名白名单检测来访问内网API接口。

漏洞原理

getaddrinfo

先简单介绍一点前置知识,DNS大家应该都比较了解,我们拿到一个域名后,会通过DNS服务器将它解析为IP然后进行访问。在Linux上有一个方法:getaddrinfo就是用于域名和IP之间的转换,如果果传入的是域名,则会返回域名映射的IP,如果输入的是一个主机可达的IP,那么则会返回这个IP。

实际上返回的是socket结构,上面简单描述为IP。

有了上面的基础知识,那就可以进一步来看这个漏洞了。 libuv库里面有一个方法是uv_getaddrinfo_t,它在调用getaddrinfo之前,会先进行一个操作:判断输入的域名是否大于256个byte,如果大于256,则会截断它,然后再去调用getaddrinfo方法。

而nodejs的域名解析方法dns.lookup方法则刚好用到了这个库。

利用方式

以nodejs为例,基于不同的系统版本和运行环境,在截断之后,不同的系统会有不同的表现:

  1. 如果是Kail Linux的某一个版本,它在截断之后,会自动使用\0进行补全,这时候被截断的字符串就是一个完整的字符串,合法的域名或IP。

  2. 如果是其它的版本,它在截断之后,会随机增加一个byte(0-256),然后再补上一个\0,再进行调用。

  • 虽然最后一位是随机的,但是我们也可以通过爆破来遍历网段。

  • \0在C语言中用于标记字符串结尾,在读取到\0时,则认为这个字符串结束了。

举个栗子

比如我们现在有一个SSRF的入口: demo.com?url=xxxx.com。但是对于url后面的链接,服务端设置了白名单域名,只允许访问demo.com的域名,其它都会被拦截

此时我们知道有一个内网接口,不允许被外部访问:

127.0.0.1:8080/sensitive

正常来说我们是无法访问到的,因为配置了白名单,所以

demo.com?url=127.0.0.1:8080/sensitive

这种请求方式肯定会被拦截掉。

这时候我们构建一个payload:

0x0000000...7f000001.demo.com:8080/sensitive

7f000001127.0.0.1的16进制,在前面使用0补全,让它刚好是256个字符。

此时nodejs服务器在拿到

0x0000000...7f000001.demo.com:8080

这个域名时:

  1. 判断demo.com是属于白名单内的域名,绕过了检测

  2. 进行域名解析,超出256byte的部分被截断,拿到的是0x0000000...7f000001去解析

  3. 解析出来的IP则变成了 127.0.0.1

  4. 发起网络调用:127.0.0.1:8080/sensitive

至此,一个强白名单域名校验被绕过了!

最后

我只能说大佬们的代码审计能力是真的强,打个比赛随随便便就找个0day,仰望膜拜中。

这里给出原大佬的漏洞报告和payload:https://github.com/libuv/libuv/security/advisories/GHSA-f74f-cvh7-c6q6


欢迎关注我的公众号“混入安全圈的程序猿”,更多原创技术文章第一时间推送

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值