这个题我在网上搜了一下wp,一共有三种解法,我用的是稍微简单的一种
Unicode欺骗
首先这是我们的题目环境,简单的看了一下,只有注册和登录功能
先登陆进去查看一下功能
在change password这里能够看到源码泄露
代码审计一下
不管是login、register还是change页面,只要是关于session['name']的操作,都先用了strlower函数将name转成小写,但是python中有自带的转小写函数
lower
,这里重写了一个,可能有点猫腻,于是找到strlower函数的定义这里用到了
nodeprep.prepare
函数,而nodeprep是从twisted模块中导入的from twisted.words.protocols.jabber.xmpp_stringprep import nodeprep
,在requirements.txt文件中,发现这里用到的twisted版本是Twisted==10.2.0
,而官网最新版本为19.2.0
(2019/6/2),版本差距这么大,估计是存在什么漏洞,于是搜索一下nodeprep.prepare
,找到一篇unicode安全的文章,https://paper.tuisec.win/detail/a9ad1440249d95b这里原理就是利用nodeprep.prepare函数会将unicode字符
所以当我们用
ᴬ
转换成A
,而A
在调用一次nodeprep.prepare函数会把A
转换成a
。所以当我们用
ᴬdmin
注册的话,后台代码调用一次nodeprep.prepare函数,把用户名转换成Admin
,我们用ᴬdmin
进行登录,可以看到index页面的username变成了Admin
,证实了我们的猜想,接下来我们就想办法让服务器再调用一次nodeprep.prepare函数即可。然后直接通过admin登录,得到flag