php伪协议

php伪协议

PHP伪协议是PHP支持的一种特殊的协议,它可以用来访问或操作不同的输入输出流,比如文件、网络、内存等

  • php://filter:用于对数据流进行过滤或转换,比如编码、解码、压缩、解压等。
  • php://input:用于访问请求的原始数据,比如POST或PUT方法提交的数据。
  • php://output:用于访问输出缓冲区的内容,比如echo或print输出的数据。
  • php://memory:用于将数据流存储在内存中,相当于一个临时文件。
  • php://temp:用于将数据流存储在内存或临时文件中,根据数据量的大小自动切换。

PHP伪协议在CTF做题中常用于配合文件包含漏洞进行攻击,从而获取网站权限。例如:

  • 利用php://filter读取或执行文件内容,比如:
1
2
?file=php://filter/read=convert.base64-encode/resource=index.php
?file=php://filter/resource=shell.php

如果您想查看服务器上某个文件的源代码,而不执行它,您可以使用第一个参数,并对返回的base64编码进行解码。

如果您想执行服务器上某个文件的代码,您可以使用第二个参数,并在shell.php文件中写入您想要执行的代码。(受到php代码的局限性,因为php代码不会被展示)

  • 利用php://input传入动态代码,比如:
1
2
?file=php://input
POST: <?php system($_GET['cmd']); ?>
  • 利用php://output获取输出内容,比如:
1
?file=php://output&cmd=ls

PHP的data流包装器是一种特殊的流包装器,它可以让您在URL中嵌入数据,包括PHP代码。这个流包装器只有在PHP的配置中开启了allow_url_include选项时才能使用,否则会报错。

data://[mediatype][;base64],[data] //用法

  • mediatype是可选的,表示数据的MIME类型,例如text/plain或image/jpeg等。如果省略了,会默认为text/plain;charset=US-ASCII。

  • base64是可选的,表示数据是否使用base64编码。如果使用了base64编码,需要在mediatype后面加上;base64,否则可以省略。

  • data是必须的,表示要嵌入的数据。如果没有使用base64编码,需要对数据进行URL编码,以避免特殊字符的影响。

  • 直接在data部分写入PHP代码,并指定mediatype为text/plain或application/x-httpd-php等。例如:data://text/plain,

  • 使用base64编码将PHP代码转换为字符串,并在mediatype后面加上;base64。例如:data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg==

    1
    file_get_contents($text,'r')==="welcome to the zjctf"

file_get_contents()函数是用于读取文件的内容的,但是它也可以读取URL的内容,因为PHP支持多种流包装器,可以让您用类似文件操作的方式来访问不同的资源。

构造出:text=data://text/plain,welcome to the zjctf

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2024 John Doe
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信