news 2026/3/1 16:01:00

[CISCN2019 华东南赛区]Web4

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[CISCN2019 华东南赛区]Web4

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)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 1:46:59

【单片机毕业设计】【dz-960】基于云服务的家庭远程监测系统设计

一、功能简介项目名:基于云服务的家庭远程监测系统设计 项目编号:dz-960 单片机类型:STM32F103C8T6 具体功能: 1、监测到人且密码正确进行开锁; 1、通过光照监测模块监测当前环境的光照,监测到光照小于最小…

作者头像 李华
网站建设 2026/2/28 7:59:09

ARM 汇编指令:LDR

ARM 汇编指令:LDR LDR 在 ARM 汇编中是 Load Register 的缩写,即 “加载数据到寄存器”。 你可以把它理解为 C 语言等高级语言中的 “读内存” 或 “指针解引用” 操作。 核心功能 从一个内存地址中读取数据(一个或多个字节)&…

作者头像 李华
网站建设 2026/2/27 19:30:22

探索FDTD超材料吸收器的吸收光谱奥秘

FDTD超材料吸收器吸收光谱在当今科技飞速发展的时代,超材料以其独特的性质吸引了众多科研人员的目光。其中,FDTD(时域有限差分法)超材料吸收器的吸收光谱更是研究的热门领域。今天,咱们就一起来深入探究一番。 什么是F…

作者头像 李华