[TOC]
LFI
含义
文件包含漏洞主要是由四种函数造成的:
- include()
- require()
- include_once()
- require_once()
- 用这四类函数包含文件时,文件会被当做PHP代码来执行
include和require的区别:
- include是当代码执行到它所在行才开始包含文件,如果有错,仍继续执行下去
- require是当程序执行就立即包含文件,有错时会停止并发出警告
文件包含漏洞类型
- 本地文件包含(LFI)
- 远程文件包含(RFI)
当php.ini中,设置allow_url_include=On,allow_url_fopen=on.即可执行远程代码
判断方法
- 从URL判断
URL中path、dir、file、page、p、eng等等都可能存在文件包含漏洞http://www.example.com/?file=xxx.php
利用方法
1. 直接修改参数
<?php
if(isset($_GET['file'])
{
include '$_GET['file']';
}else{
include 'index.php';
}
?>
比如网站的url为:
http://www.example.com/?file=index.php
将index.php改为flag.php
http://www.example.com/?file=flag.php
即可输出flag.php的内容
也可将?file=index.php改为../xxx.php
http://www.example.com/?file=../xxx.php
即可返回上一级目录下的xxx.php文件的内容
- 既然这样,我们就可以使用./(当前目录)、../(上级目录)对整个目录进行遍历,也就可以获取敏感的文件
2. 利用PHP伪协议
- php://input
php://input可以读取没有处理过的==POST==数据。但当enctype=’multipart/form-data’的时候php://input是无效的。
- php://filter
用它在没有特殊情况下可以进行任意文件的读取。一般与base64编码合用,以base64编码的格式来把源代码显示出来。
poc: php://filter/read=convert.base64-encode/resource=xxx.php
南邮的ctf题目(文件包含)为例
nctf文件包含
- zip协议
关于zip协议:可配合文件上传漏洞打组合拳
利用方法:zip://test.jpg#dir/test.php
先新建一个test.php,里面写个phpinfo,然后压缩成.zip,然后把zip的名字改成test.jpg后把这个jpg文件上传上去 然后使用zip协议包含.
3. 包含系统的各种日志。
如apache日志,文件系统日志等。其中apache当记录格式为combined。再比如ngnix日志,默认路径为/var/log/ngnix/access.log
……
绕过
<?php
include $_GET['page'].".php";
?>
以上代码是防御LFI漏洞的其中一种方式
绕过方式也很简单
1. 00截断
(1) /etc/passwd%00,访问文件
(2) %00目录遍历
2. 使用长目录截断
/etc/passwd/././././././.[……]/./././././.
(php版本小于5.2.8(?)可以成功,linux需要文件名长于4096,windows需要长于256)
截断要考虑两个问题magic_quotes_gpc()和PHP版本(5.3.4以下)。