当前位置: 首页 > news >正文

PHP安全

 PHP伪协议:

一.【file://协议】

PHP.ini:

file:// 协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

file:// [文件的绝对路径和文件名]

http://127.0.0.1/test.php?Bx=file://D:\phpstudy_pro\WWW\2.php

二.【php://协议】

条件:

不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。

php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。

参考自:PHP: php:// - Manual

php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。

PHP.ini:

php://filter在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

 

 测试:

php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

PHP.ini:

allow_url_fopen :off/on

allow_url_include:on        默认是off一般用不了

测试:

三.【zip://, bzip2://, zlib://协议】

 压缩、重命名

PHP.ini:

zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。

参考自:PHP: zlib:// - Manual

1.【zip://协议】

使用方法:

zip://archive.zip#dir/file.txt

zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

测试现象:

先将要执行的PHP代码写好文件名为2.txt,将2.txt进行zip压缩,压缩文件名为2.zip,如果可以上传zip文件便直接上传,若不能便将2.zip重命名为2.jpg后在上传,其他几种压缩格式也可以这样操作。

由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23,且此处经过测试相对路径是不可行,所以只能用绝对路径。

以下两个需要在linux下测试:windows不能成功,用法都一样

2.【bzip2://协议】

使用方法:

compress.bzip2://file.bz2

3.【zlib://协议】

使用方法:

compress.zlib://file.gz

四.【data://协议】

经过测试官方文档上存在一处问题,经过测试PHP版本5.2,5.3,5.5,7.0;data:// 协议是是受限于allow_url_fopen的,官方文档上给出的是NO,所以要使用data://协议需要满足双on条件

PHP.ini:

data://协议必须双在on才能正常使用;

allow_url_fopen :on

allow_url_include:on

测试:

五. 常规小结:

PHP封装协议在CTF蛮常见的,是经常会遇到的出题点,如下便是对本篇涉及的封装协议进行的总结,期待小伙伴的交流和补充。

webshell 

第一题:

<?php$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {unset($parameters['action']);
}$a = call_user_func($action, ...$parameters);

分析:

1.call_user_func — 把第一个参数作为回调函数调用

2.isset — 检测变量是否已声明并且其值不为 null

3.unset — 清除指定变量

4.action要接一个类似于system 的函数,在if循环里检测了action关键字,然后用unset删掉了,所以传到$a里的parameters不含action

提示:usort变长参数+回调后门

usort — 使用用户自定义的比较函数对数组中的值进行排序

简单: 

?action=system&1=whoami

action接到了system,parameters接到的是整个,然后unset把action删掉后,就变成了1=whoami

?action=usort&0[0]=system&0[1]=whoami&1=call_user_func 

第二题:

加了个POST

<?php$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {unset($parameters['action']);
}call_user_func($action, $parameters)($_POST['a'])($_POST['b']);

开始套娃:

call_user_func会把action的参数作为函数调用,而有这么一个函数:current

 使用HackBar 导入url:action=current&1=current :

call_user_func会使用current函数,会变形为:current($parameters),通过打印会看到$parameters是一个数组,所以又会变形为:current($_POST['a'])($_POST['b']),最后只要将POST[a]传递为一个数组就好了

 

 

 

第三题:

<?php
$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {unset($parameters['action']);
}call_user_func($action, $parameters);if(count(glob(__DIR__.'/*'))>3){readfile('flag.txt');
}

 分析:

只有在这个目录下存在三个以上文件时才能读出flag.txt,所以要创建文件,在php中有这么一个函数:

PHP: session_start - Manual

在启用一个新的会话时,会自动创建一个session文件;但是这个session文件默认的路径是/tmp

所以我们还要修改路径:又引出了这个函数

PHP: session_save_path - Manual

 

那我们需要知道要在哪里创建文件(不是上帝视角):可以传递一个错误的参数,有可能会有报错 :

 开始:

?action=session_start&save_path=D:\phpstudy_pro\WWW\test\

这样就生成了一个session文件:

 

但是还是不够三个:只要修改cookie就可以了,或者换个浏览器

 

第四题:

<?php
Class A{static function f(){system($_POST['a']);}
}$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {
unset($parameters['action']);
}call_user_func($action, $parameters);
?>

相关文章:

PHP安全

PHP伪协议&#xff1a; 一.【file://协议】 PHP.ini&#xff1a; file:// 协议在双off的情况下也可以正常使用&#xff1b; allow_url_fopen &#xff1a;off/on allow_url_include&#xff1a;off/on file:// 用于访问本地文件系统&#xff0c;在CTF中通常用来读取本地文…...

c++278函数指针

#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<string.h> #include<stdio.h>//数组类型基本语法知识梳理 //定义一个数组类型 //int a[10];//定义一个指针数组类型//定义一个指向数组类型的指针 数组类型的指针void main() {int a[10];//a代…...

sklearn特征选取之SelectFromModel

sklearn.feature_selection.SelectFromModel 是一种基于模型的重要性权重进行特征选择的工具&#xff0c;允许我们根据学习器的权重或特征重要性自动选择特征。它通过从模型中提取特征的重要性来选择特征&#xff0c;常用于与那些具有 coef_ 或 feature_importances_ 属性的模型…...

vue一级、二级路由设计

一、一级路由设计 一级路由是指直接映射到应用程序中顶级页面或组件的路由。这些路由通常定义在Vue Router的配置中&#xff0c;作为应用程序导航结构的基础。 直接映射&#xff1a;一级路由直接映射到URL路径和Vue组件&#xff0c;没有嵌套关系。顶级导航&#xff1a;它们通…...

python爬虫:将知乎专栏文章转为pdf

欢迎关注本人的知乎主页~ 实现思路 用户输入专栏ID&#xff1a; 代码首先提示用户输入一个知乎专栏的ID&#xff0c;默认值为 c_1747690982282477569。输入的ID用于构建API请求的URL。 发送HTTP请求&#xff1a; 使用 requests.get() 向知乎API发送GET请求&#xff0c;获取指定…...

嵌入式笔记(入门系列2)

目录 宏函数 预处理器#include 内存泄漏 内存对齐 堆与栈 Malloc 和 New Inline 宏函数 宏函数&#xff0c;宏函数&#xff0c;实际上就是让宏像函数一样被使用。宏函数以函数形式的方式进行入参&#xff0c;但是返回结果是通过表达式求值得到。话说的抽象&#xff0c;我…...

并发编程多线程

1.线程和进程的区别&#xff1f; 进程是正在运行程序的实例&#xff0c;进程中包含了线程&#xff0c;每个线程执行不同的任务不同的进程使用不同的内存空间&#xff0c;在当前进程下的所有线程可以共享内存空间线程更轻量&#xff0c;线程上下文切换成本一般上要比进程上下文…...

【十八】MySQL 8.0 新特性

MySQL 8.0 新特性 目录 MySQL 8.0 新特性 概述 简述 1、数据字典 2、原子数据定义语句 3、升级过程 4、会话重用 5、安全和账户管理 6、资源管理 7、表加密管理 8、InnoDB增强功能 9、字符集支持 10、增强JSON功能 11、数据类型的支持 12、查询的优化 13、公用…...

巨潮股票爬虫逆向

目标网站 aHR0cDovL3dlYmFwaS5jbmluZm8uY29tLmNuLyMvSVBPTGlzdD9tYXJrZXQ9c3o 一、抓包分析 请求头参数加密 二、逆向分析 下xhr断点 参数生成位置 发现是AES加密&#xff0c;不过是混淆的&#xff0c;但并不影响咱们扣代码 文章仅提供技术交流学习&#xff0c;不可对目标服…...

传知代码-从零开始构建你的第一个神经网络

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 从零开始构建你的第一个神经网络 在本教程中&#xff0c;我们将使用PyTorch框架从零开始构建一个简单的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;用于图片二分类任务。CNN 是一种深度学习模型&#…...

大厂面试真题:SpringBoot的核心注解

其实理解一个注解就行了&#xff20;SpringBootApplication&#xff0c;我们的启动类其实就加了这一个 但是这么答也不行&#xff0c;因为面试官要的答案肯定不止这一个 我们打开SpringBootApplication的源码&#xff0c;会发现上面加了一堆的注解 相对而言比较重要是下面三个…...

Java设计模式—面向对象设计原则(五) ----->迪米特法则(DP) (完整详解,附有代码+案例)

文章目录 3.5 迪米特法则(DP)3.5.1 概述3.5.2 案例 3.5 迪米特法则(DP) 迪米特法则&#xff1a;Demeter Principle&#xff0c;简称DP 3.5.1 概述 只和你的直接朋友交谈&#xff0c;不跟“陌生人”说话&#xff08;Talk only to your immediate friends and not to stranger…...

docker多阶段镜像制作,比如nginx镜像,编译+制作

镜像制作&#xff0c; nginx的源码包 把nginx源码拷贝到容器内 编译要用到gcc make , 以及扩展工具 pcre openssl # "pcre" perl compatibal regulaer expression 刚开始&#xff0c;可以两个终端&#xff0c; 一个手工操作(编译安装、拷贝、环境变量等)&#xf…...

大语言模型量化方法GPTQ、GGUF、AWQ详细原理

大语言模型量化的目的是减少模型的计算资源需求和存储占用&#xff0c;同时尽量保持模型的性能。以下是几种常见的量化方法的原理&#xff1b; 1. GPTQ (Gradient-based Post-training Quantization) GPTQ 是一种基于梯度的后训练量化方法&#xff0c;主要目的是在减少浮点计…...

《 C++ 修炼全景指南:十 》自平衡的艺术:深入了解 AVL 树的核心原理与实现

摘要 本文深入探讨了 AVL 树&#xff08;自平衡二叉搜索树&#xff09;的概念、特点以及实现细节。我们首先介绍了 AVL 树的基本原理&#xff0c;并详细分析了其四种旋转操作&#xff0c;包括左旋、右旋、左右双旋和右左双旋&#xff0c;阐述了它们在保持树平衡中的重要作用。…...

SAP 特别总账标识[SGL]

1. 特别总账标识(SGL)概述 1.1 定义与目的 特别总账标识&#xff08;Special General Ledger, SGL&#xff09;在SAP系统中用于区分客户或供应商的不同业务类型&#xff0c;以便将特定的业务交易记录到非标准的总账科目中。 定义&#xff1a;SGL是一个用于标记特殊业务类型的…...

认知杂谈77《简单:通往高手的技巧》

内容摘要&#xff1a;          在信息爆炸、关系复杂的时代&#xff0c;简单是复杂背后的真谛。简单如“112”&#xff0c;是智慧的朴素呈现。简单有强大力量&#xff0c;像清泉般纯净&#xff0c;如“我爱你”简单却有力&#xff0c;基础财务知识也体现其在理财中的作…...

《SmartX ELF 虚拟化核心功能集》发布,详解 80+ 功能特性和 6 例金融实践

《SmartX ELF 虚拟化核心功能集》电子书现已发布&#xff01;本书详细介绍了 SmartX ELF 虚拟化及云平台核心功能&#xff0c;包含虚机服务、容器服务、网络服务、存储服务、运维管理、工具服务、数据保护等各个方面。 即刻下载电子书&#xff0c;了解如何利用基于 SmartX ELF …...

9月23日

思维导图 作业 统计家目录下.c文件的个数 #!/bin/bashnum0for file in ~/*.c; doif [ -f "$file" ]; then((num))fi doneecho "家目录下.c文件的个数: $num"...

如何使用Jinja定义dbt宏

dbt宏在dbt框架内的工作方式与传统编程中的函数类似。它允许用户将特定的、通常是重复的SQL逻辑封装到可调用的命名单元中&#xff0c;就像在其他编程语言中用函数来避免重复代码一样&#xff1b;dbt宏定义特定业务的SQL逻辑&#xff0c;然后在dbt项目中需要的地方调用该宏函数…...

深入理解 JavaScript 三大作用域:全局作用域、函数作用域、块级作用域

一. 作用域 对于多数编程语言&#xff0c;最基本的功能就是能够存储变量当中的值、并且允许我们对这个变量的值进行访问和修改。那么有了变量之后&#xff0c;应该把它放在哪里、程序如何找到它们&#xff1f;是否需要提前约定好一套存储变量、访问变量的规则&#xff1f;答案…...

【门牌制作 / A】

题目 代码 #include <bits/stdc.h> using namespace std; int main() {int cnt 0;for (int i 1; i < 2020; i){string s;s to_string(i);cnt count(s.begin(), s.end(), 2);}cout << cnt; }...

Git+Jenkins 基本使用(Basic Usage of Git+Jenkins)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

智谱清言:智能语音交互的引领者,解锁高效沟通新体验

哪个编程工具让你的工作效率翻倍&#xff1f; 在日益繁忙的工作环境中&#xff0c;选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度&#xff0c;甚至让团队协作更加顺畅。那么&#xff0c;哪款编程工具让你…...

前端组件库

vant2现在的地址 Vant 2 - Mobile UI Components built on Vue...

后端常用的mybatis-plus方法以及配合querywapper使用

目录 一、插入数据 save方法 二、删除操作 removeById方法 三、更新操作 updateById方法 四、查询操作 selectById方法 五、条件构造器QueryWrapper的更多用法 1.比较操作符 2.逻辑操作符 3.模糊查询 4.空值判断 一、插入数据 save方法 save(T entity):向数据库中插入…...

【设计模式】万字详解:深入掌握五大基础行为模式

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 【设计模式】&#xf…...

C++ 9.19

练习&#xff1a;要求在堆区申请5个double类型的空间&#xff0c;用于存储5名学生的成绩。请自行封装函数完成 1> 空间的申请 2> 学生成绩的录入 3> 学生成绩的输出 4> 学生成绩进行降序排序 5> 释放申请的空间 主程序中用于测试上述函数 #include<ios…...

[Unity Demo]从零开始制作空洞骑士Hollow Knight第五集:再制作更多的敌人

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作敌人另个爬虫Crawler 1.公式化导入制作另个爬虫Crawler素材2.制作另个爬虫Crawler的Crawler.cs状态机3.制作敌人另个爬虫Crawler的playmaker状态机二、…...

怎么把excel翻译成英文?这些翻译技巧记得收藏

在处理Excel数据时&#xff0c;我们常常会遇到多语言的数据集&#xff0c;这无疑给数据分析和整理带来了不小的挑战。 幸运的是&#xff0c;随着技术的发展&#xff0c;现在有多种工具可以帮助我们进行Excel中的批量翻译&#xff0c;这些工具以其强大的翻译功能和便捷的操作方…...