ctf show web入门68,69

ctf show web入门68,69 打开靶场映入眼帘就是一段报错这里告诉我们highlight_file()函数被禁用了所以接下来我们查看文件需要换一个函数但是我们首先要知道参数名称打开hackbaar打开postmethod输入?cdie(“success”);按下回车访问如果页面原本的报错消失了并只显示了 success字样说明后端使用的是 eval($_GET[‘c’]); 执行你的代码。如果页面没有任何变化或依然报错请依次替换尝试参数?cmddie(success);、?fileindex.php或?url。通常这类题目常见的参数名有?c ?cmd ?file ?url 等等我们测试出参数为c接下来使用var_dump(scandir(‘.’));来扫描当前目录下有哪些文件发现有个flag.php文件我们尝试查看该文件内容但是很多函数都被禁用了我们尝试构造payload为cinclude($_POST[‘x’]);xphp://filter/convert.base64-encode/resourceflag.php发现输出内容被编码了我们解码后查看一下他说这次不在这里所以我们返回根目录查看文件flag应该就在flag.txt文件中我们修改一下payloadcinclude($_POST[‘x’]);xphp://filter/convert.base64-encode/resource/flag.txt我们进行解码查看得到flagctfshow{ba519551-cac4-4e17-84ba-f83199af7f37}第一部分为什么用 cinclude($_POST[‘x’]);x…解耦与绕过如果直接写 cinclude(‘flag.php’);后端的关键词黑名单检测设备WAF一眼就能看到 include 和 flag 这两个敏感词从而直接拦截你的请求。为了躲避检测安全研究员通常会采用“套娃传参”参数解耦的技巧cinclude($_POST[‘x’]);你通过 GET 方式告诉 PHP 核心“去执行 include 吧但包含的具体文件名我先不告诉你它藏在 POST 请求的 x 变量里。”WAF防火墙的视角WAF 只检查了 GET 参数 c看到里面是一个安全的、日常开发常用的动态包含语句没有包含任何具体的敏感文件名如 flag于是放行。x…由于真正的恶意攻击载荷Payload挪到了 POST 数据的 x 参数中成功绕过了仅针对 GET 参数进行严格过滤的常规拦截规则。第二部分为什么 php://filter/… 可以读取文件核心原理这是利用了 PHP 自带的 伪协议Wrapper 机制。正常 include(‘flag.php’) 的致命问题在 PHP 中include 函数的设计初衷是“执行”代码而不是“读取”文本。如果你直接 include(‘flag.php’);PHP 引擎会欢快地跑去执行 flag.php 内部的代码。执行完后代码里定义的 $flag “xxx”; 只是安静地留在了服务器内存里没有任何 echo 或 print 语句把它打印到屏幕上。所以你在浏览器上看到的只会是一片空白。php://filter 改变了数据流向为了强行把文件的“源代码”抠出来我们需要在 PHP 引擎执行这个文件之前拦截并改变它的数据流。php://filter 是 PHP 专门提供的一个数据流过滤器接口。它允许你在打开、读取一个文件时在中间架设一个“加工管道”。我们可以把 php://filter/readconvert.base64-encode/resourceflag.php 拆开来看php://filter开启过滤器管道。read…告诉 PHP我要对读取进来的数据流进行加工。convert.base64-encode这是关键的加工过滤器。它命令管道“把流经这里的文本全部原地转换为 Base64 编码”resourceflag.php指定这条管道源头连接的目标文件是 flag.php。最终的化学反应当整条命令执行时数据流经历了以下神奇的步骤include 伸手去抽 flag.php 的内容。flag.php 里的源码 ?php $flagctfshow{...}; ? 开始流向 include。在流经中途时被 convert.base64-encode 拦截源码瞬间被死死地编码成了 PD9waHAgJGZsYWc9…。带有 ?php 标签的源码变成了纯文本的 Base64 字符串流入了 include。最关键的一步由于此时的数据已经不再是标准的 PHP 代码没有 ?php 标签了全是 Base64 乱码include 函数无法将其当作 PHP 脚本执行于是只能死板地把这一串纯文本密文直接打印回显在了网页屏幕上69把var_dump()函数禁用了我们可以换成var_export()函数拿到flag为ctfshow{b354e8bb-7b37-4b0d-a234-44753380f432}