[HCTF 2018]admin 1学习笔记

之前在云演做ctf题,虽然简单但比较系统,感觉比较适合新手,但也要练一下有点难度的ctf,所以又做了一下buuctf,果然上来就是sql注入,xss注入,发现没什么效果,然后跑去看大佬writeup,真是看一次,学一次,自己也有总结。
做这个题有三种方法,首先非预期解分别为session伪造、弱口令,预期解为Unicode欺骗。
1 首先讲讲session伪造:
因为之前做过一段时间的python的flask后台开发,所以对于session跨域还是比较了解的,但对于新手来说,还是有点不好理解的,所谓通俗一点,就是你在这一个窗口打开的多个页面共用一个session,每个页面算一个域,每个session一般存放这个用户的个人信息,但一般是通过加密并且加了salt的,所以这里的问题是,我们怎样将session解码并且修改用户信息改为admin。

这里我们先通过随便创建一个用户,然后再在change password页面看f12的源码,你会发现这整个页面的源码链接,在github上。

[HCTF 2018]admin 1学习笔记

然后我们跳转到github上查看源码,进行分析。
[HCTF 2018]admin 1学习笔记
由上图可知,我们的session有选项为name,而后面又靠name来查user,以此来判断是否为admin用户,所以我们需要修改name选项的内容为admin。

那现在的问题是我们怎样获取session,又怎样解密修改后再加密传输获取admin权限呢。

1)首先获取session简单,直接f12查看网络分析就可以找到对应的session。
2)然后对session进行解密,需要编写脚本,我能力还不够,所以这里我推荐一个github上的一个大佬的脚本,很好用,以后也可以方便使用。
Flask Session Cookie Decoder/Encoder
这个脚本我是放到kali上使用的
首先先解释一下怎样使用,这是一个对flask的session的解密与加密工具,直接下载压缩包到kali上,解压,然后右键从命令行打开。
这个是个python的工具,我使用的是python3
session加密操作:

python3 flask_session_cookie_manager3.py encode -s <这里填写salt也就是secret key> -t <这里填要加密的密文>

session解密操作:

python3 flask_session_cookie_manager3.py decode -s <salt也就是secret key> -c <要解密的密文>

这里我要讲一下secret key(也就是salt),在flask里,session不仅通过加密算法加密,还需要在加密的密文里加一下用户自定义字符串(就随便生成的字符串),这样可以保证session更加具有安全性,反正黑客窜改信息,因为session一般都保存用户的信息,来进行持续登录,所以我们也需要找一下这个源码的secret key,一般存放在config.py里,如图
[HCTF 2018]admin 1学习笔记
可以看到这里的secret 可以为ckj123,使用上面的-s选项里就是cjk123。操作如下
[HCTF 2018]admin 1学习笔记
可以看到这里的name后面为1234,也就是我们的用户名,我们要改为admin再加密。
[HCTF 2018]admin 1学习笔记
然后我们通过抓包,将里面的session改为我们生成的session就可以得到flag了。
[HCTF 2018]admin 1学习笔记
2、接下来是Unidcode欺骗。
这个我也是看了大佬的,自己总结了一下,就是世界上有很多语言,那你用个小语种来写admin进行注册,说不定就可以成功注册了,因为之前不是已经注册过admin了吗,但不知道密码。当然这个方法需要特点环境下使用。
这里同样需要审计源码
[HCTF 2018]admin 1学习笔记
[HCTF 2018]admin 1学习笔记

这里通过网上搜索可以知道strlower的nodeprep.prepare()是用来将大写字母变为小写,但这有个bug,就如果我们提交ᴬdmin,会变成Admin,这里就可以绕过第一次admin的注册检测。

[HCTF 2018]admin 1学习笔记
然后查看源码,发现change password里也用了一次strlow(),然后我们可以通过刚刚的注册后变为Admin,然后再通过change password,将Admin变为admin,然后再修改密码,成功后就会获取flag
[HCTF 2018]admin 1学习笔记
3、弱口令
用户admin
密码123
可以通过暴力破解很简单获取。

上一篇:Flask TypeError: Object of type int32 is not JSON serializable


下一篇:1.7 起步 - 获取帮助