代码审计 | SiteServerCMS身份认证机制

来源:岁月联盟 编辑:猪蛋儿 时间:2020-03-16
有了secretKey和IV就可以本地去加密数据,然后远程下载文件GetShell和计算管理员accessToken登录后台,加密算法python3实现:
def encrypt(msg, key, iv):
    pad = 8 - len(msg) % 8
    for i in range(pad):
        msg = msg + chr(pad)
    obj = DES.new(key, DES.MODE_CBC, iv)
    buf = obj.encrypt(msg)
    txt = base64.b64encode(buf).decode()
    txt = txt.replace('+','0add0').replace('=','0equals0').replace('&','0and0')
    txt = txt.replace('?','0question0').replace("'",'0quote0').replace('/','0slash0')
    txt = txt + '0secret0'  # v6.x
注意: 这里讲的版本划分只是大概版本,具体是哪个小版本开始是随机生成和改变存储位置,有兴趣的自个查一下。
3.3 Cookie 构造
前面讲到5.x版本密钥是固定的,可以用密钥构造Cookie直接登录后台,比如:CNVD-2018-00712,这里不展开说了,那有没有不用密钥的呢?
开始是从登录框说起,那么就以登录框结束吧,我再讲二分钟。。。一个不用获取密钥登录后台的栗子。
还记得前面的accessToken生成过程和Cookie身份认证中所用到的参数么?是不是都没有口令参数,都只用到了UserId和UserName?
还记得前面提到的前台和后台是分离的么?也就是管理员和会员各用一张数据表。
然而数据是加密的,有啥用?
注意到前面登录成功返回那数据包没有,UserId是整型递增的。
那么,在前台注册一个用户名与后台管理员用户名一样的用户,只要使其UserId和Username相等,是不是Cookie的关键信息是一样的。
我们来打开前台会员中心试一下:
http://192.168.56.5:801/home/pages/login.html
注册一个名为adzroolsmin用户,然后登录,查看Cookie:

SS-USER-TOKEN-CLIENT是没加密的,SS-USER-TOKEN是加密的,还记得前面发送Cookie时管理员的名称是什么了吗?SS-ADMIN-TOKEN,那么,我们直接修改一下,然后访问后台管理员页面(为什么不选择直接跳转控制台主页/SiteServer/main.cshtml?那是另一个故事了):
http://192.168.56.5:801/SiteServer/settings/admin.cshtml

直接跳进了后台管理页面,管理员ID往往是1,再多几个管理员也还是个位数,前台注册低位ID也是个迷,利用条件是不是很鸡肋,其实5.x版本里的accessToken是没有Userid这个字段的,然俄。。。
四、 最后
如今在身份鉴别模块能利用万能密码去登录的已不多见,更何况有着各种WAF,而今出现的身份鉴别模块的漏洞更倾向于逻辑类型,有时还需通过多种漏洞组合去利用。在平时做代码审计的时候往往需要耐心,也需要细心,很多时候两个看起来没什么问题的功能,遇到一起就擦出了火花,就像上面的Cookie构造里的栗子。
故事讲完了,下课,咱有缘再见。。。 -_-#
完整版脚本传送门: https://github.com/zrools/tools/tree/master/python
 

上一页  [1] [2] [3]