记一次CNVD通用漏洞审计

本文转载于:https://www.freebuf.com/articles/web/290697.html

0x01 前言

写这篇文章的缘由其实还挺魔幻的,起因是在一次实战渗透时通过弱口令拿下一个低权限用户成功进入后台,在后台寻找功能点通过抓包分析,定位到目标系统后台存在SQL注入,通过os shell拿下内网之后闲着无聊就谷歌了下,发现这个系统的开发商是某某公司,同时cnvd也没有收录该产品,于是想着能不能捡漏搞个cnvd证书。

碍于信息检索能力太差,只收集到屈指可数的几个url,而且这几个系统都没有弱口令可以进入后台,因为进不了后台,就猜测后台的功能也都无法使用,漏洞无法复现,于是在知道肯定过不了的情况下还是硬着头皮只交了几个url上去(没记错通用漏洞需要至少3个以上验证成功漏洞案例),结果果不其然,三审的时候给我驳回了。

不甘心,案例找不出来,我把代码审计一遍还不行吗?于是就通过webshell打包了一份代码(因为是.net的站,就只打包了bin包下来),于是便有了这篇文章。

0x02 漏洞利用

还是先简单聊聊sql注入如何拿下内网的吧。(以前的一次实战,没有截图,脑补一下,见谅)

漏洞点抓包

尝试直接sqlmap拿下--os-shell,苦于没有绝对路径,就尝试百度看看还有没有其他漏洞,然而网上资料几乎没有,就在要放弃的时候从百度文库中找到一线希望,找到了该系统的使用说明,从说明书中得知系统的mysql数据库安装路径和web路径在同一目录下,于是通过--sql-shell使用

select @@datadir

获取到mysql的安装目录,同时也就获得了web目录,最后就可以直接--os-shell了。

拿到os-shell之后先tasklist,没有杀软,不需要免杀;ping了下发现服务器出网,基础操作certutil下载msf马上线,先用msf上传一个web shell到网站目录(感觉拿到web shell后要放心点)。看了下权限,system,不用提权了;看了下systeminfo,08的机器,load kiwi模块,读取明文密码;netstat看下3389端口,没开启,用注册表开启。msf起socks代理,mstsc远程连接之。net view看了下没有域,上传fscan进行内网资产扫描,同时在桌面看到WinScp软件,而且其中还保存着好几台内网服务器,都是root权限,试了试都能连接上。这里我下了个星号密码查看器传上去,想获取它们的明文密码,结果失败了。谷歌了下,发现WinScp配置默认加密保存在注册表中,可以修改保存方式为ini文件并用工具破解其密码,于是修改之后dump到本地通过工具get到密码。

另一边fscan扫到了两台服务器的弱密码,还有几台有redis未授权漏洞,都可以写私钥登录。

此外,从sql备份文件中又找到另外平台的账号密码。

0x03 代码审计

从webshell的文件管理处定位到漏洞文件Default.ashx,可以看到调用了UserInfo.Default这个类。

在bin包中找到对应dll文件,使用dnSpy反编译得到源码,开始审计。

结构如下:

首先全局搜索一下session关键字,没有发现。再在所有外部引用中搜索session关键字,还是没有发现,是个好兆头,说明系统可能没有对session进行验证。

代码第20行,定义ProcessRequest方法并将http请求体作为该方法的参数传入,并在第22行定义httpCookie变量存储当前cookie中键名为"WCMS.User"的数据,可以看到在代码第23行,程序只进行了三种判断,cookie不为空,cookie中UserID不为空且RoleID也不为空

只要满足上述三个条件,程序就会继续处理请求,否则才返回204代码报错。

这里由于身份校验不严,导致攻击者可以在没有后台管理员权限的情况下也能执行相应操作。审计到这里我兴奋起来了,因为之前担心系统会对session进行判断就没有对另外几个站点进行复现,导致cnvd提交被驳回,然而现在完全不需要担心了,因为系统根本就没有对session进行验证,只需要修改http请求中的host参数就可以实现漏洞的批量利用。

但是审计到这里还没有结束,我们继续对sql注入漏洞的成因进行分析。

在代码第32行,对action参数进行判断,我们根据payload中的Read值,跟进到GetData()函数

从代码第190行,不难看出该函数并未对参数进行过滤,只进行了是否为空的判断

在代码第197行程序还进行了RoleInfoID的校验,担心这里可能会要求提供服务器中存在的id导致身份鉴权失败,我们着重分析下这里

定义一个text变量接收结果,如果在http form表单中不存在RoleInfoID,就调用Lib.CommonFunction类中的GetRoleID()方法进行获取,我们跟进后发现程序仍然只判断了cookie是否存在,只有当cookie不存在时才会返回为空,导致代码第198行判断为假进而导致api返回为空

如果cookie存在,会调用DESDec()函数将cookie中RoleID的值进行DES解密,并将结果保存以待后用。

这里我根据源码用c#重写了下解密过程,并将payload中的RoleID用于解密,结果最后是乱码(可能是我代码没写对的锅...)

然后我用在线的DES工具解密出来又是正确的...(蚌埠住了,我写的代码就是屎呜呜呜)

然后我们再回到GetData()函数,代码第186行通过Lib.Factory类中的CreateUserInfo()函数创建了DBHelper对象,并在第205行调用了GetItems()函数

通过分析发现IDBHelper接口由Mysql.DBHelper类实现,跟进到DBHelper类的GetItems()函数进行分析

代码第302行,使用for循环遍历之前text变量中的值,构造sql语句,使用where in语法对查询结果进行限定。同时,我们注意到,搜索关键字keyWords到目前为止仍未进行任何的过滤,而且后续通过分析,发现开发者也未在全局使用预处理和参数化,导致keyWords参数易于受到攻击。

综上,虽然RoleID会用于获取子账号ID,然而如果数据库中不存在该RoleID的用户也没有关系,因为我们的攻击方式是基于时间的盲注,即使数据库查询返回为空,也不妨碍我们通过时间比较进行攻击。因此可以下定结论,该漏洞在未经授权就可被利用。

整个流程如下图所示:

0x04 后话

细心细心细心!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机管理里边如何分盘,如何给电脑分盘【设置门径】

很多小伙伴都遇到过如何给电脑分盘的困惑吧,一些朋友看过网上零散的如何给电脑分盘的处理方法,并没有完完全全明白如何给电脑分盘是如何解决的,今天小编准备了简单的解决办法,只需要按照1:首先我们找到电脑里面的此电脑…

电脑常识——host文件修改(屏蔽网站或解开屏蔽)

1. 什么是host文件: Hosts文件主要作用是定义IP地址和主机名的映射关系,是一个映射IP地址和主机名的规定。可以用文本文件打开!当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址&#xff…

glassfish_具有GlassFish和一致性的高性能JPA –第3部分

glassfish在我的四部分系列的第三部分中,我将说明将Coherence与EclipseLink和GlassFish结合使用的第二种策略。 这就是通过EclipseLink使用Coherence作为二级缓存(L2)的全部内容。 一般的做法 这种方法将Coherence数据网格应用于依赖于数据库…

应广大粉丝的要求,推荐几本前端书籍

这些书籍平时会直接发送在主页的QQ技术群,有兴趣的可以加一下。 不想去培训机构,不想花大笔钱的学习,那就自学吧!接招

java的数据结构

本文转自互联网 1、二叉树:非线性数据结构,常被用于实现二叉查找树和二叉堆 二叉树的第i层至多有2的 i -1次方个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二叉树T。 满二叉树 完全二叉树 平衡二叉树 2、 二叉树的遍历…

AssertJ的SoftAssertions –我们需要它们吗?

编写好的单元测试的规则之一是,它应该出于某种原因而失败,因此,单元测试应该测试一种逻辑概念。 有时很难在每个测试中拥有一个断言。 为了遵循规则,我们可能在一个测试中每个对象具有多个断言。 但是,在单个测试中存…

早上起来CSDN的PC端主页积分变成了0

没有违法,没有乱纪,这是什么鬼?我刚才百度了一下,很多大牛都有类似的经历,心里舒服多了 平台BUG还是挺多的,说不准哪天就轮到你啦,哈哈!!

Fofa搜索技巧

Fofa搜索技巧(理论加实践的整理) 题记 最近在整理以前的知识,不过最近出现职业病了,打开fofa看站点就停不下来。我把常用的fofa查询语句记录下来,方便查阅。钟馗之眼和他有区别也异曲同工。 https://fofa.so/ http://…

魔兽世界阿拉索人数最多服务器,魔兽世界8.3哪个区人多_wow8.3服务器人数统计介绍_3DM网游...

魔兽世界8.3人口最多大区是很多玩家都非常关心的一件事情,很多玩家都想在这个新版本去最多的服务器,很多玩家都想知道服务器人口,来看看魔兽世界8.3哪个区人多,wow8.3服务器人数统计介绍。8.3人口最多大区介绍魔兽世界8.3安苏大区…

如何系统的学习javaScript?赶紧看看吧

当今如果要开发现代网站或web应用(包括互联网创业),都要学会JavaScript。而面对泛滥的JavaScript在线学习资源,却是很难找到一份高效而实用的方法去学习这个“web时代的语言”。有一点需要注意,几年前我们需要知道一个真正的服务器端语言(比如PHP,Rails,Java,Python 或…

Shiro-550反序列化漏洞复现

0x01 漏洞简介Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。 Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可…

IIS-ShortName-Scanner使用

000 漏洞简介 Microsoft IIS在实现上存在文件枚举漏洞,攻击者可利用此漏洞枚举网络服务器根目录中的文件。 危害:攻击者可以利用“~”字符猜解或遍历服务器中的文件名,或对IIS服务器中的.Net Framework进行拒绝服务攻击。 001 工具简介 J…

我的世界中国版服务器地图文件在哪,我的世界中国版手机版联机的地图保存在哪 | 手游网游页游攻略大全...

发布时间:2017-05-12我的世界战舰设计图 手机版战舰怎么做.那下面给大家分享的是玩家自己在手机版中手撸的一个战舰建筑哦~那感兴趣的玩家不妨进来看看他是怎么建造战舰的哦~希望大家喜欢. 游戏园我的世界官方群:325049520 二群:25607 ...标签:我的世界 …

kali NETCAT NC的使用

文章目录 nc的常用选项NC具有的常用功能telnet / 获取banner信息传输文本信息传输文件/目录加密传文件端口扫描远程克隆硬盘远程控制NCAT TCPDUMP简单用法 nc的常用选项 -l 开启监听模式,用于入站链接 -p 开放本地端口 -n 远程连接,后面要跟上端口 -v …

如何循序渐进的学习javaScript呢,请听我慢慢道来!

大家可以参考知乎上的这篇文章,我觉得还不错,分享给你们 https://www.zhihu.com/question/19713563

win10修改服务器地址,win10 修改服务器地址

win10 修改服务器地址 内容精选换一换通过华为云创建的ECS服务器默认使用华为云提供的内网DNS进行解析。内网DNS不影响ECS服务器对公网域名的访问。同时,还可以不经Internet,直接通过内网DNS访问其他云上服务内部地址,如OBS、SMN等&#xff0…

centos8如何安装yum源(详细步骤)

进入目录 cd /etc/yum.repos.d //进入/etc/yum.repos.d目录查看并删除/etc/yum.repos.d目录下所有的配置文件 ll //查看当前目录的所有文件 rm -rf ./* //删除当前的所有文件下载centos8的镜像源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors…

2048游戏详解

由于最近在百度IFE看到有2048任务,所以昨天兴趣一来自己也做了一个。大概花了五个小时完成,不过不足之处是操作时没有滑动效果。昨晚新增了手机版本,流畅度还可以,不过由于没有滑动,游戏过程显得很突兀啊,且…

vulhub安装教程

0x00 vulhub介绍 Vulhub是一个基于docker和docker-compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。 大哥你等会,你刚才讲的docker我听…

sublime主题安装

网上发现与之前最相近的两款皮肤分别是Theme – Soda与Flatland。这里就记录一下安装与使用方法。 方法一:手动下载安装: 1.下载安装SublimeText2,这个我就不说了。网上的版本有多个,可以自行选择。也可下载使用最新的SublimeText…