风险
通过php的特性函数利用url动态包含文件,因为没有对文件来源进行严格审查,导致任意文件读取或者任意命令执行。
前提: allow_url_fopen=on(是否允许将URL作为文件处理,默认为on) allow_url_include=off(是否允许include/require打开URL作为文件处理 默认为off)
low
查看源码:发现对page这个参数没有做任何过滤 这里尝试做php的操作:
- 构造url,显示报错的同时显示服务器的根目录的绝对路径
- 构造url尝试访问服务器的根目录,返回网站的配置文件
尝试执行远程文件
- 在远程服务器192.168.60.2上传一个phpinfo.txt文件
- 构造以下url,成功在服务器上执行了phpinfo()函数。
总结:说明了文件包含不仅仅显示内容还会执行文件。
mediu
查看源码:使用str_place()函数对 == http:// https:// …/ …\ == 进行了替换为空的筛选, str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。 进行双写绕过替换
page=hthttp://tp://192.168.60.2/phpinfo.txt
high
查看代码使用了fnmatch()函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应文件 **fnmatch()**函数 根据指定的模式来匹配文件名或字符串
- 构造url,成功读取了服务器的配置文件
修复
- 在功能设计上尽量不要将文件包含函数对应的文件放给前端进行选择和操作
- 建议使用白名单,仅允许包含运行指定的文件,其他的都禁止
- 可通过调用str_replace()函数实现相关敏感字符的过滤,一定程度上防御了远程文
- 配置php.ini文件
allow_url fopen = off Allow_url include = off
目录遍历与文件包含的区别
目录遍历是可以读取web目录以外的其他目录,根源在于对路径访问权限设置不严格,针对本系统。 文件包含是利用函数来包含web目录以外的文件,分为本地包含和远程包含。
|