【web | CTF】攻防世界 wife_wife

这篇具有很好参考价值的文章主要介绍了【web | CTF】攻防世界 wife_wife。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

步骤1:峰回路转

步骤2:JavaScript原型链污染

步骤3:fuzz测试

总结:题目意义


步骤1:峰回路转

ctf攻防,CTF,前端

对英语无感的我一开始没看到有个注册的提示,还以为暴力破解,看了一下题目才知道不需要暴力破解

来到注册页面 ,就发现有点吊了,is admin可以勾选,居然能注册管理员,有点搞笑,不切实际,正经实战的话哪来这功能?

那么怀疑点其实就应该放在这里,毕竟有管理员权限相当于无敌,通常逻辑都是要靠管理员权限才能拿到flag

ctf攻防,CTF,前端

 第一次没勾选,直接注册,然后登录,就拿到了flag,去试了试flag

ctf攻防,CTF,前端

 ctf攻防,CTF,前端

 flag是假的,被骗了,果然需要去怼admin才行

步骤2:JavaScript原型链污染

后来也没做出来,去看了别人的wp才知道是JavaScript原型链污染攻击

造成这个漏洞的有一个很重要的前提,这题目的后端是node.js来写的,也就是说后端不是php服务器,不是java服务器,而是JavaScript服务器

因为是JavaScript语言来处理后端+用JavaScript的那个函数来处理,所以才有这个漏洞产生

JavaScript原型链污染详细学习链接在此:JavaScript 原型链污染 | Drunkbaby's Blog

我们来看最重要的部分,如果是在代码中正常生成的对象,是没有污染了

baseUser = {
    a:1
}
user = {
    a:2,
    b:1,
    __proto__:{
        c:3
    }
}

// 这个函数的作用:浅复制一个对象,第一个参数位是对象的内容,后面的参数位是多个对象内容叠加进去,进行复制出一个全新的对象
let newUser = Object.assign({}, baseUser, user)  
// 无污染,结果正常
console.log(newUser)  // {a: 2, b: 1}  
// 无污染,结果正常
console.log(newUser.__proto__)  // {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}

可问题是,后端服务器是JavaScript,我们通过post发送过去的 json是字符串,JavaScript需要通过JSON.parse()函数才能把 json字符串转成对象

baseUser = {
    a:1
}

// 这次使用函数把json字符串转成对象,就出问题了,
user = JSON.parse('  {"a" : 2 , "b" : 3 , "__proto__" : { "c" : 4 }}  ')
// 这个函数的作用:浅复制一个对象,第一个参数位是对象的内容,后面的参数位是多个对象内容叠加进去,进行复制出一个全新的对象
let newUser = Object.assign({}, baseUser, user)


console.log(newUser)  // {a: 2, b: 1}  ,__proto__是隐藏属性,是不会直接显示的
console.log(newUser.__proto__) // {c: 4}  ,但是一打印就出来了
console.log(newUser.c) // 4  ,已经被污染了,这个属性是一直存在的

大家可以自行复制粘贴去试试

步骤3:fuzz测试

看wp源代码才知道,这个后端是没有数据库的,sql注入就别想了

我们来看看代码讲什么,每一行我都写注释了

// post请求的路径
app.post('/register', (req, res) => {

    let user = JSON.parse(req.body)  // 把我们输入的账号密码,从json字符串转成对象

    // 判断我们有没有输入账号和密码
    if (!user.username || !user.password) {  
        return res.json({ msg: 'empty username or password', err: true })
    }
    // 判断账号是否存在总对象的username里,如果相同的username就是重复用户名了
    if (users.filter(u => u.username == user.username).length) {  
        return res.json({ msg: 'username already exists', err: true })
    }
    // isAdmin是否true 与 邀请码是不是等于这个常量,所以sql注入没用,邀请码是个常量
    if (user.isAdmin && user.inviteCode != INVITE_CODE) {
        user.isAdmin = false
        return res.json({ msg: 'invalid invite code', err: true })
    }

    // 使用系统函数复制对象,打包成一个新的对象
    let newUser = Object.assign({}, baseUser, user)
    users.push(newUser)  // 存到总对象里
    res.json({ msg: 'user created successfully', err: false })  // 设置返回信息
})

看了这部分源码能判断出,如果这个登陆的对象里,isAdmin的属性是true,那就证明是一个管理员,如果是普通注册的用户,isAdmin属性是false

那么直接污染即可

ctf攻防,CTF,前端

ctf攻防,CTF,前端

 注册了管理员账号后,进去之后的flag也变了,这次flag才是真的

 但这在比赛的时候是没有源码给你看的,所以应该是相当的难,需要fuzz测试

总结:题目意义

我暂时没搞明白这题目意义何在,好像跟实战有点偏离的太远了,用JavaScript服务器来处理登录?账号密码不存放数据库?存缓存里?能让所有人注册管理员账号?太扯淡了文章来源地址https://www.toymoban.com/news/detail-731119.html

到了这里,关于【web | CTF】攻防世界 wife_wife的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 攻防世界ctf题目easyupload做题笔记。

    攻防世界ctf题目easyupload做题笔记。

    刚刷完upload-labs靶场,做做ctf题目,发现自己掌握的知识并不牢固。做了半天没有解出来,最后还是看别人的题解做出来的。写下做题过程,也就是wp吧。为了方便以后复习巩固。 本题的主要考点为利用fastcgi的.user.ini特性进行任意命令执行 这里需要绕过的点如下 检查文件内

    2024年02月01日
    浏览(6)
  • CTF wed安全(攻防世界)练习题

    CTF wed安全(攻防世界)练习题

    进入网站如图: 翻译:在这个小小的挑战训练中,你将学习Robots exclusion standard。网络爬虫使用robots.txt文件来检查它们是否被允许抓取和索引您的网站或只是其中的一部分。 有时这些文件会暴露目录结构,而不是保护内容不被抓取。 好好享受吧!   步骤一: 进入robots.txt文

    2024年04月17日
    浏览(14)
  • [CTF/网络安全]攻防世界 easyupload 解题详析

    [CTF/网络安全]攻防世界 easyupload 解题详析

    题目描述:一名合格的黑客眼中,所有的上传点都是开发者留下的后门 惯例,上传一句话木马 回显如下: 也就是说文件被过滤 抓包改后缀,.php1~.php9、.htaccess均被过滤(.htaccess 文件是一个用于配置 Apache Web 服务器的配置文件。它通常位于网站根目录或特定目录中,用来为该

    2024年02月08日
    浏览(6)
  • [CTF/网络安全] 攻防世界 backup 解题详析

    [CTF/网络安全] 攻防世界 backup 解题详析

    题目描述:X老师忘记删除备份文件,他派小宁同学去把备份文件找出来,一起来帮小宁同学吧! PHP 脚本文件的备份文件名,通常采用以下命名方式: 在原始文件名后添加日期时间戳。例如,如果要备份名为 index.php 的文件,则可以将其备份文件命名为 index_20230521_004017.php。这

    2024年02月05日
    浏览(7)
  • [CTF/网络安全] 攻防世界 cookie 解题详析

    [CTF/网络安全] 攻防世界 cookie 解题详析

    题目描述:X老师告诉小宁他在cookie里放了些东西,小宁疑惑地想:这是夹心饼干的意思吗? 根据提示,获取页面Cookie中的数据即可 页面提示 look here:cookie.php ,于是GET /cookie.php : 提示 查看HTTP响应 method 1 HTTP响应通常可以在浏览器的开发者工具中找到。 按下F12键打开浏览器

    2024年02月05日
    浏览(10)
  • [CTF/网络安全] 攻防世界 PHP2 解题详析

    [CTF/网络安全] 攻防世界 PHP2 解题详析

    翻译: 你能给这个网站进行身份验证吗? index.php是一个常见的文件名,通常用于Web服务器中的网站根目录下。它是默认的主页文件名,在访问一个网站时,如果没有特别指定页面文件名,则服务器会自动加载index.php文件。 在Web应用程序中,index.php文件通常是网站的入口文件

    2024年02月13日
    浏览(12)
  • [CTF/网络安全] 攻防世界 weak_auth 解题详析

    [CTF/网络安全] 攻防世界 weak_auth 解题详析

    题目描述:小宁写了一个登陆验证页面,随手就设了一个密码。 weak_auth翻译: 弱认证 这个术语通常用来描述一种较弱的安全认证方法或机制,它可能存在安全漏洞,易受到攻击或者被绕过。 在信息安全领域中,弱认证是一种常见的安全威胁。例如,使用简单的密码或者未加

    2024年02月13日
    浏览(8)
  • [CTF/网络安全] 攻防世界 simple_php 解题详析

    [CTF/网络安全] 攻防世界 simple_php 解题详析

    题目描述:小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 $a=@$_GET[\\\'a\\\']; 从HTTP GET请求参数中获取一个名为a的变量,并将其赋值给变量a。@符号用于禁止错误输出,如果不存在参数a则会将变量a设置为NULL。 $b=@$_GET[\\\'b\\\']; 从HTTP GET请求参数中获取一个名为b的变量,

    2024年02月13日
    浏览(7)
  • [CTF/网络安全] 攻防世界 php_rce 解题详析

    [CTF/网络安全] 攻防世界 php_rce 解题详析

    PHP RCE 指的是通过远程代码执行漏洞(Remote Code Execution)来攻击 PHP 程序的一种方式。简单来说,由于PHP应用程序没有正确处理外部输入数据(如用户提交的表单、请求参数等),攻击者通过某些手段向 PHP 应用程序中注入恶意代码,然后通过这些恶意代码实现对受攻击服务器

    2024年02月06日
    浏览(12)
  • [CTF/网络安全] 攻防世界 disabled_button 解题详析

    [CTF/网络安全] 攻防世界 disabled_button 解题详析

    题目描述:X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢? 题目提示 前端知识 ,由HTML相关知识可知,该按钮 即input标签 不能提交的原因有以下六种: 没有包含在表单中: input 标签必须包含在表

    2024年02月07日
    浏览(10)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包