当前位置: 首页 > news >正文

[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)

http://www.cnnetsun.cn/news/69890.html

相关文章:

  • AI编程革命!Claude Skills大揭秘:小白也能快速上手的Agent开发神器,大模型开发者必看!
  • 内点法求最优潮流附matlab代码
  • 三相PWM整流器有限集模型预测电流控制附Simulink仿真模型
  • 光伏四可“可观”功能:光伏电站全景数字化的底层支撑技术
  • 如何用FLUX.1-dev镜像在本地部署下一代AI绘画模型?
  • 基于 Comsol 移动网格方法的激光熔池流动数值模拟
  • BLDC无刷直流电机Matlab仿真:转速电流双闭环控制及有感无感换相方式研究
  • [光学原理与应用-491]:水冷机、零气模块CDA、功率计等影响266皮秒紫外激光器的种子源1064nm功率稳定性结果的主要因素有哪些?
  • 昆仑通态MCGS与欧姆龙E5CC温控器通讯实战:PID模式及输出启停控制
  • 通达信〖逆势突破强牛〗指标公式 逆市环境中率先突破前期重要压力位 较强内在上涨动力
  • 基于扰动观测器的永磁同步电机(PMSM)模型预测控制(MPC)仿真探索
  • AEB联合仿真算法设计:Carsim2019.0+Matlab/Simulink2021a实现...
  • Java毕设选题推荐:基于springboot个人博客系统的设计与实现基于SpringBoot+Vue个人博客系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot停车场车位预约系统基于Java springboot停车场管理系统停车位预约【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot的无人化、线上化、数据化海洋馆预约系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Ascend C高级API应用:InitGlobalMemory与Pad操作的底层原理
  • Java毕设选题推荐:基于Java Web的新能源汽车信息咨询服务基于SpringBoot+Vue的新能源汽车信息咨询服务的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:OPA 集成指南:从原理到实践
  • Object.defineProperty和Proxy实现拦截的区别
  • 若依物联网
  • PSEN1抗体:如何揭示阿尔茨海默病致病机制与治疗新靶点?
  • Docker Engine 升级指南:保障容器安全的关键步骤
  • 基于zigbee灯光控制照明及色温调节系统的设计与实现(有完整资料)
  • 7、Python高级语法:描述器、属性与元编程实战
  • 【开题答辩全过程】以 基于java技术的校园一卡通系统的设计与实现为例,包含答辩的问题和答案
  • 11、Python 包与应用开发全解析
  • django基于智能推荐算法的全屋定制平台网站设计
  • 详谈:解释器模式(四)
  • 双Buck电路并联下的下垂控制与VDCM协同控制策略:增强直流微电网稳定性的仿真应用
  • Java 日期格式化方法:SimpleDateFormat 和 DateTimeFormatter