[HCTF 2018]admin——Unicode欺骗

F12查看源代码

<!-- you are not admin -->

猜测获取flag的条件是以admin的身份登录

注册账号登入后,在重置密码页面发现提示

下载源码后,查看一下路由,登录,改密码,退出,注册等等,也没做什么处理

@app.route('/index')
def index():
​
@app.route('/register', methods = ['GET', 'POST'])
def register():
​
@app.route('/login', methods = ['GET', 'POST'])
def login():
​
@app.route('/logout')
def logout():
​
@app.route('/change', methods = ['GET', 'POST'])
def change():
​
@app.route('/edit', methods = ['GET', 'POST'])
def edit():

但是在route.py内,不管是login、register还是change页面都发现了一个问题

仔细去看代码,发现这样一句

strlower会将所有字母转化为小写,但是python内自带转换小写的lower()函数,这里为什么需要特地构造一个strlower?

在关于strlower函数的定义里用到了,nodeprep.prepare函数

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

对于nodeprep.prepare函数,需要在twisted库下使用,到目前已经更新到了21.2.0(21/10/16),而题目使用的是10.2.0的,对已经有了更高版本,一般会存在一定的漏洞

就像PHP版本一样,低版本的也存在各种各样的漏洞

查看一下关于这个函数的漏洞,这里存在unicode编码的一个问题【ᴀʙᴄᴅᴇꜰɢʜɪᴊᴋʟᴍɴᴏᴘʀꜱᴛᴜᴠᴡʏᴢ

https://unicode-table.com/en/blocks/phonetic-extensions/

当使用了nodeprep.prepare()函数之后,如果先使用unicode编码的字符,如 ᴬ ,使用该函数之后,会先改为大写的A,再使用一次就会变成小写的a。

步骤:

首先使用 ᴬdmin这个用户名进行注册 ,注册之后,进去就会变成 Admin

登录ᴬdmin用户

然后改密码,随便改一个密码,改密码之后,再次经过nodeprep.prepare()函数,就可以将username变成admin了

最后退出,重新以admin的身份进行登录,即刻得到flag

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值