freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

.net代码审计之我真的只想要管理员权限
2020-12-17 14:14:34

前言

同事昨天给了我一个站,顺便还找了到了源码,让我看看。这个网站有管理员登录、教师登录和学生登陆,我从最薄弱的学生登陆下手。

我各种123456、123456789、123123、666666各种弱口令一顿怼,但是都不对,所以我把目光放到了源代码里,看看能不能找到初始化sql文件。

1608182106_5fdae95a45f979a460adb.png!small?1608182105564

一看这个叫学生导入模板的文件,我吐血了,默认密码是12345,我tm。。。。

1608182169_5fdae999ac4f5e9a770a7.png!small?16081821688921608182273_5fdaea01edcc5e200d16f.png!small?1608182273266

进去之后发现了一个叫个人网盘的东西,那这感觉冥冥之中就是个超级无敌的上传点呀。二话不说,上传木马。1608182319_5fdaea2f669df83e3b8ae.png!small?1608182318595

哦豁,还挺硬。。。。

正文

源码寻找篇:

访问该系统的开发者网站,最近还在更新,但是手里的这个应该用的不是最新版本。而同事给我的源码属于很久之前了,在对照目录访问的时候发现很多目录对不上号,于是猜测同事的源码和这个系统目前的版本也不符合。

浏览目录寻找到能说明版本的文件。1608182695_5fdaeba71a237c1810f84.png!small?16081826946021608182739_5fdaebd32b793184c5089.png!small?1608182738685

找到了对应版本那么就要下载对应的源码审计就ok了。

.net代码审计篇

鄙人在审计代码的时候有个习惯,那就是先从未授权登录开始审计,正所谓百善未授权登录为先。鄙人这招屡试不爽,在沙场上也是战功赫赫。1608182901_5fdaec75570f6e17a0417.png!small?1608182900623

很快啊,我上去就是打开一个管理员登录页面,明显是有备而来。这里可以看到管理员认证页面

inherits="Manager_index“,那我们直接就去dll文件中寻找Manager_index,看看到底能不能发现啥东西。

1608183027_5fdaecf3ca369e57658ce.png!small?1608183027024

这里我用的是.NET Reflector 8.5,点击放大镜搜索Manager_index,定位到对象展开就可以愉快的开始审计了1608183336_5fdaee288a25a2f69c957.png!small?1608183335913

接下来查看页面加载的函数page_load1608183484_5fdaeebcb9f7389a9f0a8.png!small?1608183484030

可以看到page_load函数调用了CookieHelp.JudgelsAdmin()函数,从名称之中我们就可以判断这个函数的作用是判断用户身份是不是admin,如果是的话接来下会将title设置为系统设置页面,那我们就要进入CookieHelp.JudgelsAdmin()函数去看一看能不能从这里搞点事情。(因为一场意外,我搞到了这个系统的未编译版本,所以后边就没继续用.NET Reflector,直接用vscode打开了。。。)1608183691_5fdaef8b6c4286cd6dce7.png!small?1608183690654

从代码中可以看到,JudgeIsAdmin函数先判断mngCookieNname这个cookie的值是否为空,如果为空则跳出,不为空再判断Hs和Hid


也就是说judgeIsAdmin()函数是通过cookie来验证用户身份的。此时我已经逐渐的感觉到了未授权登录的气息,也就是说我只要搞到管理员的cookie就可以伪造管理员身份去登录了,那我们的关注点就要移动到mngCookieName上,去看看这个cookie是怎么设置的。1608183992_5fdaf0b81031ab7d54f3b.png!small?1608183991282

在SetManagerCookies函数中,可以清楚的看到Hid和Hs是怎么设置的,但是我们这里还要注意,TCookies这个对象是一个含子键的cookie,格式其实是

{

mngCookieNname:{

Hid:value

Hs:value

.......

}

}

也就是说我们只知道Hid和Hs是不行的,我们还要知道mngCookieNname这个cookie键的具体值是什么(Hs就是Hid的md5,关于Hid怎么获取稍后再讲)

这里我移步mngCookieNname对象,来看看mngCookieNname是怎么设置的1608184452_5fdaf284cc6e375623c62.png!small?1608184451981

这里我们可以看到无论是stuCookieNname还是mngCookieNname,只不过是开头第一个字母不同,后面的tempcfx怎么来的我们根本不用去操心,那么我们之前已经得到了学生的账号密码,也就等于有了stuCookieNname的值,有了stuCookieNname,那我们只要将这个cookie开头的首字母S改成M,就等于获得了mngCookieNname的值。1608184696_5fdaf378b0831cbef8ce9.png!small?1608184695993

打开火狐,F12到存储查看cookie值,拿到了学生用户的cookie,所以到现在等于mngCookieNname的值我们已经有了,那接下来就是获取Hid了,Hid有了Hs自然就有了。这里我猜测Hid应该是管理员在数据库中的id,一般管理员都是1,那么直接将Hid设置为1,Hs设置为1的md5,然后粘贴到cookie这里。1608184988_5fdaf49c9d810fa5a12f6.png!small?1608184988054

直接bingo

1608185053_5fdaf4dd2dac8ed39d646.png!small?1608185052404

其实我真的只想要你的管理员权限

改进建议:不要使用cookie校验用户身份

# 渗透测试 # 代码审计 # .Net
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者