[HCTF 2018]admin 1
网上学习了几种方法
方法一:弱口令爆破
先随便注册一个账号登录
查看一下各个页面的源代码,找到提示
可能需要登录一下admin账号
登录界面输入admin密码随便,抓包,发送给intruder,添加爆破位置
添加字典开始爆破
登录后展示flag
方法二:flask session伪造
同样再前端源代码中找到提示
去github上下载
打开源码,找到index.html,发现确实是当为admin用户时就会输出flag
Flask 是一个轻量级的 Python Web 框架,用于快速开发 Web 应用程序和 API。它被称为“微框架”(Microframework),因为它核心简单且可扩展,不强制依赖特定的数据库、模板引擎或其他组件,开发者可以按需选择插件。
Flask 的 Session 存储在客户端 Cookie 中,Flask 默认将 session
数据(如用户登录状态、临时数据等)直接存储在客户端的浏览器 Cookie 里,而非服务端数据库。客户端可以自由查看或修改 Cookie 内容,存在被伪造或篡改的风险。
Flask 使用 HMAC
(密钥散列算法)为 session
数据生成一个签名,并将签名与数据用 .
拼接后存入 Cookie。签名目的是防篡改:服务端收到 Cookie 后会重新计算签名,若数据被篡改(如用户手动修改 Cookie),签名验证会失败,Flask 会拒绝该请求。数据本身是明文(实际是 Base64 编码,可轻松解码还原),客户端可以完全读取 session
的内容(如 {'user_id': 123}
)。签名仅确保数据完整性,不保护隐私。
上边的意思是再浏览器中获取session后将其解密,修改其中内容再加密替换原有session,就能实现提权
解密脚本:
#!/usr/bin/env 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()))
运行
修改name:1—>admin
加密脚本:网上找的
https://github.com/noraj/flask-session-cookie-manager
伪造session还需要密钥。在config.py里面发现密钥为ckj123
放入session
拿到flag
方法三:Unicode欺骗
原文链接:BUUCTF | [HCTF 2018]admin - 东坡肉肉君 - 博客园
https://unicode-table.com/en/1D2E/ ,在这个网站上找字符。
1.先注册一个账号 :ᴬᴰᴹᴵᴺ,密码:456
2.修改密码:111,然后退出
3.用账号”admin“,密码:111成功登录
大致的思路是:在注册的时候 ”ᴬᴰᴹᴵᴺ“ 经过strlower(),转成”ADMIN“ , 在修改密码的时候 ”ADMIN“经过strlower()变成”admin“ , 当我们再次退出登录的时候 ”admin“经过strlower()变成”admin“(没啥卵用,但是你已经知道了一个密码已知的”admin“,而且在index.html中可以看到只要session['name']=='admin',也就是只要用户名是’admin‘就可成功登录了)