NCTF2018_easy_audit->coding_breaks
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
随机推荐
- 干货 | Python进阶系列之学习笔记(四)
目录 Python条件判断 Python循环语句 Python循环控制 迭代器与生成器 异常 一.Python 条件判断 如果某些条件满足,才能做某件事情:条件不满足时,则不能做,这就是所谓的判断. ...
- 新手必备 | 史上最全的PyTorch学习资源汇总
目录: PyTorch学习教程.手册 PyTorch视频教程 PyTorch项目资源 - NLP&PyTorch实战 - CV&PyTorch实战 PyTorch论 ...
- 带权并查集 HDU - 3047
题意: 一圈座位有n个,给出m组序号之间的关系,比如,1 2 150 代表2号坐在1号位置序号+150,看m组数据有多少组冲突的. 思路: 带权并查集模板. #include<stdio.h&g ...
- RMQ(倍增法求ST)
解决什么问题:区间查询最值 倍增思想:每次得出结果的范围呈2的幂次增长,有人说相当于二分,目前我觉得相当于线段树的查找. 具体理解看代码: /*倍增法求ST*/ #include<math.h& ...
- Mysql性能优化:为什么你的count(*)这么慢?
导读 在开发中一定会用到统计一张表的行数,比如一个交易系统,老板会让你每天生成一个报表,这些统计信息少不了 sql 中的count函数. 但是随着记录越来越多,查询的速度会越来越慢,为什么会这样呢?M ...
- 洛谷 P2656 采蘑菇 树形DP+缩点+坑点
题目链接 https://www.luogu.com.cn/problem/P2656 分析 这其实是个一眼题(bushi 发现如果没有那个恢复系数,缩个点就完了,有恢复系数呢?你发现这个恢复系数其实 ...
- 读者来信 | 设置HBase TTL必须先disable表吗?(已解决)
今日有朋友加好友与我探讨一些问题,我觉得这些问题倒挺有价值的:于是就想在本公众号开设一个问答专栏,方便技术交流与分享,专栏名就定为:<读者来信>.如遇到本人能力有限难以解决的问题,该贴将会 ...
- D3属性大全
https://www.cnblogs.com/bester-ace/articles/10948793.html https://www.cnblogs.com/qingmingsang/artic ...
- 力软敏捷框架 jfGrid 使用例子之一
百度了下关于力软敏捷框架 jfGrid的教程,基本没有,出来的全是jqGrid.好吧看来只能自己上手了 今天来讲讲列设置属性里数据格式化事件(formatter)的使用 常规的使用方式如上图所示. 先 ...
- 《Java基础复习》—常识与入门
突然发现自己Java基础的底子不到位,复习! 所记知识会发布在CSDN与博客网站jirath.cn <Java基础复习>-常识与入门 一.Java语言的知识体系图 分为三部分 编程语言核心 ...