dvwa-file-inclusion
有些 web 应用程序允许用户指定直接文件流的输入,或允许用户将文件上载到服务器。稍后 web 应用程序访问 web 应用程序上下文中用户提供的输入。通过这样种操作,web 应用程序允许恶意文件执行。
如果选择要包含的文件是目标计算机上的本地文件,则称为“本地文件包含(LFI)”。但是文件也可能包含在其他机器上,这样的攻击就是“远程文件包含(RFI)”。
请求页面

http请求
页面有三个文件按钮,这里以file1.php为例吧
1 | |
#响应页面
页面显示了 用户名 和 IP address
low
源码
page 参数没有任何过滤,然后直接被 include 包含进来,造成文件包含漏洞的产生。
1 | |
攻击思路
- 本地文件包含(绝对路径或者相对路径,注意不同平台的/和\)
page=/etc/passwdpage=../../hackable/flags/fi.php
- 远程文件包含
page=http://www.baidu.com/robots.txt - 其他伪协议:
php://data://file://
攻击结果
medium
源码
源码如下,代码增加了 str_replace 函数对 page 参数进行了过滤。
将 “http://”、“https://”替换为空阻止远程包含漏洞,将“../”、“..\” 替换为空阻止用相对路径访问文件。
1 | |
攻击思路
- 嵌套双写
page=hhttps://ttps://www.baidu.com/robots.txtpage=..././..././hackable/flags/fi.php
- 绝对路径仍然没有过滤
page=/etc/passwd
high
源码
开发者已经受够了,他们决定只允许使用某些文件。但是由于存在多个具有相同基名的文件,因此它们使用通配符将它们全部包括在内。
1 | |
攻击思路
代码里面要求 page 参数的开头必须是 file,但是实在太巧合了,我们依然可以利用 file 伪协议读取到文件内容。
page=file:///etc/passwd
impossible
学习了学习了!瞧黑板!
源码
直接白名单了相当于,就这几个文件可以包含。
1 | |
总结
为了更好地使用代码的重用性,可以使用文件包含函数将文件包含进来,直接使用文件中的代码来提高重用性。但是这也产生了文件包含漏洞,产生原因是在通过 PHP 的函数引入文件时,为了灵活包含文件会将被包含文件设置为变量,通过动态变量来引入需要包含的文件。此时用户可以对变量的值可控,而服务器端未对变量值进行合理地校验或者校验被绕过,就会导致文件包含漏洞。常用的文件包含函数有 include()、include_once()、require()、require_once()。
包含漏洞分为本地包含和原创包含 2 类,当包含的文件在服务器本地时,就形成了本地文件包含。文件包含可以包含任意文件,被包含的文件可以不是 PHP 代码,可以是文本或图片等。只要文件被包含就会被服务器脚本语言执行,如果包含的文件内容不符合 php 语法,会直接将文件内容输出。例如下面这段简易的代码:
1 | |
当包含的文件在远程服务器上时,就形成了远程文件包含。所包含远程服务器的文件后缀不能与目标服务器语言相同,远程文件包含需要在 php.ini 中设置:
1 | |