文件包含之LFI学习


[TOC]

LFI

含义

文件包含漏洞主要是由四种函数造成的

  1. include()
  2. require()
  3. include_once()
  4. require_once()
  • 用这四类函数包含文件时,文件会被当做PHP代码来执行

include和require的区别:

  1. include是当代码执行到它所在行才开始包含文件,如果有错,仍继续执行下去
  2. require是当程序执行就立即包含文件,有错时会停止并发出警告

文件包含漏洞类型

  1. 本地文件包含(LFI)
  2. 远程文件包含(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是无效的。

image

  • 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

buuoj的一道ctf题

……


绕过

<?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以下)。


文章作者: Doublenine
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Doublenine !
 上一篇
PHP数组绕过 PHP数组绕过
PHP数组绕过绕过strops()函数1. strops()定义: strpos() 函数查找字符串在另一字符串中第一次出现的位置。 strpos() 函数对大小写敏感。 2. strops()语法: strpos(string,f
下一篇 
Brainfuck&Ook!加密 Brainfuck&Ook!加密
[TOC] Brainfuck/Ook!编码加密 Ook!加密语法规则OOK!只有三个不同的语法元素:Ook。OOK?OOK! 它们组合成两个组,各种组合组合指定命令。因此,节目必须包含偶数个“Ook”。换行符被忽略 命令OOK。OOK
  目录