-
-
[原创]正确使用snprintf导致的权限绕过
-
发表于:
2017-12-12 14:20
8770
-
从事二进制漏洞的研究人员几乎都接触过strcpy和sprintf导致的缓冲区溢出漏洞,而在漏洞的修复建议中,都建议进行边界检查,同时使用strncpy和snprintf。snprintf的正确用法如下:
snprintf(dst,sizeof(dst),"%s",src);
在正确使用strncpy和snprintf的前提下,肯定是没有问题的,不过笔者也见过如下使用snprintf的开发人员:
snprintf(dst, strlen(src), "%s", src);
当然,这种完全属于使用不当的低级错误不值得讨论。笔者在研究路由器固件的过程中,意外的发现了一个漏洞,是在正确使用snprintf的情况下,由于代码整体的逻辑不够严谨,从而导致了权限绕过。在这里展示出来与大家分享一下这个有趣的漏洞。
近几年,各种路由器漏洞层出不穷,除了常见的是命令注入和缓冲区溢出漏洞,还有一类路由器漏洞就是权限绕过。一般的权限绕过分如下几种:
(1) 厂商留有隐藏的调试或者维护接口;
(2) 通过漏洞能够获取用户名+密码;
(3) 通过特殊构造的数据包可以无需用户名和密码实现任意请求。
在网上搜索一下,以上三种情况都有不少的案例,本文讨论的漏洞为第(3)种情况。为了能更好的理解,这里先简单介绍下路由器web方面的权限控制。
通常来看,大多数路由器的权限设定将htm/asp/php等页面需要登录才能访问,而css/js/png等资源是无需登录即可访问的。之后的逻辑通过sprintf函数将uri格式化到”/www/%s”或者”/web/%s”来生成路径,之后再访问对应的资源生成response。简单的示意图(省略了无关逻辑)如下:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!