前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GCTF Web 部分writeup

GCTF Web 部分writeup

作者头像
p4nda
发布2023-01-03 13:30:30
2380
发布2023-01-03 13:30:30
举报
文章被收录于专栏:技术猫屋

目录

前言

准备参加某个CTF竞赛,所以找了XCTF平台上的一些题目练练。也就随手做了个记录。只做了Web题目。(⊙﹏⊙‖∣ 逆向也不会啊)

第一题 热身题

这题还是比较简单的。考渗透测试的思路。第一步扫端口,第二部肯定扫目录。于是拿出AWVS。

发现存在robots.txt,打开 robots.txt

然后直接打开 rob0t.php 出现flag

第二题 Forbidden

这题还是比较坑的,不过还是学到了一些知识,正在做一个CTF中关于头文件的总结,有时间会发出来。 回归主题,这题刚开始做的时候思路就是想改下X-Forwarded-For。但是改过了后发现没卵用,测试好久终于注意到下图。

把编码调整过来后。

真是吐血……吃了burp编码上的亏,浪费那么多时间。 结合页面和注释的提示,继续添加头信息Host:www.topsec.com

继续添加信息Referer:www.baidu.com

继续添加X-Requested-With:XMLHttpRequest

在User-Agent的括号里添加MSIE 4.0;就可以了

继续在User-Agent括号里添加.NET CLR 8.0;

修改Accept-Language为Accept-Language: de-DE,de;

注意返回的头信息,有个set-cookie选项,于是设置

Cookie: login=4e6a59324d545a6a4e7a4d324e513d3d

发现没卵用,页面还是刚才那样,提示没有登陆。于是考虑是不是cookie信息不对。看了下login后面的字符,应该是加密的,从加密的形式上来看,有可能是MD5/HEX/SHA于是拿去解密,发现md5/SHA无果,HEX解密为

明显的base64,解密后为:66616c7365 于是屁颠屁颠的拿到burp,发现还是不对……这尼玛,继续试一试hex解密

终于出来了,于是直接拿着false去,发现不对,试了true也不对,于是将true先hex加密,在base64加密,在hex加密得4e7a51334d6a63314e6a553d,拿到burp里面,成功获取flag。

第三题 变态验证码怎么破

这题做的实在是无语了。

看这个验证码我就没想过识别。就算能识别,对我来说不可能的好吗((/ □ )没有识别验证码的经历)… 所以第一想法是绕过,于是留空,拿到burp里面去爆破。至于爆破密码,看这里:

右击另存为password.txt 载入burp里面开始爆破。全部提示:VCODE ERROR

无果。陷入了窘境。 半天没头绪,于是睡了一觉起来继续做。

重新载入的时候发现了这个。想着是不是COOKIE原因导致绕不过去,于是删除了继续爆破。发现:

不在提升验证码错误了,也就是说,验证码的验证是绕过去了。按理说这个时候应该可以爆破出Flag了,但是还是清一色的

猜测是不是user也是需要爆破点,于是把user也载入爆破了,还是无果…… 最后把user设置成ADMIN(一开始设置的admin),终于爆破成功。

真是,还分大小写……

第四题 SQL注入简单

没法做。网站GG了

第五题 Java序列化

这题实在是不会,于是网上找了几份wp,还是看不太明白,又请教了一些大佬,加上自己研究了一上午,终于搞定了。 首先进入首页,随手输入几个字符,然后点击submit。如图

注意地址栏object后面的参数,很明显的base64加密,于是拿去解密。结果如下:

除去了特殊字符后,大概是以下内容:

sr com.ctf.cn.User / L idt L java/lang/Integer; L name t L java/lang/String;xp sr java.lang.Integer 8 I value xr java.lang.Number ˂ xp test

这些应该就是Java对象序列化后其某些类中参数的值。且是有三个参数,类型分别是String,Integer,Number。根据页面的提示name not admin or id not 1,可以知道其中两个参数应该是name和id,并且要求name=admin&&id=1

到这里大概也就清楚这个题目的思路了。 判断类对象判断对象中的参数值序列化该对象将序列化后的结果进行Base64加密。 但是对于java的序列号相关不是熟悉,所以尝试了很多次后,发现写的脚本都没有办法用。 所以这里想到了一个办法。逆向做题。 首先我们填写admin,然后点击submit后,将后面的base64加密的密文

rO0ABXNyAA9jb20uY3RmLmNuLlVzZXIAAAAAA/kvvQIAAkwAAmlkdAATTGphdmEvbGFuZy9JbnRlZ2VyO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAPodAAFYWRtaW4=

保存为1.txt。 然后使用python进行解密到2.txt文件.脚本如下:

代码语言:javascript
复制
import sys
import base64
import os

filename_list = []

def readfile(filename):
    input = open(filename)
    for x in input:
        print x
        filename_list.append(x)
    input.close()

def writefile(filename):
    output = open(filename,'w')
    for x in filename_list:
        x = encode_base64(x)
        output.write(x)
    output.close()

# base64
def encode_base64(line):
    line = base64.b64decode(line)
    return line

readfile(sys.argv[1])
writefile(sys.argv[2])

print 'OK!'

将文件使用16进制编辑器打开

发现不知道从哪里修改。这就比较蛋疼了。 想了想,如果需要确定ID的值,那么就需要自己构造序列化,然后分析。 于是参考了一些资料(这里)后,用我可怜的Java知识,写了一个Java脚本。如下:

Test.java

代码语言:javascript
复制
package com.ctf.cn;
public class test implements java.io.Serializable
{
   public String name = "admin";
   public Integer id = 1;
   public long number = 1234567L;
  // 根据上文,所以这里创建三个值
}

Xuliehua.java
package com.ctf.cn;
import java.io.*;
 
public class SerializeDemo
{
   public static void main(String [] args)
   {
      test e = new test();
      try
      {
         FileOutputStream fileOut =  new FileOutputStream("E:\\id1.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("OK!");
      }catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}

如上,将id的值分别改成1,2 然后输出了两个文件:id1.ser,id2.ser

打开可以发现:

Id1.ser

Id2.ser

两个文件除了74 前的那个01、 02不相同之外,其余全部相同。很明显只要将先前的2.txt中的数字也改成00 01即可。如图:

保存。 再写一个base64的加密脚本。如下:

代码语言:javascript
复制
import sys
import base64
import os

filename_list = []

def readfile(filename):
    input = open(filename)
    for x in input:
        print x
        filename_list.append(x)
    input.close()

def writefile(filename):
    output = open(filename,'w')
    for x in filename_list:
        x = encode_base64(x)
        output.write(x)
    output.close()

# base64
def encode_base64(line):
    line = base64.b64encode(line)
    return line

readfile(sys.argv[1])
writefile(sys.argv[2])

print 'OK!'

最终的加密结果为:

rO0ABXNyAA9jb20uY3RmLmNuLlVzZXIAAAAAA/kvvQIAAkwAAmlkdAATTGphdmEvbGFuZy9JbnRlZ2VyO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAABdAAFYWRtaW4=

所以playload为:

http://218.2.197.232:18005/ctfobj/Login?object=rO0ABXNyAA9jb20uY3RmLmNuLlVzZXIAAAAAA/kvvQIAAkwAAmlkdAATTGphdmEvbGFuZy9JbnRlZ2VyO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAABdAAFYWRtaW4=

总结

时间关系。没有做完,剩余的题目,抽时间继续做。 做的这五题还是很有收获的。首先是头文件的相关知识掌握更加牢固,对于细心方面需要更加注意才是,对于java的序列号也有了更加深刻的认识。 做题是成长最快的~哈哈~

代码语言:javascript
复制
                                                          2017.6.16
                                                            Panda
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 前言
  • 第一题 热身题
  • 第二题 Forbidden
  • 第三题 变态验证码怎么破
  • 第四题 SQL注入简单
  • 第五题 Java序列化
  • 总结
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档