CTF日记
今天的题目是i春秋ctf中的:“百度杯”CTF比赛 2017 二月场 web 爆破-3
如图所示网页,可以看到是一道代码审计的题目:
<?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__);
?>
首先创建一个session,如果session的nums属性存在,则赋值:
$_SESSION[‘nums’] = 0;
$_SESSION[‘time’] = time();将时间戳赋值给time属性
$_SESSION[‘whoami’] = ‘ea’;
超过两分钟(120s)这个session会自动消除。
获取value的参数赋值给value变量;
str_rand是一个从a到z的数组,str_rands是有两个随机从str_rand的字符组成。
如果session的whoami属等于value参数的第一个元素和第二个元素,并且value的md5的值从第5个字符到第9个字符的值为0,那么session的nums属性+1,并且将str_rands的值赋给session的whoami属性;
如果session的nums>10,则输出flag。
输出flag的条件需要nums>10,现在nums=0,只有使nums+10,才可以输出flag,nums+1的条件有两个,一是whoami=value[0].value[1],二是md5的值等于0。
构造条件语句:?value=‘ea’,但是这样不符合第二个条件,考虑到md5
对数组的值为0,所以重新构造payload
?value[]=ea
会输出df,将输出的结果替换成ea,反复十次,就可以得到flag了。