fxz靶场
本文最后更新于:2023年6月5日 下午
风信子靶场
1、MISC
1.1 xxxxFuck
下载后打开文件,发现打不开:
zip相关文件知识:
1 |
|
一开始还以为与压缩分卷有关,后来放到010Editor里面分析,发现:
出现了zip文件的目录区和目录结束区,但是没有数据区。
观察文件开头,发现:
此处好像缺少 50 4B 03 04
于是加上,可得:
保存该zip文件,打开可得:
里面是这样的:
经过查询结合题目得知:
这是一个JSFuck加密
1 |
|
解密可得flag:
1 |
|
2、WEB
2.1 Python Master
打开发现:
刷新后:
于是使用bp抓包:
在Cookie中发现一串可疑的编码,经过查询可知,该编码为jwt编码
JWT结构:
JWT 的三个组成部分依次如下。
- · Header(头部)
- · Payload(负载)
- · Signature(签名)
1 |
|
2.1.1 Header
Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。
1 |
|
上面代码中,alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
最后,将上面的 JSON 对象使用 Base64URL 算法转成字符串。
2.2.2 Payload
Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子
1 |
|
JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
这个 JSON 对象也要使用 Base64URL 算法转成字符串。
2.2.3 Signature
Signature 部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。
1 |
|
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用”点”(.)分隔,就可以返回给用户。
我们将cookie中的JWT编码放到 JSON Web Tokens - jwt.io 网站中解密,发现:
此处我们将 payload中的 guest 改成 admin即可,但是我们不知道密钥就不能知道JWT编码的第三段。
经过查询可知,有个插件 c-jwt-cracker-master 可以破解密钥,安装在kali里面
格式:
1 |
|
解码可得密钥:1KuN
通过密钥就可以获得JWT编码,发送数据包就得到了源码。。。
2.2 非诚勿扰
进入题目后,查看robots.txt可得到 一个源码,其中mt_srand(???) 参数用?说明不知道参数是多少
2.2.1 mt_srand()
mt_srand() 播种 Mersenne Twister 随机数生成器。
语法
1 |
|
参数 | 描述 |
---|---|
seed | 必需。用 seed 来给随机数发生器播种。 |
说明
从 PHP 4.2.0 版开始,seed 参数变为可选项,当该项为空时,会被设为随时数。
2.2.2 mt_rand()
mt_rand() 使用 Mersenne Twister 算法返回随机整数。
语法
1 |
|
说明
如果没有提供可选参数 min 和 max,mt_rand() 返回 0 到 RAND_MAX 之间的伪随机数。例如想要 5 到 15(包括 5 和 15)之间的随机数,用 mt_rand(5, 15)。
经过查询资料可知,如果mt_srand()参数为一个常数,那么mt_rand()产生的就是伪随机数,每次运行产生的随机数与上一次值和位置完全相同。
由此可知:本题只要把mt_srand(seed) 中的seed求出来,即可得到答案
查看代码可知:
1 |
|
结合所给hint,第一次产生的伪随机数:
1 |
|
根据该串随机数结合源码中 $str_long1 可得到随机数出现的数字位置的一串编码
1 |
|
然后使用该编码 在 kali 中安装插件 php_mt_seed 使用特定格式即可爆出seed
1 |
|
seed:1314521 (注意php版本号)
然后写代码,在第521次出现的地方就是那个编号,提交即可拿flag