D-Link850和D-Link645都存在远程敏感信息读取漏洞
查看了文章中对于漏洞的分析
文章分析了getcfg.php
位于/htdocs/web目录下
至于为什么对这个文件那么感兴趣,查略了一下cgi的意思,通用网关接口
就是运行在服务端的一个程序,能将从用户那里接受的数据进行处理,相当于web服务中的apache
存在漏洞的原因:

dophp
函数具体的定义我也没找到,但是从这里猜测出应该是加载$file
的意思
而$file
是由$GETCFG_SVC
变量拼接的,继续往上看会发现这个变量的来源就是$_POST['SERVICES']
也就是将用户通过post传来的servies的值直接拼接过来,这样就会导致任意文件读取。
还有一个关键点就是要绕过is_power_user()
函数的判断
is_power_user()
函数如下:

原文中提到$_GLOBALS
变量并不是php中的那个$_GLOBALS
数组,而是在cgibin
文件中定义,这个很疑惑,原文中也没有仔细说
接下来分析cgibin
这个文件,由于是MIPS而不是x86,所以IDA无法直接反编译,有两种解决办法,一是安装一个retdec-idaplugin
插件,但是没有安装成功,后来又去找了jeb
这个工具去反编译,但是也不是所有的函数都能反编译
如下是main函数反编译的结果

原文说关键在于phpcgi_main
这个函数

但是我没有办法反编译成功
这里直接参考原文中的代码
可以看到这个函数是针对不同的请求方式做出不同的响应,典型的cgi文件的工作方式

猜测sobj_add_string
函数是拼接字符串
同时sobj_add_char
是拼接一个字符
10就是'\n'对应的ascii码
于是据此构造出payload
curl -d "SERVICES=DEVICE.ACCOUNT&attack=ture%0aAUTHORIZED_GROUP=1" "http://VictimIp:8080/getcfg.php"
SERVICES的值为我们想要读取的文件,这里我们选择DEVICE.ACCOUNT.xml.php
文件
同时我们要让AUTHORIZED_GROUP为1
这里不理解为什么要添加一个attack
参数
DIR-645的漏洞成因是类似的,
在虚拟机中测试了一下DIR-645,结果如下:

网友评论