[GKCTF 2021]babycat

这道题点开始注册登录界面,但是点击注册按钮会提示Not Allowed。

 但是查看源码会发现

 这里是直接跳出了Not Allowed,构造POST请求,通过burp发包注册一个账号。

注册成功,登录后又上传和下载两个功能,我们发现下载有一个目录穿越,尝试读取,/WEB-INF/web.xml.

 由于上传功能只有管理员可以使用它,因此可以根据xml的内容构造出,

../../WEB-INF/classes/com/web/servlet/registerServlet.class,然后下载这个class文件,查看注册的源码 。

可以使用jd-jui反编译class文件,看到源码。可以很容易就找到针对role的处理。

String var = req.getParameter("data").replaceAll(" ", "").replace("'", "\"");
    Pattern pattern = Pattern.compile("\"role\":\"(.*?)\"");
    Matcher matcher = pattern.matcher(var);
    while (matcher.find())
      role = matcher.group(); 
    if (!StringUtils.isNullOrEmpty(role)) {
      var = var.replace(role, "\"role\":\"guest\"");
      person = (Person)gson.fromJson(var, Person.class);
    } else {
      person = (Person)gson.fromJson(var, Person.class);
      person.setRole("guest");
    } 

此时可以有两种方法,绕过,正则表达式中包含了

"\"role\":\"(.*?)\"",

会把所有内容进行完整匹配,但是JSON中的内联注释不会影响其解析,因此可以使用注释来破坏正则匹配,为了让其不直接走if的另外一个分支,我们还是需要让正则匹配有结果从而保证role变量有内容。JSON中键值一样的数据解析时后面的会覆盖前面的,因此可以构造如下payload

data={"username":"july", "password":"123456","role":"superuser", "role"/**/:"admin"}

可以注意到这里取得的正则匹配结果是最后一个,在可以使用注释的情况下,可以构造如下payload。

{"username":"july","password":"123456","role":"admin"/*,"role":"guest"*/}

 利用这个payload注册一个管理员账户,登陆管理员账户之后,再根据构造../../WEB-INF/classes/com/web/servlet/uploadServlet.class下载后查看上传文件的源码。

if (checkExt(ext) || checkContent(item.getInputStream())) {
    req.setAttribute("error", "upload failed");
    req.getRequestDispatcher("../WEB-INF/upload.jsp").forward(req, resp);
}
item.write(new File(uploadPath + File.separator + name + ext));
req.setAttribute("error", "upload success!");

我们看到内容检测和扩展名检测完成之后,并没有退出,而是继续保存了文件,因此我们可以尝试想../../static/下上传一句话,使用蚁剑连接即可获取flag。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
[gkctf 2021]babycat 是一道较为经典的二进制逆向题目,其中涉及到了汇编语言、反汇编、调试器等知识。这道题目的主要难点在于需要分析出程序的执行过程,并且需要针对程序特定的加密算法进行解密。 在本题中,我们需要通过调试工具分析程序的反汇编码,并且在调试器中断点处进行调试。首先,我们可以使用 objdump 工具反汇编出程序的汇编语言代码,并且了解程序的整体架构和代码逻辑。其次,我们可以通过 IDA Pro 软件对程序进行反汇编,并且找出程序中执行关键部分的具体代码段。在这里,我们需要分析出程序主要的加密算法——RC4 算法,并且找出加密解密函数。 接下来,我们需要通过调试工具来寻找程序的逆向漏洞点,并且在调试器断点处对程序进行调试。在这里,我们可以通过查看程序的内存状态和寄存器状态,来分析程序的执行流程和代码逻辑。在这里,需要注意的是程序加入了反调试机制,我们需要使用 OllyDBG 软件来绕过反调试,以便在调试器中断点处进行调试。 最后,我们需要通过程序加解密函数的分析和调试,来找出 key 的具体取值。在这里,我们需要将程序中的加密过程进行反向推导,并且根据明文和密文的关系来推出 key 值。通过以上步骤,我们可以成功解题并且获得 flag。 总之,[gkctf 2021]babycat 是一道比较有趣的二进制逆向题目,其难点在于需要对程序的加密算法进行深入分析,并且需要对程序进行逆向漏洞点的分析和绕过反调试的操作。通过这道题目的练习,能够提高我们对于汇编语言、调试器和反汇编的理解和掌握,并且能够增加我们的逆向思维和技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值