首页 > 编程语言 >PHP基础知识——PHP伪协议

PHP基础知识——PHP伪协议

时间:2024-04-11 09:46:29浏览次数:27  
标签:协议 php allow url 基础知识 include file PHP

什么是php伪协议

在 PHP 中,"伪协议"是一种特殊的语法,用于访问不同的资源或执行特定的操作。这些伪协议以 php:// 开头,后面跟着特定的指示符或参数,以实现不同的功能。这些伪协议提供了一种方便的方式来处理各种输入输出操作,而不必依赖于实际的文件或网络资源。

简单的理解就是,在URL中使用特殊的协议前缀来指示PHP执行特定的代码。

php.ini参数设置

在php.ini里有两个重要的参数allow_url_fopen、allow_url_include。

  • allow_url_fopen:默认值是ON。允许url里的封装协议访问文件;

  • allow_url_include:默认值是OFF。不允许包含url里的封装协议包含文件;

有哪些伪协议

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

应用场景

文件包含
(关于文件包含的函数)

include()、require()、include_once()、require_once()、highlight_file()
show_source() 、readfile() 、file_get_contents() 、fopen() 、file()

伪协议详解

data://

数据流封装器,以传递相应格式的数据。可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。

allow_url_fopen和allow_url_include都需要开启。

example:

1、data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
 
2、data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

file://

用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响
file://协议主要用于访问文件(绝对路径、相对路径以及网络路径)
比如:www.xx.com?file=file:///etc/passwd

php://

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

php://filter

一个中间件,在读入或写入数据的时候对数据进行处理后输出的过程。可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行base64编码,让其不执行,展现在页面上。从而导致任意文件读取。

ctf解题常用:
变量=php://filter/read=convert.base64-encode/resource=文件名

使用的convert.base64-encode,是一种过滤器。

协议参数

利用filter伪协议绕过死亡exit

何为死亡exit?

举个例子:

file_put_contents($content, '<?php exit();' . $content);

// 或者这样
file_put_contents($content, '<?php exit();?>' . $content);

如果想插入一句话木马,文件内容会变成这样

<?php exit();?>

<?php @eval($_POST['test']);?>

即使插入了一句话木马,在被使用的时候也无法被执行。这样的死亡exit通常存在于缓存、配置文件等等不允许用户直接访问的文件当中。

如何绕过?————filter伪协议+base64decode
利用php://filter的base64-decode方法,将$content解码,利用php base64_decode函数特性去除死亡exit。base64编码中只包含64个可打印字符,当PHP遇到不可解码的字符时,会选择性的跳过。

$content包含 <?php exit; ?>时,解码过程会先去除识别不了的字符,< ; ? >和空格等都将被去除,于是剩下的字符就只有phpexit以及我们传入的字符了。由于base64是4个byte一组,再添加一个字符例如添加字符a后,将phpexita当做两组base64进行解码,也就绕过这个死亡exit了。
这个时候后面再加上编码后的一句话木马,就可以getshell了。

php://input

可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。在POST请求中访问POST的data部分,在enctype="multipart/form-data"的时候php://input 是无效的。

当传进去的参数作为文件名变量去打开文件时,可以将参数php://input,同时post方式传进去值作为文件内容,供php代码执行时当做文件内容读取。

其他

php://stdin、php://stdout 和 php://stderr 允许直接访问 PHP 进程相应的输入或者输出流。 数据流引用了复制的文件描述符,所以如果你打开 php://stdin 并在之后关了它, 仅是关闭了复制品,真正被引用的 STDIN 并不受影响。

注意 PHP 在这方面的行为有很多 BUG 直到 PHP 5.2.1。 推荐简单使用常量 STDIN、 STDOUT 和 STDERR 来代替手工打开这些封装器。

php://stdin 是只读的, php://stdout 和 php://stderr 是只写的。

zip://

可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行。相同类型的还有zlib://和bzip2://。

可以配合文件上传获取webshell,将shell.txt压缩成zip,再将后缀名改为jpg上传,通过zip伪协议访问压缩包里的文件,来连接木马

?url=zip://shell.jpg

注意:此处只能传入绝对路径,要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23。只要是zip的压缩包即可,后缀名可以任意更改。

phar://

与zip://类似,同样可以访问zip格式压缩包内容

http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt

利用 phar 拓展 php 反序列化漏洞攻击面

http:// & https://

allow_url_fopen和allow_url_include都需要开启。

常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。CTF中通常用于远程包含。

http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt

参考文章

https://juejin.cn/post/7163831572158742535

https://blog.csdn.net/IDHALASHAO/article/details/130368938

https://crayon-xin.github.io/2018/04/15/php伪协议-php/

https://segmentfault.com/a/1190000018991087

https://paper.seebug.org/680/

标签:协议,php,allow,url,基础知识,include,file,PHP
From: https://www.cnblogs.com/smile2333/p/18128048

相关文章

  • 【php快速上手(四)】
    目录PHP快速上手(四)PHP类型比较1.松散比较(LooseComparison)2.严格比较(StrictComparison)3.类型转换PHP常量PHP字符串函数1.字符串长度和截取2.字符串查找和替换3.字符串转换和格式化4.字符串分割和连接5.字符串格式验证6.其他字符串函数PHP快速上手(四)PHP......
  • Secure Copy Protocol or SCP - 安全拷贝协议
    SecureCopyProtocolorSCP-安全拷贝协议1.scp文件传输1.1.将远程文件拷贝到本地1.2.将本地文件拷贝到远程1.3.将远程目录拷贝到本地ReferencesSecureCopy(remotefilecopyprogram)TheSCPprogramisasoftwaretoolimplementingtheSCP......
  • PHP代码审计——Day 9-Rabbit
    漏洞解析classLanguageManager{publicfunctionloadLanguage(){$lang=$this->getBrowserLanguage();//获取浏览器语言$sanitizedLang=$this->sanitizeLanguage($lang);//去除可能的不安全字符require_once("/lang/$sanitizedLan......
  • 运维系列(亲测有效):利用 PHPStuday 2018 集成化工具对Apache进行站点域名管理
    利用PHPStuday2018集成化工具对Apache进行站点域名管理利用PHPStuday2018集成化工具对Apache进行站点域名管理利用PHPStuday2018集成化工具对Apache进行站点域名管理第一步:第二步:第三步:第四步:第五步:利用PHPStuday2018集成化工具对Apache进行站点域......
  • PHP代码审计——Day 8-Candle
    漏洞解析header("Content-Type:text/plain");functioncomplexStrtolower($regex,$value){returnpreg_replace('/('.$regex.')/ei','strtolower("\\1")',$value);}forea......
  • 01 Php学习:导学篇
    Php是什么?PHP是服务器端脚本语言。PHP(HypertextPreprocessor)是一种通用开源脚本语言,主要用于服务器端开发。PHP脚本在服务器端执行,生成动态网页内容或执行服务器端任务。PHP可以嵌入到HTML中,也可以与各种数据库结合使用,常用于开发Web应用程序。PHP文件可包含文本、HT......
  • 03 Php学习:echo 、 print 、EOF
    echo和print在PHP中有两个基本的输出方式:echo和print。echo和print区别:echo-可以输出一个或多个字符串print-只允许输出一个字符串,返回值总为1注意:echo输出的速度比print快,echo没有返回值,print有返回值1。echo详解和举例在PHP中,echo语句用于将......
  • php中date() 函数
    实例格式化本地日期和时间,并返回格式化的日期字符串:<?php//Printsthedayechodate("l")."<br>";//Printstheday,date,month,year,time,AMorPMechodate("ljSofFYh:i:sA");?>定义和用法date()函数格式化本地日期和时间,并返回格式化的日期字符串。......
  • MQTT协议特点及数据包结构详解(值得珍藏)
    点击下载《MQTT协议特点及数据包结构详解(值得珍藏)》1.前言MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,用极少的代码和有......
  • PHP中yield关键字的作用和示例
     php中的yield关键字是在php5.5版本引入的一个关键字,它在函数内部可以用来创建一个生成器(generator)。生成器可以用来遍历一个大数据集,而不需要一次性将整个数据集加载到内存中。yield关键字的作用是将当前函数变成一个生成器函数。在生成器函数内部,我们可以使用yield语句将......