固件下载
我们可以在官网上下载1.1.0.114和1.1.0.86版本的固件
漏洞位置
根据提示,通过在路径中插入一个null字节,用户可以跳过大多数身份验证检查。%00为空字符串,我们在漏洞修复后的文件里查询对%00的判断,找到了mini_httpd文件,对mini_httpd进行分析,发现存在%00字符串,那么漏洞应该就在mini_httpd中
测试
这里固件用FirmAE不能直接模拟出来,我们直接用fofa搜索R6200,访问url/currentsetting.htm查看当前版本信息
分析
起初,我们在浏览器中随机访问了一些html界面,发现有些界面是可以不经登录就可以访问的,如:currentsetting.htm、update_setting.htm、debuginfo.htm等,然后我们用IDA分析时,查找字符串,然后发现这些界面都存在于下图.data一段空间里
我们xrefs一下,发现在函数中引用
分析下图,程序j指令跳到一个循环
循环的作用主要是检测uri中是否有不需要检测登录的htm
上图中,当发现目标字符串时,将$v6置1,在下图中就会根据$v6的值决定是否需要验证身份
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,我们在固件版本为114的网页路径中添加%00字节试试看
我们发现页面报了400错误,并且显示了null字节,这说明在mini_httpd中出现了对%00字符串的过滤
在114版本固件中查找程序中的%00字节(这里使用100版本的固件,效果一样)
我们发现在114的版本中是有%00的空字节的,我们用ida打开逆向分析一下可以发现修补后的程序是对uri进行了过滤,如果检测扫%00就直接错误处理
下图是错误分支的处理
以上分析就是对100版本的分析,程序会检测uri中是否含有不需要登陆验证的界面,还会检测程序中是否有%00,若有,则抛出错误界面
现在我们去86版本中查找%00字节
并没有这个“%00”,就说明没有过滤%00,没有对uri进行空字符串进行过滤。
攻击
根据上面的分析,我们可以构造url/index.htm%00currentsetting.htm, 在解析uri时,遇到%00产生截断,所以请求的是index.htm页面,后面currentsetting.htm无需验证登录,因此在请求index.htm时不需要验证登录