• NCTF2018 Easy_Audit的writeup


    题目直接给出来代码

    这题考几个点:

    1.$_REQUEST的变量覆盖

    2.编码绕过

    3.PHP数组特性

    4.正则绕过

    5.file_get_contents函数

    首先一步步把题目分析一遍

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

     上述代码把$_GET,$_POST,$_COOKIE传进来的值进行了正则匹配,如果包含了A-Z和a-z的字母就返回waf

    这里的$_REQUEST有一个特性,就是当GET和POST都存在同一个变量名的时候,只获取POST中的值,所以可以通过这个特性来绕过正则的匹配

    当POST中也有个变量的时候,abc就会输出,否则就输出waf

    接着往下分析

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

    关于$_SERVER['QUERY_STRING']获取的值,就是get中变量名和内容

    详细资料可以参考https://blog.csdn.net/fjb2080/article/details/80548431

    这个绕过思路没什么好说的,URL编码就行

    下面的代码

    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..');
        }
    }

     if(!(substr($_GET['yulige'], 32) === md5($_GET['yulige'])))这里的绕过思路很简单,传进去是个数组的时候,值就为空,自然就相等了

    其实这里出题人沙雕了,本应该是出

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

    所以这个正则绕过也很简单只要nctf是以nctfisfun结尾,且不等于nctfisfun就行了,我这里用1nctfisfun绕过的

    最后就是file_get_contents函数了,从参数里面看就是直接传入一个远程的txt就行了,txt的内容为ccc_liubi

    官方给出的writeup是利用data://协议

    链接:http://www.php.net/manual/zh/wrappers.data.php

    最终就得到flag

  • 相关阅读:
    异步-promise、async、await
    node
    node基础 day1
    gulp的简介以及使用方法
    web前端安全——常见的web攻击方法
    Linux修改IP地址
    在linux下批量删除文件
    常用内容的正则表达式
    Oracle 数据库自带用户有哪些
    统计Oracle数据库当前User下各表的记录数
  • 原文地址:https://www.cnblogs.com/wh4am1/p/10043443.html
Copyright © 2020-2023  润新知