漏洞分析
程序开发人员通常会把可重复使用的函数写入到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写,这种调用文件的过程称为包含。相同代码重复出现在不同文件中出现代码冗余,所以出现了文件包含函数,就是让代码更为高效,需要用到的部分会去调用,且被包含的文件会被当作php代码执行(文件里面的东西是必须当作代码执行,文件包含,只要包含了,不管任何后缀,都会当作php代码执行)。
有时候用于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就会导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。
文件包含分类
- 本地文件包含,包含服务器上的资源。
- 远程文件包含,通过http协议包含其他地方的资源。
可能存在漏洞的页面url:
https://xxx/index.php?page=downloads.php
https://xxx/index.php?page=main.php
这种页面最后等于某个文件的有可能包含文件包含漏洞。
漏洞测试
http://xxx/index.php?page=C:\Windows\system.ini //打开c盘windows中system文件
http://xxx/index.php?page=/etc/password
文件包含函数
require(),找不到被包含的文件时会产生致命错误,并停止脚本运行。
include(),找不到被包含的文件时只会产生警告,脚本将继续运行。
include__once()与include()类似,唯一区别是如果该文件中的代码已经被包含则不会再次包含。
require__once()与require()类似,唯一区别是如果该文件中的代码已经被包含则不会再次包含
../:返回父目录