wtcl!打了这麽久ctf感觉还是个萌新!
官方writeup:https://github.com/USTC-Hackergame/hackergame2020-writeups
2048
在/static/js/html_actuator.js
看到

在控制台敲下
访问getflxg?my_favorite_fruit=banana
得到flag
一闪而过的 Flag
直接cmd运行就能得到flag
从零开始的记账工具人
把xlsx的两列复制出来粘贴到num.txt
找到这篇博客脚本:https://blog.csdn.net/gaoxing412836542/article/details/106302441/ 不乘上100会有精度问题
1 | package com.rock; |
我写的稍微有点问题 看下官方wp吧
首先使用 Excel(或者其他商业的、开源的、在线的电子表格工具)将下载的文件转换为 .csv
格式,即逗号分隔的文本
在 Python 中安装 cn2an 这个中文数字转换的库:
1 | python3 -m pip install cn2an |
然后使用 Python 程序处理这个文件:
1 | import cn2an |
最后输出的结果可能有一些浮点误差,自己四舍五入一下就好了。(更好的办法是使用整数来计算)
还有一种方法:
使用任意文本编辑器(或者 Excel 本身)做字符串替换,替换规则如下:
1 | '零' -> '' |
然后如果开头有乘号或者结尾有加号,去掉即可,这样的数学表达式求值即可得到正确的结果。太骚了2333
exp:
1 | sum=0 |
233 同学的 Docker
首先pull过来 镜像名字其实就有提示
1 | docker pull 8b8d3c8324c7/stringtool |
打包到本地
1 | docker save 8b8d3c8324c7/stringtool > flag.tar |
查找flag
1 | strings flag.tar | grep "flag{" |
普通的身份认证器
jwt 放到jwt.io提示签名算法是RS256
源码中有
后端框架使用的是 FastAPI,一个快速的 Python Web API 框架,文档地址:
FastAPI 会给网站自动生成 API 文档,路径在 /docs
。点开来查看之后,就能看到一个隐藏的 route /debug
,访问一下,就能看到它把公钥吐出来了
考察的是CVE-2017-11424
在非对称密码中,公钥确实是可以公开的。但是这就牵扯到了 JWT 格式的问题:它的签名算法除了支持 RSA 签名以外,还支持对称的 HMAC 签名(例如 HS256
),并且修改 JWT 中的签名算法只需要修改 header 的 alg
字段,并且通过某些方法,仍然让程序认为整个 JWT 是完好而未被篡改的即可。
在使用 RS256 时,程序的流程是:
- 使用私钥为 JWT 签名。
- 使用公钥验证接收到的 JWT 的完整性。
而在使用 HS256 时,程序的流程是:
- 使用密钥为 JWT 签名。
- 同样,使用这个密钥验证 JWT 的完整性。显然,这个密钥不能被泄露出来。
那么如果我们知道公钥,那么我们就能这么做:
- 接收到一个合法的,使用
RS256
签名算法的 JWT。 - 修改 JWT 的 payload 我们想要的样子,同时修改 header 的算法为
HS256
。 - 使用已知的公钥,以
HS256
算法重新签名我们修改后的公钥。 - 发给服务器。此时,服务器使用公钥 +
HS256
算法检查 JWT,发现没有问题,就会认为这是一个合法的 JWT。
目前的 JWT 库基本上都修复了这个问题。
PyJWT(以及其他很多 JWT 库)修复这个安全漏洞的方式是:当使用 HS256 encode/decode 的时候,检查密钥的开头是否是非对称加密的公钥,如果是,就报错。可以直接魔改 jwt/algorithms.py 把这一部分的校验去掉,也可以降级到有问题的版本(1.5.0)然后再跑 exp。
安装PyJWT
1 | pip3 install PyJWT==1.5.0 |
exp:
1 | import jwt |