文件包含漏洞实例

     咱们来学习一下文件包含漏洞的实例,这里就以一个简单的实例为主,其它功能有兴趣的朋友,能够深刻学习php


当你的才华web

还撑不起你的野心时正则表达式

那你就应该静下心来学习shell


目录浏览器

DVWA 文件包含实例安全

Low服务器

mediumxss

high函数

绕过high 演示学习

靶场训练平台


DVWA 文件包含实例

     文件包含提及来也是属于注入的一种,都是因为服务器配置或者对用户输入过滤不严格致使用户能够恶意数据达到本身想要的目的。
    PHP中的文件包含分为本地包含与远程包含,致使文件包含的函数以下:
         • include()
         • include_once()
         • require()
         • require_once()
         • file_open()
          
     是一种代码处理方式,当一个代码文件想要引用另一个代码文件,就要用到包含,常见的包含函数有include、require等,参数是文件名。可是若是文件包含的参数用户可控且过滤不严,就容易存在文件包含漏洞

Low

 

 

首先登陆DVWA靶场,默认帐号:admin,密码:password

线上DVWA靶场:http://43.247.91.228:81

一、先去设置安全等级为Low

 

二、咱们来查看一下File Inclusion(文件包含等级为Low的源码),进入File Inclusion 而后点击 View Source 按钮,弹窗展现PHP源码

<?php 

    $file = $_GET['page']; //The page we wish to display  

?>

能够看到等级为low的没有对文件类型进行过滤,因此咱们能够随意上传文件,不论是可执行文件,仍是不可执行文件,一律来者不惧,先编写一个简单的PHP脚本,脚本以下:

<?php
     phpinfo();
?>

注:上面这3行脚本的意思是显示PHP的当前信息,其中包括PHP扩展和编译版本,服务器信息和环境,PHP环境中,路径,主机和本地配置选项,HTTP头,PHP许可等等(详细信息可参考PHP手册)。要获得这些信息,不只能够从浏览器中查看,还可使用命令行在服务器上查看

上传php文件

文件上传后获得上传后的相对路径,在真实环境中,这个路径必需要想办法弄到,不管是猜解仍是什么的。因为此实例是本地测试,我就直接看下路径,而后进行包含

报错:

咱们使用相对路径根目录里面的php.ini文件,就要跳转到上两级目录 ../../

 

攻击——本地文件读取

读取D:\phpStudy\www\dvwa\php.ini 内容

include( "D:\phpStudy\www\dvwa\php.ini " )

include( "D:\phpStudy\www\dvwa\vulnerabilities\fi\../../php.ini" )

 

注:咱们上传的文件格式是JPEG,但使用jpeg的格式也能执行成功,这就说明不论文件什么格式,被包含进了php中,都会以php的方式来解析

 

    也可进行远程包含php文件的,并且非php的文件,只要里面包含了php格式的代码均可以正常执行。通过进一步尝试远程的phpinfo.php文件也能够执行,但二者的区别是.txt显示的是DVWA的域名,而.php文件显示的是本地127.0.0.1。咱们要清楚远程的执行不是在攻击者的web服务器上执行,而是在受害者web服务器上执行命令,因此phpinfo.txt才是正经,例如使用:https://url/?page=http://localhost/phpinfo.txt

攻击思路

攻击者(A要攻B)——> 攻击者上传WebShell到A服务器(获得A的URL)——>寻找B的文件包含漏洞节点——>执行文件包含WebShell(成功得到B的WebShell 权限)

 

medium

 

 关键字参数:str_replace 就是一个替换做用,将什么什么替换为何什么

<?php 

    $file = $_GET['page']; // The page we wish to display  

    // Bad input validation 
    $file = str_replace("http://", "", $file); 
    $file = str_replace("https://", "", $file);         


?>

上述代码,能够看出对上传进行一些过滤,咱们先试了一下Low 等级的文件包含,发现好像不行咯,瞬间被打回原型

咋们再试试,看看能不能经过远程文件包含绕过

注:固然远程文件包含有一个大前提那就是开启了allow_url_include

结果能够看获得,仍是报错:

报错信息,告诉咱们“http://被替换为空了”,http被替换了,那么咱们换一种绕过方式,使用大小写绕过或者是hthttptp(双写绕过)

试一下大小写绕过:

http://localhost/dvwa/vulnerabilities/fi/?page=Http://127.0.0.1/phpinfo.php

试一下双写绕过:

http://localhost/dvwa/vulnerabilities/fi/?page=hthttptp://127.0.0.1/phpinfo.php

也可使用..\ 绕过,为何呢?通过测试观察报错信息,发现输入../报错信息里面不出现,说明这个等级过滤了../,但咱们可使用..\ 绕过

http://localhost/dvwa/vulnerabilities/fi/?page=..\..\phpinfo.php

执行结果,成功绕过:

 

 

high

<?php 
         
    $file = $_GET['page']; //The page we wish to display  

    // Only allow include.php 
    if ( $file != "include.php" ) { 
        echo "ERROR: File not found!"; 
        exit; 
    } 
         
?>

 

以上是线上靶场的,但我看有些旧点版本好像high 的源码有些不太同样,多了fnmatch 模块:

<?php 

// The page we wish to display 
$file = $_GET[ 'page' ]; 

// Input validation 
if( !fnmatch( "file*", $file ) && $file != "include.php" ) { 
    // This isn't the page we want! 
    echo "ERROR: File not found!"; 
    exit; 
} 
?>

 

fnmatch 模块提供用于Unix shell风格的通配符,这是支持同样的正则表达式(这是中记录re模块)。shell式通配符中使用的特殊字符是:

模式

含义

*

匹配一切

?

匹配任何单个字符

seq

匹配seq中的任何字符

!seq

匹配不在seq中的任何字符

对于文字匹配,将元字符括在括号中。例如,'[?]'匹配字符'?'

请注意,文件名分隔符('/'在Unix上)对于这个模块并不特别。请参阅模块glob以获取路径名称扩展(glob用于fnmatch()匹配路径名段)。一样,以句点开头的文件名对于这个模块并非特别的,而且*?模式匹配。

纠错

fnmatch.fnmatch(filename, pattern)

测试文件名字符串是否匹配模式字符串,返回TrueFalse。若是操做系统不区分大小写,那么在执行比较以前,这两个参数将被标准化为全部较低或较大的状况。fnmatchcase()可用于执行区分大小写的比较,而无论操做系统是否为标准。

这个例子将打印当前目录中全部扩展名为的文件名.txt

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print file

fnmatch.fnmatchcase(filename, pattern)

测试文件名是否匹配模式,返回TrueFalse; 比较区分大小写。

fnmatch.filter(names, pattern)

返回匹配模式名称列表的子集。这是相同的,但更高效地实施。[n for n in names if fnmatch(n, pattern)]

2.2版本中的新功能

fnmatch.translate(pattern)

将shell样式模式转换为正则表达式以供使用re.match()

例:

>>> import fnmatch, re
>>>
>>> regex = fnmatch.translate('*.txt')
>>> regex
'.*\\.txt\\Z(?ms)'
>>> reobj = re.compile(regex)
>>> reobj.match('foobar.txt')
<_sre.SRE_Match object at 0x...>

另请参阅

  Module Glob Unix shell风格的路径扩展

fnmatch 模块参考连接:https://cloud.tencent.com/developer/section/1367736

 

上诉代码,若是匹配成功则返回true,不然返回false
因此包含的文件命中须要以file开头,或者file就为include.php,因此这里咱们就能够经过file协议来包含本地文件来进行绕过(file协议只支持本地文件,远程的不支持),因此须要将远程的文件上传到服务器上,咱们结合文件上传漏洞,而后进行本地文件执行

方式:利用file 协议:在file://后面加上物理路径便可,成功查看php.ini里面的内容

绕过high 演示:

再试试读取phpinfo.php 

攻击思路:

攻击者——>上传恶意代码文件——>获取文件绝对路径——>执行上传的恶意代码——>受害者Web服务器

 

靶场训练平台:

     • i 春秋

     • xss.tv

     • bugku.com

     • 西普

     • 实验吧  (免费居多)

     • 墨者学院 (对小白比较友好,大部分课程都挺便宜的)

     • 合天智汇(主要几率就是实操,动手作实验,肌肉记忆)

     • 实验室(这个是比较综合,但也有部分信息安全的线上实验室,收费,固然也有免费的)

     • XCTF (免费的线上攻防题,相似CTF,有兴趣的能够打下试试)


我不须要自由,只想背着她的梦

一步步向前走,她给的永远不重