文件操作漏洞是web领域最经典的一类漏洞了,结合其他的漏洞比如SQL注入,往往会有意想不到的效果。因其具有任意代码执行的能力,是使一般漏洞到严重漏洞,比如严重的信息泄漏,甚至getshell的最佳路径之一。
成因:
通过引入文件时用户可控,没有严格的检验,或是被绕过操作一些敏感文件,导致文件泄露和恶意代码注入。当包含的文件在本地服务器时,形成本地文件包含;当包含的文件在第三方服务器时,就形成远程文件包含。
举例:
成因:
应用程序功能操作文件,限制不严时导致访问web以外的文件。可以近似看作本地文件包含的一种,因为两者的利用向量,验证方式几乎完全一样。值得注意的是路径遍历和目录浏览是有区别的。
举例:
常见危害:
严重的信息泄漏,篡改服务器中的文件导致命令执行,删除服务器中文件(如配置文件、脚本文件)导致服务器宕机。
成因:
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过脚本文件获得了服务器端命令的能力。
举例:
常见危害:
导致任意代码执行,上传的文件是病毒或木马文件诱骗其他用户下载执行;上传域控策略文件如crossdomain.xml;上传钓鱼图片用于钓鱼和欺诈;上传的文件名为XSS payload,对文件名进行显示时造成存储型XSS。
上面三种文件操作的漏洞可造成的一个共性威胁是可导致任意代码执行。
1. 使用以下类型的payload进行检测。这些payload可以进行各种编码尝试绕过应用程序的删除和净化遍历序列的功能。
2. 重点关注可根据用户提交的输入读取和写入文件的功能。
3. 先尝试在基础目录中使用遍历序列。如果成功,接着尝试其他序列回溯到基础目录,并访问服务器操作系统中的已知文件。
4. 应用程序可能会检查被请求的文件扩展名。只允许访问某种特定类型的文件,尝试使用空字节或换行符进行攻击。当然新版php5中这两种方式已经无法实现了,asp、jsp或者老版本php都应该尝试。
5. 应用程序可能会检查用户提交的文件路径是否以一个特定的词根(目录)开头。尝试将遍历序列附加到web app可以接受的词根后面,避开过滤。
例如:
1. 如果测试中受到目标应用程序的基础架构提出的HTTP连接,一般可以肯定应用程序存在远程文件包含漏洞。
2. 如果存在远程文件包含,在自己的主机上放一段脚本,测试远程包含的脚本(注入类似的命令)是否被执行。
3. 检查对比测试的时延,确定响应反常时延的原因。
4. 看到类似这种特征,需要重点关注。
1. 客户端绕过:抓包修改确认的code值。
2. 服务器端绕过:抓包修改content-type值,文件中加一些正常的字符进行混淆,比如image66h<?php phpinfo();?>,或者基于后缀名的检测绕过。
3. 利用结合文件包含漏洞:比如如果只检查asp、jsp、php中的内容,则可以先传一个包含恶意脚本的txt文件,然后在php文件中将其包含进来,如
<?php Include(“上传的txt文件路径”);?>
4. 尝试服务器解析漏洞。
5. 使用大文件尝试绕过WAF:但要注意因为content length的原因,想使用大文件绕过服务器验证的可行性几乎没有了。
消除文件包含漏洞的思路和目录遍历漏洞相同:
1. 避免由外界指定文件名。
2. 避免文件名中包含目录。
3. 限制文件名仅包含字母和数字。
4. 当然避免向任何文件系统API传送用户提交的数据是防止路径遍历最有效的方式。
add:能检测到的直接pass,就不要去做替换,即使是递归替换也不是一个靠谱的方法。
1. 文件上传目录不可执行。
2. 严格限制文件类型和大小。
3. 使用随机数(hash化)改写文件名、文件路径。
其中dirTraversal.txt在利用时,需要将{FILE}这个向量替换为本地资源的绝对URI,然后使用。比如你的本地资源名为local_file,则使用
sed -i 's/{FILE}/loacl_file/g' dirTraversal.txt 替换。
本文作者:滴滴SRC
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/58237.html