前言
同事昨天给了我一个站,顺便还找了到了源码,让我看看。这个网站有管理员登录、教师登录和学生登陆,我从最薄弱的学生登陆下手。
我各种123456、123456789、123123、666666各种弱口令一顿怼,但是都不对,所以我把目光放到了源代码里,看看能不能找到初始化sql文件。
一看这个叫学生导入模板的文件,我吐血了,默认密码是12345,我tm。。。。
进去之后发现了一个叫个人网盘的东西,那这感觉冥冥之中就是个超级无敌的上传点呀。二话不说,上传木马。
哦豁,还挺硬。。。。
正文
源码寻找篇:
访问该系统的开发者网站,最近还在更新,但是手里的这个应该用的不是最新版本。而同事给我的源码属于很久之前了,在对照目录访问的时候发现很多目录对不上号,于是猜测同事的源码和这个系统目前的版本也不符合。
浏览目录寻找到能说明版本的文件。
找到了对应版本那么就要下载对应的源码审计就ok了。
.net代码审计篇
鄙人在审计代码的时候有个习惯,那就是先从未授权登录开始审计,正所谓百善未授权登录为先。鄙人这招屡试不爽,在沙场上也是战功赫赫。
很快啊,我上去就是打开一个管理员登录页面,明显是有备而来。这里可以看到管理员认证页面
这里我用的是.NET Reflector 8.5,点击放大镜搜索Manager_index,定位到对象展开就可以愉快的开始审计了
接下来查看页面加载的函数page_load
可以看到page_load函数调用了CookieHelp.JudgelsAdmin()函数,从名称之中我们就可以判断这个函数的作用是判断用户身份是不是admin,如果是的话接来下会将title设置为系统设置页面,那我们就要进入CookieHelp.JudgelsAdmin()函数去看一看能不能从这里搞点事情。(因为一场意外,我搞到了这个系统的未编译版本,所以后边就没继续用.NET Reflector,直接用vscode打开了。。。)
从代码中可以看到,JudgeIsAdmin函数先判断mngCookieNname这个cookie的值是否为空,如果为空则跳出,不为空再判断Hs和Hid
也就是说judgeIsAdmin()函数是通过cookie来验证用户身份的。此时我已经逐渐的感觉到了未授权登录的气息,也就是说我只要搞到管理员的cookie就可以伪造管理员身份去登录了,那我们的关注点就要移动到mngCookieName上,去看看这个cookie是怎么设置的。
在SetManagerCookies函数中,可以清楚的看到Hid和Hs是怎么设置的,但是我们这里还要注意,TCookies这个对象是一个含子键的cookie,格式其实是
{
mngCookieNname:{
Hid:value
Hs:value
…….
}
}
也就是说我们只知道Hid和Hs是不行的,我们还要知道mngCookieNname这个cookie键的具体值是什么(Hs就是Hid的md5,关于Hid怎么获取稍后再讲)
这里我移步mngCookieNname对象,来看看mngCookieNname是怎么设置的
这里我们可以看到无论是stuCookieNname还是mngCookieNname,只不过是开头第一个字母不同,后面的tempcfx怎么来的我们根本不用去操心,那么我们之前已经得到了学生的账号密码,也就等于有了stuCookieNname的值,有了stuCookieNname,那我们只要将这个cookie开头的首字母S改成M,就等于获得了mngCookieNname的值。
打开火狐,F12到存储查看cookie值,拿到了学生用户的cookie,所以到现在等于mngCookieNname的值我们已经有了,那接下来就是获取Hid了,Hid有了Hs自然就有了。这里我猜测Hid应该是管理员在数据库中的id,一般管理员都是1,那么直接将Hid设置为1,Hs设置为1的md5,然后粘贴到cookie这里。
直接bingo
其实我真的只想要你的管理员权限
改进建议:不要使用cookie校验用户身份
来源:freebuf.com 2020-12-17 14:14:34 by: flyingdemon
请登录后发表评论
注册