GCTF Web 部分writeup

前言

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

第一题 热身题

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

1.png

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

2.png

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

3.png

第二题 Forbidden

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

4.png

把编码调整过来后。

5.png

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

6.png

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

7.png

继续添加X-Requested-With:XMLHttpRequest

8.png

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

9.png

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

10.png

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

11.png

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

Cookie: login=4e6a59324d545a6a4e7a4d324e513d3d

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

12.png

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

13.png

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

14.png

第三题 变态验证码怎么破

这题做的实在是无语了。

15.png

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

16.png

17.png

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

18.png

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

19.png

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

20.png

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

21.png

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

22.png

真是,还分大小写……

第四题 SQL注入简单

23.png

没法做。网站GG了

第五题 Java序列化

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

24.png

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

25.png

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

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文件.脚本如下:

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!'

26.png

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

27.png

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

Test.java

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

28.png

打开可以发现:

Id1.ser

29.png

Id2.ser

30.png

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

31.png

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

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!'

32.png

最终的加密结果为:

rO0ABXNyAA9jb20uY3RmLmNuLlVzZXIAAAAAA/kvvQIAAkwAAmlkdAATTGphdmEvbGFuZy9JbnRlZ2VyO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAABdAAFYWRtaW4=

所以playload为:

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

33.jpg

总结

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

                                                          2017.6.16
                                                            Panda

标签: GCTF, WriteUp, CTF

添加新评论