PHP代码审计-目录穿越及文件包含漏洞

举报
亿人安全 发表于 2023/05/29 17:18:39 2023/05/29
【摘要】 目录穿越及文件包含漏洞文件操作漏洞目录穿越目录穿越(Directory Traversal)攻击是黑客能够在Web应用程序所在的根目录以外的文件夹上,任意地存取被限制的文件夹、执行命令或查找数据。目录穿越攻击,也有人称为Path Traversal攻击。目录穿越:漏洞危害:攻击者可以使用目录穿越攻击来查找、执行或存取Web应用程序所在的根目录以外的文件夹。如果目录穿越攻击成功,黑客就可以执行...

目录穿越及文件包含漏洞

文件操作漏洞


目录穿越

目录穿越(Directory Traversal)攻击是黑客能够在Web应用程序所

在的根目录以外的文件夹上,任意地存取被限制的文件夹、执行命令

或查找数据。目录穿越攻击,也有人称为Path Traversal攻击。

目录穿越:

漏洞危害:

攻击者可以使用目录穿越攻击来查找、执行或存取Web应用程序所

在的根目录以外的文件夹。如果目录穿越攻击成功,黑客就可以执行

破坏性的命令来攻击网站

目录穿越-代码实例

如果应用程序使用用户可控制的数据,以危险的方式访问位于应用服务器或

其它后端文件系统的文件或目录,就会出现路径遍历。

目录穿越-绕过方式

进行URL编码

点–>%2e 反斜杠–>%2f 正斜杠–>%5c

进行16为Unicode编码

点–>%u002e 反斜杠–>%u2215 正斜杠–>%u2216

进行双倍URL编码

点–>%252e 反斜杠–>%u252f 正斜杠–>%u255c

进行超长UTF-8 Unicode编码

点–>%c0%2e %e0$40%ae %c0ae

反斜杠–>%c0af %e0%80af %c0%af

正斜杠–>%c0%5c %c0%80%5c

目录穿越-修复方案

• 在URL内不要使用文件名称作为参数

• 检查使用者输入的文件名是否有“..”的目录阶层字符

• 在php.ini文件中设置open_basedir来指定文件的目录

• 使用realpath函数来展开文件路径中的“./”、 “../”等字符,然

后返回绝对路径名称

• 使用basename函数来返回不包含路径的文件名称

文件包含

文件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用

户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,

从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的

代码注入。当被包含的文件在服务器本地时,就形成的本地文件包含

漏洞,被包涵的文件在第三方服务是,就形成了远程文件包含漏洞。

文件包含-漏洞危害

• 执行恶意代码

• 包含恶意文件控制网站

• 甚至控制网站服务器等

本地包含

本地文件包含(Local File Include,LFI),LFI允许攻击者通过浏览器包含本机

上的文件。当一个WEB应用程序在没有正确过滤输入数据的情况下,就有可能存在

这个漏洞,该漏洞允许攻击者操纵输入数据、注入路径遍历字符、包含web服务器

的其他文件。

远程包含

远程文件包含(Remote File Include,RFI), RFI允许攻击者包含远程文件,

远程文件包含需要设置allow_url_include = On,四个文件都支持HTTP、FTP等协

议,相对本地文件包含更容易利用,出现的频率没有本地包含多

文件包含-挖掘经验

• 模块加载、cache调用,传入的参数拼接包含路径

.include()

使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。

• inclue_once()

功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。

• require()

使用此函数,只要程序执行,立即调用此函数包含文件,发生错误时,会输出错误信息并

立即终止程序。

• require_once()

功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次

文件包含-代码案例

Include()、include_once()、require()、require_once()

本地包含-利用方式

• %00截断

• 记录错误日志文件

需要解密base64

利用环境:php<5.3 magic_quotes_gpc取消的

可以使用遍历目录实现效果

远程包含-利用方式

包含文件时会加入默认后缀 比如包含1.jpg会解析成1.jpg.php

• %00截断

• 路径长度截断

(linux-4096,windows-256)(不受GPC限制),5.3以后被修复

?name=../../../../../../../../../www/1.php/././././././.[…]/./././././././././

点号截断

只在window下可用

?name=../../../../../../../../../boot.ini/………[…]…………

• ? 伪截断,不受GPC和PHP版本限制(<5.2.8)

• php://输入输出流

php://filter/read=convert.base64-encode/resource=1.txt 以base64编码截断

文件包含-修复方案

关闭远程包含参数开关,彻底切断这个业务相比较。

设置类似白名单的方法,筛选固定文件名

常见目录穿越字符进行过滤,如(./ ../ ..\等)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。