1.打开是一个欢迎界面
然后点击这个read something会跳转到这个页面
看到这个https://baidu.com,知道这里是可以 ssrf的,使用file看一下
发现触发了waf,使用其他的试一试,最后发现 直接加路径也能进行访问
还有一种方法就是使用local_file也能进行读取
local_file通常指的是本地文件路径
看到这个read,感觉可能是使用的路由为read,那么盲读一下app/app.py,这是flask的常用源码路径
读取到了源码
2.分析代码
首先是导入了一些模块
re:用来进行正则匹配
random:伪随机数生成器
uuid:用于获取机器标识(uuid.getnode()返回网卡MAC地址)
urilib:用于发送HTTP请求并读取响应(用于urlopen)
这里使用的是python2的urllib,python3的是urllib.request
从flask导入Flask(创建应用)、session(Flask session)、request(请求对象)
创建Flask应用实例,__name__用于模板/静态路径解析
使用uuid.getnode()返回一个整数的MAC地址,然后用MAC地址初始化随机数生成器
再利用random.random()生成一个0~1之间的伪随机小数,再乘以233并转换字符串作为flask的secret_key
启用falsk的调试模式
一个根目录路由
定义了一个index函数
会将session中的username的值设置为www-data
然后返回一个hello world加上一个外链
一个/read路由
定义了一个read函数
然后获取他get传参的url参数的值,赋值给url
然后使用正则匹配,匹配url中是否以file协议或以file开头,不区分大小写,然后将值赋值给m
再使用正则匹配,检查url中的flag字段不区分大小写,然后将结果赋值给n
然后if判断m或者n中有一个为true,就返回no hack
下面是一个向url发送HTTP请求并读取响应,然后将值赋值给res,再返回read读取res的值
定义了一个/flag路由
里面定义了一个flag函数
if检查session中的username的值为fuck,那么就打开/flag.txt并进行阅读,然后使用return返回出来,否的话就回显一个没权限
3.思路分析
首先是看到他这里面有一个secret_key是可以自己构造的,结构为用生成的MAC地址初始化随机数生成器,再将random.random()生成的0~1的伪随机数小数,乘一个233,并转换为字符串就是他的secret_key,这里MAC地址通常出现在这几个路径下
file:///sys/class/net/eth0/address
file:///sys/class/net/ens33/address
file:///sys/class/net/enp0s3/address
file:///sys/class/net/wlan0/address
发现为ce:d0:15:29:3e:5c
然后按照他里面的生成方法给进行一个伪造secret_key
首先就是先random.seed使用这个进行一个伪随机数初始化,这里的MAC地址要变成为十六进制,然后再利用random.random生成0~1的随机数乘一个233,注意!!!,这里环境使用的是python2,所以运行这个代码的时候要使用python2运行
因为python3和python2的生成精度不同,生成出来的值也不同
python3
python2
这里使用python2生成的种子值,来当成secret_key
伪造出密钥了以后,就是看需要伪造什么了,看到数据包中session是一段以ey开头并且使用点号分为三段,那么指定值JWT加密了,那么使用这个密钥进行一个解密
可以看到成功解出值,那么就是可以开始最后的构造了
4.开始构造
题目要求是username的值为fuck,再访问/flag就能得到flag,那么进行一个伪造
这个时候直接复制上面解密出来的{'username': b'www-data'},然后将里面的www-data修改为fuck
最后将其替换上去,再访问/flag得到flag
5.知识点
从这题中又学到了一个local_file也能进行一个ssrf的文件读取
local_file:local_file通常指的是本地文件路径,他在ssrf中,也能进行一个伪造请求的方法,用以读取本地文件的路径
还有就是
python2的发送HTTP请求并读取响应是urllib
python3的发送HTTP请求并读取响应是urllib.request
JWT伪造
JWT他是由三部分组成,分别是头部、载体、签名
通常用于身份验证,也可以用于交换信息
参考文章:
https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
https://www.cnblogs.com/ityouknow/p/10856177.html(cookie和session)