网络安全从入门到精通(第九章-3) 本地包含与远程包含
本文内容:
- 什么是文件包含漏洞
- 函数解析
- 文件包含漏洞挖掘技巧
- 文件包含防御策略
1,什么是文件包含漏洞?
1.文件包含漏洞:
攻击者利用包含的特性,加上应用本身对文件[包含]控制不严格,最终造成攻击者进行任意文件包含。
文件包含并不属于漏洞,但是由于对包含进来的文件不可控,导致了文件包含漏洞的产生。
2.本地/远程文件包含:
包含文件很有用,可以简化代码,文件包含分为本地和远程文件包含。
本地文件包含LFI:包含服务器上的资源。
远程文件包含RFI:通过HTTP协议包含其它地方的资源,[需要在phpini改配置,allow_url_include = On)默认是关闭的,需要开启,配置文件修改后需要重启]
文件包含,被包含的文件无论后缀是什么,都会被当脚本文件来解析。
如:
file_put_contents('文件名','daima')函数,把一个字符串写入文件中,名字特殊一下。
file_put_contents('1010.php','<?php eval(@$_REQUEST['a']);?>')
target=sql.php%253f/../../../../../phpStudy/MySQL/data/b/b.frm&a=file_put_contents('853.php','<?php @eavl($_REQUEST['a'])?>');
2,函数解析:
include&require最大的区别是前者错误,php文件继续执行下去,而后者不再执行。
include:使用include引用外部文件时,只有代码执行到include代码段时,调用的外部文件才会引用并读取。当引用文件发生错误时,系统给出个警告错误,整个php文件继续执行。
require:在php文件执行之前,php解析器会被引用的文件全部内容替换require语句,然后require语句之外的其它语句,组成个新的php文件,最后按新的php文件执行程序代码。
include_once:会在导入文件前先检测该文件是否在该页面的其它部分引用,如果有则不会重复引用该文件,程序只能引用一次。
要导入的文件中存在一些自定义函数,那么如果在同一个程序中重复导入这个文件,在第二次导入时便会发生错误,因为php不允许相同名称的函数被重复声明
require_once语句是require语句的眼神,它的功能与require语句基本一致,不同的使用,在应用require_once时,先会检查要引用的文件是不是已经将在该程序中其它地方被引用过,如果有,则不会重复调用该文件。
同时使用require_once语句在同一页面中引用两个不同的文件,那么在输出的时候,只有第一文件被执行,第二引用文件则不会执行。
::调动类的方法,可以看作函数。
3,文件包含漏洞挖掘技巧:
因为文件包含主要是对包含的函数,处理不当造成的,可以针对性的对这些函数进行点名:
如:
1.include()
2.include_once()
3.require()
4.require_once()
4,文件包含防御策略:
1.无需要情况设置allow_url_include和allow_url_fopen为关闭。
2.对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录。
3.建议假定所有输入都是可疑的,尝试对所有输入提交可能包含的文件地址,包括服务器本地文件及远程文件,进行严格的审查,参数中不允许出现../之类的目录跳转符。
4.严格检查include类的文件包含函数中的参数是否外界可控。