阅读本文前建议先阅读本站中的另一篇文章:[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(".").即构造".",这里给出我们的思考过程:

  1. 利用localeconv()函数得到"." localeconv()函数返回的是包含本地数字及货币格式信息的数组,这个数组的第一个元素就是".",利用current(localeconv())就可以得到".",但是帅气的Leon师傅把我们的local直接给禁了,这个思路不通.
  2. "."可以用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了,于是这个方法还是不通.
  3. 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]禁止套娃)的更多相关文章

  1. [GXYCTF2019]禁止套娃 1 &无参数RCE

    [GXYCTF2019]禁止套娃 1 啥都没有那只能上扫描器来一探究竟了. 扫完没有啥结果,但网上找了一下说是git泄露,但是我这里显示了403. <?php include "fla ...

  2. [BJDCTF 2nd]old-hack && [GXYCTF2019]禁止套娃

    [BJDCTF 2nd]old-hack 页面很有意思 同时也告诉了我们是THINKPHP5,我们只需要寻找THINKPHP5的漏洞就可以了. https://www.codercto.com/a/5 ...

  3. [GXYCTF2019]禁止套娃(无参RCE)

    [GXYCTF2019]禁止套娃 1.扫描目录 扫描之后发现git泄漏 使用githack读取泄漏文件 <?php include "flag.php"; echo &quo ...

  4. [GXYCTF2019]禁止套娃

    0x00 知识点 无参数RCE eval($_GET['exp']); 参考链接: https://skysec.top/2019/03/29/PHP-Parametric-Function-RCE/ ...

  5. 刷题[GXYCTF2019]禁止套娃

    梳理思路 打开网站,发现很简单,只有flag在哪里的字样. 查看源码,常用后台目录,robots.txt,都未发现有任何东西. 扫描 直接拉进扫描器一扫,发现 思考可能是git源码泄露,可能可以恢复源 ...

  6. 魔改版ss-panel v3前端配置文件

    配置文件所在目录:网站根目录/config/.config.php <?php // ss-panel v3 配置 // // !!! 修改此key为随机字符串确保网站安全 !!! $Syste ...

  7. sspanelv3魔改版邮件设置指南及常用配置

    要进行SSpanel v3魔改版邮件设置,需要在设置文件(位于config/.config.php下)中修改两处内容: 1.设置发送邮件的方式 $System_Config['enable_email ...

  8. 魔改版BBR

    魔改版bbr加速: wget -N --no-check-certificate "https://raw.githubusercontent.com/chiakge/Linux-NetSp ...

  9. 【题解】kth异或和/魔改版线性基

    [题解]魔改版线性基 魔改版线性基解决此类问题. 联系线性空间的性质,我们直接可以构造出这样的基: \[ 100000 \\ 010000 \\ 000010 \\ 000001 \] 使得每个基的最 ...

随机推荐

  1. amd、cmd、CommonJS以及ES6模块化

    AMD.CMD.CommonJs.ES6的对比 他们都是用于在模块化定义中使用的,AMD.CMD.CommonJs是ES5中提供的模块化编程的方案,import/export是ES6中定义新增的 什么 ...

  2. 【C#】Random类中构造方法、时间种子与随机数序列的关系

    Random类 构造函数 1) Random random = new Random(); // 无参数构造函数使用系统时钟生成其种子值 然而,系统时钟取值范围有限,因此在小规模计算中,可能无法使用不 ...

  3. Mysql表,列,库的增删查改

    下面是我总结的一些基础的sql知识,主要是为了以后更好的查阅和帮助其他初学的人,同时记录自己的成长,还写了一点稍有难度的sql面试题级别的题目,好了废话不多说,见真题... #创建数据库 CREATE ...

  4. IntelliJ IDEA远程Debug Linux的Java程序,找问题不要只会看日志了

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! 我们习惯于在本地开发的时候debug,能快速定位与解决问题,那部署在服务器上是不是就没有办法了呢?只能通过查看日志来定位? ...

  5. 持续部署入门:基于 Kubernetes 实现蓝绿发布

    前言 软件世界比以往任何时候都更快.为了保持竞争力,需要尽快推出新的软件版本,而不会中断活跃用户访问,影响用户体验.越来越多企业已将其应用迁移到 Kubernetes. 在 Kubernetes 中有 ...

  6. 在Linux命令行里与其他用户通信

    大家好,我是良许 在 Linux 命令行里向其他用户发送信息很简单,很多命令都可以做到这点,麻烦的是你需要从众多命令中挑选一个合适的命令来使用.因此,我挑选了四种常用的 Linux 用户通信命令分享给 ...

  7. about blog

    前言 今天无意中发现了一个小姐姐自己设计的的博客,感觉非常的nice,就随手copy一下,完了感觉效果还蛮好的 end 附上小姐姐的博客以及教程

  8. 5分钟掌握企业LVM磁盘划分

    逻辑卷管理LVM是一个多才多艺的硬盘系统工具.无论在Linux或者其他类似的系统,都是非常的好用.传统分区使用固定大小分区,重新调整大小十分麻烦.但是,LVM可以创建和管理“逻辑”卷,而不是直接使用物 ...

  9. flask提交表单验证不通过,以及CSRF攻击原理

    学习表单的问题1. 提交表单时怎么都无法验证通过 记录一下,自己的学习bug,主要是因为在模板中书写渲染的语句时,把CSRF的字段名写错了. 因为在模板中书写一些语句是没有提示的,自己手动敲代码容易出 ...

  10. robotframework安装与运行(ride.py1.7.4.2命令报错)(win10+python3.8.1)

    首先,robotframework必须在python的环境下运行 所以你的电脑里必须有python3.x的环境先. 上古时期的robotframework只支持python2,不过python2都已经 ...