zoukankan      html  css  js  c++  java
  • PHP伪协议

    PHP封装协议

    PHP有很多内置URL风格的封装协议,这类协议fopen(),copy(),file_exists(),filesize()等文件系统函数所提供的功能类似。常见协议如下:

    file://          访问本地文件系统

    http://         访问HTTP(s)网址

    ftp://           访问FTP(s)URLs

    php://         访问输入/输出流(I/O streams)

    zlib://          压缩流量

    data://        数据(RFC 2397)

    ssh2://        Secure Shell 2

    expect://      处理交互式的流

    glob://          查找匹配的文件路径

    //摘录自《Web安全深度剖析》

    这个封装协议多用于文件包含漏洞

    php伪协议的分类

    伪协议是文件包含的基础,理解伪协议的原理才能更好的利用文件包含漏洞。

    php://input

    php://input代表可以访问请求的原始数据,简单来说POST请求的情况下,php://input可以获取到post的数据。

    使用条件:include( )、include_once( )、file_get_contents( )

    比较特殊的一点,enctype=”multipart/form-data”的时候 php://input 是无效的。

    用法举例:

    • 使用file_get_contents函数的伪协议包含有个经典的例子;
    • 可以使用fputs文件输入流直接服务器某一存在的目录下写入文件。

     

    php://output

    php://output 是一个只写的数据流,允许你以print和echo一样的方式写入到输出缓冲区。

    php://filter(重点)

    php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用,也就是作为一种过滤器,可以使用在数据流产生的地方。

     php文档中,标准的定义是这样的:

    类似的过滤器还有string.rot13、string.strip_tags、zlib.deflate和zlib.inflate等等,目前只要知道convert.base64-encode就好了。

    URL 中包含点的常见形式

    ?file = xxx 或者 ?file = xxx.php

     

    allow_url_fopen和allow_url_include

    在测试了包含点存在包含漏洞以后,并不是都可以使用filter伪协议包含出源码的,因为allow_url_fopen和allow_url_include会影响到fopen和include等函数对于伪协议的支持。

    allow_url_include影响php://input的使用,若不打开则无法使用。

    当allow_url_fopen打开时,可以包含任意url。

    例如只打开allow_url_include时,只能包含远程文件和使用php://input

    举个例子

    题目链接:http://level3.tasteless.eu/

    题目直接给出了源码:

    根据提示,用php://input 伪协议读取php.ini

     

    找到SERVER["DOCUMENT_ROOT"],也就是网站的根目录,可以找到当前脚本的目录,如下:

    还可以看到一些文件包含的配置:

    • rfi是关闭的,也就是allow_url_fopen为Off;
    • allow_url_include开启,可以使用php://input伪协议来列出当前目录下的文件。

    payload:

     //摘录自i春秋博客园

    附上一题文件包含

    题目提示flag在index.php里,直接访问这个页面并没有,但是看到url

     

    我们直接通过封装协议去读取index.php的源代码

    file=php://filter/read=convert.base64-encode/resource=index.php

     这样我们会得到base64后的源码,我们去解码一下

     由此我们得到flag



  • 相关阅读:
    spark 读取mongodb失败,报executor time out 和GC overhead limit exceeded 异常
    在zepplin 使用spark sql 查询mongodb的数据
    Unable to query from Mongodb from Zeppelin using spark
    spark 与zepplin 版本兼容
    kafka 新旧消费者的区别
    kafka 新生产者发送消息流程
    spark ui acl 不生效的问题分析
    python中if __name__ == '__main__': 的解析
    深入C++的new
    NSSplitView
  • 原文地址:https://www.cnblogs.com/N-schema/p/13197501.html
Copyright © 2011-2022 走看看