1详细介绍
转自先知社区:https://xz.aliyun.com/news/10477
作者:Alpaca
0x01 前言
是之前对学校某个平台进行测试的时候发现的,还有不少高校在使用这个系统,洞还挺多的,审计之后交了cnvd,顺便写篇文章记录下。
0x02 逻辑缺陷
由于程序是基于SilverLight框架开发的,我们先找到ClientBin下的.xap文件,该文件是SilverLight编译打包后的文件
修改该文件后缀名为.zip并解压即可得到其中包含的文件
将USTCORi.WebLab.WebUI.dll文件使用dnSpy工具进行反编译,得到源码
程序在MainPage类中的MainPage()方法进行初始化,我们跟进到该方法:
首先使用InitializeComponent()函数启动基础组件:
然后使用GetSession()函数获取用户session,根据代码可以看到请求了一个.svc文件
根据我们登录时抓包获取到的数据得以验证是WLService.svc:
根据请求的文件名定位到文件WLService.svc
跟进该文件发现指定到已编译文件WLService.cs,进入该文件
程序首先对请求参数进行校验,要求BizName和ActionName都不为空,而且如果用户是执行的登录操作(即当BizName参数的值为”USTCORi.WebLab.BLL.BLLSystemUser” 且 ActionName的值为”CheckLogin”或”CheckLoginValue”时)会使用CheckTime()函数进行过期检查
跟进到CheckTime()函数:
代码第102行,读取程序所在目录/Image/cdx.bin文件,如果第一个符号位等于200则返回true继续。
使用winhex工具打开该文件发现第一个符号位确为200,故CheckTime()函数返回true。
完成“过期检查”之后从代码第48行开始,程序加载名为“USTCORi.WebLab.BLL”的程序集,创建实例,返回json序列化后的result结果。
所以要想知道登录验证的逻辑是如何的,我们就必须进入到USTCORi.WebLab.BLL这个程序集。
在bin文件夹下找到对应的USTCORi.WebLab.BLL.dll文件,使用dnSpy工具反编译得到源码,结合burp suite抓包到的BizName、ActionName参数值,我们定位到BLLSystemUser类下的CheckLogin()方法。
在代码第九行,先将param参数的值进行JSON反序列化,并用paramList变量接收,所以paramList[0]指向用户输入的用户名,paramList[1]指向用户输入的密码。代码第14、15行读取web.config文件中的配置:
由配置可知变量ValidatorUser = "xxxx公司",IsShowPhysic = “0”。
在代码第17行调用了CheckUserRight()函数对用户合法性进行了校验,这个函数是开发者用于进行系统正版验证的,由于这个站是开发公司自己的演示站,肯定是没有问题的,我们继续往下审计。
在代码第22行调用Dao层接口获取数据,我们跟进到CheckLogin()接口
可以看到,程序使用iBatis框架进行SQL查询,我们根据stmtId变量定位到iBatis配置文件SystemUser.BatisMap.xml,通过搜索”CheckLogin”找到对应的声明:
不难发现,程序通过构造类似SELECT * FROM SystemUser WHERE UserID = “用户名”的SQL语句进行查询,并在第22行使用listUsers变量接收,第23行,判断数据库中是否存在且仅存在一个该用户,如果失败返回null,在第27行,又判断用户输入的密码经过md5加密后和数据库中的密码哈希是否一致,不一致则返回null。
如果以上两个条件都完全符合的话,代码第33到41行,对在第16行创建的名为result的CMMUser实体类进行赋值后返回。
回到最开始的GetSession()方法:
在调用完WLService.svc后会同步对返回的结果进行验证:
首先使用JSON反序列化结果并转换为CMMUser对象,并将值赋给当前会话实例(即下图的CMMSession.User对象)
赋值完成后调用InitSow()方法,跟进该方法:
开始渲染登录成功后的界面
在代码第449行使用IsAdmin()方法判断是否是管理员:
我们进入WLConstants常量类,发现ROLE_ADMIN字段被定义为“1”
解读出程序逻辑:当前session中IsLogined参数为true,且UserType等于“1”就判定当前用户为管理员。
然而系统存在一个致命缺陷,响应包是可以借助burp修改的,也就是说在登录了一个普通低权限的学生用户之后我们可以通过修改响应包中的UserType字段为“1”达到越权成为管理员的目的。
漏洞验证:
登录默认学生账号student/123并抓包,选择修改响应包
可以看到默认学生用户登录成功,但是usertype字段为3,我们修改其为1
然后点击Forward放包
发现用户管理处增加了系统管理员才拥有的功能菜单,而且所有功能都可以正常使用:
而使用默认低权限学生用户登录时却没有这些功能点:
由此证明逻辑缺陷漏洞存在。
0x03 SQL注入
通过上面的简单审计,我们注意到系统使用了iBatis框架,.net的ibatis框架对sql注入已经做了不错的防护,但是往往由于开发人员的疏忽,仍然可能造成漏洞,比如在定义模糊查询的sqlmap时,如果开发者使用$进行拼接,而不是#,则会造成注入。
我们进入ibatis的xml映射文件,搜索LIKE字样来寻找
在SystemUser.BatisMap.xml中就找到一处。
为了验证漏洞能被利用,我们在dnSpy中全局搜索FindAllStudentByCondition这个id,定位到使用了该接口的函数
继而定位到触发该函数的功能点:
定位到“学生管理”处,抓包,将抓包内容保存为txt文件,由于是soap注入,将UserName参数值加上星号*,方便sqlmap识别
sql注入漏洞得以验证成功。
0x04 任意文件上传
在班级管理处点击数据导入按钮开始信息导入,
发现只允许
.xls和.xlsx文件,选择一个excel表格文件确定上传后在burp捕获到数据包
发现请求了WebClientExcelUpload.ashx,进入该文件
定位到WebClientExeclUpload类
不难看出,后端直接从GET参数获取文件名和保存的路径,而且没有任何的过滤措施,导致任意文件都可上传,且上传路径也可控。
上传aspx类型的webshell并通过burp修改文件后缀为aspx即可绕过前端验证,成功getshell
0x05 后话
刚开始审计的时候其实能够做到反编译就已经是一个重大突破了,这里需要了解到的知识是:1).xap文件是SilverLight编译打包后的文件。2)改后缀为zip就能得到里面的文件。3)使用工具dnSpy进行反编译。
接下来得到源码过后就是基本操作:一步一步看代码,总能找到突破点,一些类中方法的跟进,理解函数的意思,请求,以及抓包获得数据。这里是存在一个逻辑缺陷漏洞,这个漏洞其实不难避免,如果说在每个登录用户里加一个token,就能避免被恶意修改权限以及后面的拿到shell。
2免费社区
安全洞察知识图谱星球是一个聚焦于信息安全对抗技术和企业安全建设的话题社区,也是一个[免费]的星球,欢迎大伙加入积极分享红蓝对抗、渗透测试、安全建设等热点主题
原文始发于微信公众号(安全洞察知识图谱):记对某.net系统的审计
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论