题目内容:这个真的是爆破。
error_reporting(0);// 关闭错误报告
session_start();//启动会话
require('./flag.php');
if(!isset($_SESSION['nums'])){//isset() — 检测变量是否设置。
$_SESSION['nums'] = 0;
$_SESSION['time'] = time();//返回当前时间的 Unix 时间戳
$_SESSION['whoami'] = 'ea';
}
if($_SESSION['time']+120<time()){
session_destroy();//session_destroy — 销毁一个会话中的全部数据
}//120s后会话结束
$value = $_REQUEST['value'];
$str_rand = range('a', 'z');//range创建一个包含从 "a" 到 "z" 之间的元素范围的数组
$str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)];//mt_rand() 使用 Mersenne Twister 算法返回0到25之间的随机整数。$str_rand[mt_rand(0,25)]返回"a" 到 "z"之间任意字母。$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){//substr(string,start,length)。===是包括变量值与类型完全相等。==只是比较两个数的值是否相等,由于substr是字符串,和数字比较的时候会强制转化成数字0,自然和0相等。
$_SESSION['nums']++;
$_SESSION['whoami'] = $str_rands;
echo $str_rands;
}
if($_SESSION['nums']>=10){//循环10次输出flag,暴力破解
echo $flag;
}
show_source(__FILE__);
?>
分值:10分
代码内容:先设置初始值nums=0,time是当前时间,whoami=ea。当whoami=value时,num+1,whoami=$str_rands,循环。nums>=10时,打印flag。120s后会话结束,由于时间120秒,完全可以手工做10次,即可得到flag。
方法:先设置数组value[]=ea
?value[]=ea
,得到两个字母,重新给value[]赋值,重复10次,得到flag
网友评论