• D^3CTF 2021 8-bit-pub


    原文:http://w4nder.top/?p=407
    这题花了我比较长的时间,一直在想如何命令执行,不过这题也比较容易上车...希望WP出来后能把java那题弄懂

    8-bit-pub

    首先要成为admin,本来以为是文件读取读key然后伪造session啥的,但是这代码路由写死了

    图片

    总的来说就三个功能

    登陆注册用的是预编译,可以这样

    图片

    sql查询就变成了

    SELECT * FROM test WHERE username='admin' and password=`password`=true; 
    

    admin可以发送email
    图片

    图片

    这里能向contents插入任意对象,但是不能__proto__原型链污染,貌似是shvl.set函数过滤了,但是其他都可以,例如插入附件
    图片

    然后邮箱中收到附件
    图片

    现在能读文件,但是题目要求/readflag

    然后偶然间登陆的时候碰到这个,也不知道是nodejs同步异步还是什么的问题,能看到别人的参数报错

    图片

    顺藤摸瓜找到node_modules odemailerlibsendmail-transportindex.js中有一个chlid_process,并且构造函数中将其赋值给_spawn

    图片

    然后在下面send方法中找到一处调用

    图片

    先看看this.path和args

    图片

    发现两个参数均来自options,args需要是数组,而options就是SendmailTransport类的构造参数,全局搜索一下哪里调用了这个类

    图片

    在nodemailer.js中有实例化,跟进发现这个函数就是mail.js中创建transporter的函数

    mail.js

    图片

    nodemail.js,其中构造参数来自options,options又来自transporter

    图片

    假设这里参数可控,那么SendmailTransport中的这一段就能命令执行了

    sendmail = this._spawn(this.path, args);
    

    接下来就得找到调用SendmailTransport.send()的地方
    先回到nodemail.js

    实例化后放到Mailer中返回

    图片

    然后调用sendMail

    图片

    跟进,在node_modules odemailerlibmailerindex.js#214行中调用了send函数图片

    接下来需要用原型链污染,污染options里的参数,首先需要options.sendmail为真,确保进入if

    图片

    然后相继污染path,args

    payload:

    {"to":"1966239894@qq.com","subject":"123","text":"123","constructor.prototype.sendmail":true,"constructor.prototype.path":"/bin/sh","constructor.prototype.args":["-c","/readflag >/tmp/wand"]}
    

    图片

    写入成功后去读文件

    图片

    图片

    d3ctf{01c185051349caebc42bf2a2bef08e9cca73b0f9bf680cf6406127081c6679eb}
    
  • 相关阅读:
    uniapp 的组件 定义了 直接使用即可 。
    uniapp 关闭微信小程序的索引警告
    微信小程序 组件化开发 实现 导航分类文章 小程序
    微信小程序 向下滚动加载更多 和 上滑刷新的写法
    微信小程序 用 Pormise 封装 wx.request 请求
    ES6 再次学习 Promise语法(代码图解)
    Maven依赖排除及版本统一
    Maven依赖使用的范围
    SSM整合时的配置文件
    SSM整合时用到的maven依赖
  • 原文地址:https://www.cnblogs.com/W4nder/p/14508831.html
Copyright © 2020-2023  润新知